/*
GSOutput.php
Организация вывода текста (браузер, консоль, лог-файл)
Версия 1.1.0.0 от 04.11.2022
*/
// Класс COutput
// ====================================================================================================
class COutput
/*
Полностью статический класс, предназначенный для хранения параметров текущего устройства вывода
(окна браузера и консоли - в зависимости от того, где был запущен PHP-скрипт, использующий этот класс).
*/
{
static public string $sEncoding;
static public bool $bIsConsole;
static public bool $bIsPrecise;
static public string $sEOL;
static private bool $bInitialized = false;
static public function Begin($_bPrecise = true)
/*
Инициализирует класс.
ПАРАМЕТРЫ
$_bPrecise
Нужно ли заключать текст, выводимый в браузере, в теги <pre> и </pre>.
*/
{
global $argc, $argv;
if (self::$bInitialized) return false;
self::$sEncoding = '';
self::$bIsPrecise = $_bPrecise;
if (isset($argc)) {
if ($argc) parse_str(implode('&', array_slice($argv, 1)), $_GET);
self::$bIsConsole = true;
self::$sEOL = PHP_EOL;
if (PHP_OS === 'WINNT' && php_uname('r') === '6.1') {
// В Windows 7 для корректного вывода русского текста консоль должна быть в кодировке ANSI,
// а все выводимые строки - в кодировке OEM.
exec('chcp 1251');
self::$sEncoding = 'cp866';
}
}
else {
self::$bIsConsole = false;
if ($_bPrecise) echo '<pre>';
self::$sEOL = '<br>';
}
self::$bInitialized = true;
return true;
} // static public function Begin(...)
static public function End()
/*
Финализирует класс.
*/
{
if (!self::$bInitialized) return false;
if (self::$bIsPrecise) echo '</pre>';
return true;
}
} // class COutput
// Класс CConsole
// ====================================================================================================
const iCON__OPTION__USE_LOG = 1; // Дублировать вывод в лог-файл.
const iCON__TS_MODE__SCREEN = 1; // Отображать временной штамп на экране (в браузере и консоли).
const iCON__TS_MODE__LOG = 2; // Отображать временной штамп в лог-файле.
class CConsole
/*
Выводит текст в следующие устройства вывода:
- окно браузера (если PHP-скрипт был запущен в браузере);
- консоль вывода (если PHP-скрипт был запущен из командной строки);
- лог-файл (если пользователь включил режим дублирования в файл).
ПРИМЕР ИСПОЛЬЗОВАНИЯ
$oCon = new CConsole();
$oCon->UseLog(1, 'Logs' . DIRECTORY_SEPARATOR . date('Y-m-d H-i-s') . '.txt');
$oCon->ShowTimeStamp(2);
$oCon->PutLn('Приветствую Вас, ', $sUserName, '!');
$oCon->PutLn();
*/
{
private int $iOptions = 0;
private int $iIndent = 0;
private int $iTSMode = 0;
private string $sTSFormat = '';
private $rLog = null;
public function __destruct()
{
if ($this->rLog) fclose($this->rLog);
}
public function UseLog($_bUse, string $_sPathName = '', $_bCreateDir = false)
/*
Включает/выключает дублирование вывода в лог-файл.
ПАРАМЕТРЫ
$_bCreateDir
Создать каталог, указанный в имени $_sPathName, если его не существует.
*/
{
if ($this->rLog) fclose($this->rLog);
if ($_bUse) {
$sDirName = dirname($_sPathName);
if (!is_dir($sDirName) && $_bCreateDir) mkdir($sDirName, 0777, true);
$this->rLog = fopen($_sPathName, 'a');
$this->iOptions |= iCON__OPTION__USE_LOG;
}
else {
$this->rLog = null;
$this->iOptions &= ~iCON__OPTION__USE_LOG;
}
}
public function ShowTimeStamp(int $_iMode, string $_sFormat = '[d.m.Y H:i:s] ')
/*
Включает/выключает отображение временного штампа перед каждым выводимым сообщением.
ПАРАМЕТРЫ
$_iMode
Произвольное сочетание битовых флагов iCON__TS_MODE__*.
$_sFormat
Формат временного штампа, соответствующий правилам PHP-функции date.
*/
{
$this->iTSMode = $_iMode;
$this->sTSFormat = $_sFormat;
}
public function SetIndent(int $_iIndent, int $_iMode = 0)
/*
Устанавливает текущую величину отступа.
(1 отступ = 2 пробелам.)
ПАРАМЕТРЫ
$_iMode
-1 - уменьшает отступ на $_iIndent;
0 - устанавливает отступ = $_iIndent;
1 - увеличивает отступ на $_iIndent.
*/
{
switch ($_iMode) {
case 0:
$this->iIndent = $_iIndent;
break;
case 1:
$this->iIndent += $_iIndent;
break;
case -1:
$this->iIndent -= $_iIndent;
}
if ($this->iIndent < 0) $this->iIndent = 0;
return $this->iIndent;
}
public function Put()
/*
Выводит данные в устройства вывода (окно браузера, консоль, лог-файл).
Разделитель строк после данных не записывает.
ПАРАМЕТРЫ
Функция работает с любым количеством параметров.
*/
{
$iTotalArgs = func_num_args();
for ($i = 0; $i < $iTotalArgs; $i++) {
$xArg = func_get_arg($i);
if ($this->iTSMode & iCON__TS_MODE__SCREEN)
echo date($this->sTSFormat);
if ($this->iIndent) {
$sIndent = str_repeat(' ', $this->iIndent);
echo $sIndent;
}
if (COutput::$sEncoding)
echo mb_convert_encoding($xArg, COutput::$sEncoding);
else
echo $xArg;
if ($this->iOptions & iCON__OPTION__USE_LOG) {
if ($this->iTSMode & iCON__TS_MODE__LOG)
fwrite($this->rLog, date($this->sTSFormat));
if ($this->iIndent) fwrite($this->rLog, $sIndent);
fwrite($this->rLog, $xArg);
}
}
} // public function Put()
public function PutLn()
/*
Выводит данные в устройства вывода (окно браузера, консоль, лог-файл).
После данных записывает разделитель строк (COutput::$sEOL).
ПАРАМЕТРЫ
Функция работает с любым количеством параметров.
*/
{
$iTotalArgs = func_num_args();
for ($i = 0; $i < $iTotalArgs; $i++) {
$xArg = func_get_arg($i);
if ($this->iTSMode & iCON__TS_MODE__SCREEN)
echo date($this->sTSFormat);
if ($this->iIndent) {
$sIndent = str_repeat(' ', $this->iIndent);
echo $sIndent;
}
if (COutput::$sEncoding)
echo mb_convert_encoding($xArg, COutput::$sEncoding);
else
echo $xArg;
if ($this->iOptions & iCON__OPTION__USE_LOG) {
if ($this->iTSMode & iCON__TS_MODE__LOG)
fwrite($this->rLog, date($this->sTSFormat));
if ($this->iIndent) fwrite($this->rLog, $sIndent);
fwrite($this->rLog, $xArg);
}
}
echo COutput::$sEOL;
if ($this->iOptions & iCON__OPTION__USE_LOG)
fwrite($this->rLog, PHP_EOL);
} // public function PutLn()
} // class CConsole
/*
Тестирование модуля GSOutput.
*/
require_once 'GSOutput.php';
COutput::Begin();
$oCon = new CConsole();
$oCon->UseLog(1, 'Logs' . DIRECTORY_SEPARATOR . date('Y-m-d H-i-s') . '.txt');
$oCon->Put(php_sapi_name(), '|');
$oCon->Put('Раз Миссисипи', '|');
$oCon->Put('Два Миссисипи', '|');
$oCon->Put('Три Миссисипи');
$oCon->PutLn();
$oCon->PutLn();
$oCon->ShowTimeStamp(3);
$oCon->PutLn(php_sapi_name());
$oCon->PutLn('Раз Миссисипи');
$oCon->SetIndent(1, 1);
$oCon->PutLn('Два Миссисипи');
$oCon->SetIndent(1, 1);
$oCon->PutLn('Три Миссисипи');
$oCon->SetIndent(0);
$oCon->PutLn('Расчёт окончен.');
COutput::End();