Bicycle/System/Classes/Core.php
Egor Isaev b65603b4d0 dev
2026-06-23 10:44:18 +03:00

139 lines
4.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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");
}
}