139 lines
4.4 KiB
PHP
139 lines
4.4 KiB
PHP
<?php
|
||
/**
|
||
* @package Bicycle
|
||
* @author Egor Isaev
|
||
* @description Core.php
|
||
* @copyright (c) 03/06/2026
|
||
*/
|
||
|
||
namespace System\Classes;
|
||
|
||
use ErrorException;
|
||
|
||
/**
|
||
* Ядро фреймворка: bootstrap, регистрация обработчиков ошибок/исключений
|
||
* и поиск файлов по путям APPPATH → SYSPATH.
|
||
*/
|
||
class Core
|
||
{
|
||
/** @var int Боевая среда */
|
||
public const PRODUCTION = 10;
|
||
/** @var int Промежуточная (staging) среда */
|
||
public const STAGING = 20;
|
||
/** @var int Тестовая среда */
|
||
public const TESTING = 30;
|
||
/** @var int Среда разработки */
|
||
public const DEVELOPMENT = 40;
|
||
|
||
/**
|
||
* @var int Текущая среда системы по умолчанию
|
||
*/
|
||
public static int $environment = self::DEVELOPMENT;
|
||
|
||
/**
|
||
* @var string Кодировка на ввод и вывод
|
||
*/
|
||
public static string $charset = 'utf-8';
|
||
|
||
/**
|
||
* @var bool Начальное значение был ли создан [Core::init]?
|
||
*/
|
||
protected static bool $_init = false;
|
||
|
||
/**
|
||
* @var array Список базовых путей для поиска файлов (APPPATH, SYSPATH)
|
||
*/
|
||
protected static array $_paths = [];
|
||
|
||
/**
|
||
* Инициализирует ядро: регистрирует обработчики исключений и ошибок.
|
||
* Повторный вызов игнорируется.
|
||
*
|
||
* @return void
|
||
*/
|
||
public static function init(): void
|
||
{
|
||
if (self::$_init) {
|
||
return;
|
||
}
|
||
|
||
self::$_init = true;
|
||
|
||
set_exception_handler([MyException::class, 'handler']);
|
||
|
||
set_error_handler([__CLASS__, 'errorHandler']);
|
||
}
|
||
|
||
/**
|
||
* Ищет файл в APPPATH, затем в SYSPATH.
|
||
*
|
||
* @param string $folder Подкаталог относительно базового пути
|
||
* @param string $file Имя файла без расширения
|
||
* @param string|null $ext Расширение без точки; null → EXT, '' → без расширения
|
||
* @return bool|string Полный путь к файлу или false, если не найден
|
||
*/
|
||
public static function findFile($folder, $file, $ext = null): bool|string
|
||
{
|
||
if (empty(self::$_paths)) {
|
||
self::$_paths = [APPPATH, SYSPATH];
|
||
}
|
||
|
||
if ($ext === null) {
|
||
// Используйте расширение по умолчанию
|
||
$ext = EXT;
|
||
} elseif ($ext) {
|
||
// Префикс расширения с точкой
|
||
$ext = ".$ext";
|
||
} else {
|
||
// Не использовать расширение
|
||
$ext = '';
|
||
}
|
||
|
||
$path_file = $folder . '/' . $file . $ext;
|
||
|
||
$found = false;
|
||
|
||
foreach (self::$_paths as $dir) {
|
||
if (is_file($dir . '/' . $path_file)) {
|
||
$found = $dir . '/' . $path_file;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return $found;
|
||
}
|
||
|
||
/**
|
||
* Обработчик ошибок PHP: преобразует ошибку в ErrorException.
|
||
*
|
||
* @param int $code Уровень ошибки
|
||
* @param string $error Текст ошибки
|
||
* @param string|null $file Файл, где произошла ошибка
|
||
* @param int|null $line Строка, где произошла ошибка
|
||
* @return bool
|
||
* @throws ErrorException
|
||
*/
|
||
public static function errorHandler($code, $error, $file = null, $line = null): bool
|
||
{
|
||
if (error_reporting() & $code) {
|
||
// Эта ошибка не подавляется текущими настройками отчетов об ошибках
|
||
// Преобразование ошибки в ErrorException
|
||
throw new ErrorException($error, $code, 0, $file, $line);
|
||
}
|
||
|
||
// Продолжаем работать в штатном режиме
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Возвращает значение константы класса по её имени.
|
||
*
|
||
* @param string $name Имя константы (например, 'PRODUCTION')
|
||
* @return mixed
|
||
*/
|
||
public static function getConst(string $name): mixed
|
||
{
|
||
return constant("self::$name");
|
||
}
|
||
}
|