Разбираем фрагменты кода по шагам и проанализируем логику, синтаксис и особенности фреймворка Cotonti.
Файл /system/functions.php
Фрагмент начала документа
/**
* Main function library.
*
* @package API - Functions
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
use cot\extensions\ExtensionsDictionary;
use cot\extensions\ExtensionsService;
use cot\users\UsersHelper;
use cot\users\UsersRepository;
defined('COT_CODE') or die('Wrong URL');
// System requirements check
if (!defined('COT_INSTALL')) {
if (
!function_exists('version_compare') ||
!version_compare(PHP_VERSION, '7.3', '>=')
) {
die('Cotonti system requirements: PHP 7.3 or above.'); // @todo: Need translate
}
if (!extension_loaded('mbstring')) {
die('Cotonti system requirements: mbstring PHP extension must be loaded.'); // @todo: Need translate
}
}
// Group constants
const COT_GROUP_DEFAULT = 0;
const COT_GROUP_GUESTS = 1;
const COT_GROUP_INACTIVE = 2;
const COT_GROUP_BANNED = 3;
const COT_GROUP_MEMBERS = 4;
const COT_GROUP_SUPERADMINS = 5;
const COT_GROUP_MODERATORS = 6;
/* ======== Pre-sets ========= */
$out = [
'basehref' => '',
'contentType' => '',
'desc' => '', // Meta description
'head' => '',
'keywords' => '', // Meta keywords
'canonical_uri' => '',
'subtitle' => '',
];
$sys = [
'abs_url' => null,
'baseDir' => null,
'displayHeader' => true,
'displayFooter' => true,
'domain' => null,
'host' => null,
'now' => null,
'parser' => null,
'port' => null,
'query' => null, // Request query after the question mark '?'
'scheme' => null,
'secure' => null,
'site_id' => null,
'site_uri' => null,
'sublocation' => null, // @todo move to $env?
'uri' => null, // Request URI relative to $sys['abs_url']
'uri_curr' => null,
'uri_redir' => null,
'url_redirect' => null,
'xk' => null,
];
$usr = [];
$env = [
'ext' => null, // extension code
'location' => null,
'last_modified' => 0,
'status' => null, // response status. 200 OK
'type' => null, // extension type
];
$L = [];
$R = [];
$i = explode(' ', microtime());
$sys['starttime'] = $i[1] + $i[0];
$cfg['version'] = '0.9.26 beta';
// Set default file permissions if not present in config
if (!isset($cfg['file_perms'])) {
$cfg['file_perms'] = 0664;
}
if (!isset($cfg['dir_perms'])) {
$cfg['dir_perms'] = 0775;
}
Этот фрагмент кода — это часть инициализации фреймворка Cotonti.
Он включает проверку системных требований, настройку глобальных переменных, установку дефолтных значений для прав доступа, а также сбор данных о текущем времени и версии фреймворка.
1. Проверка установки фреймворка:
defined('COT_CODE') or die('Wrong URL');
Это стандартная проверка на безопасность: если константа COT_CODE не определена, скрипт завершает выполнение. Таким образом, фреймворк удостоверяется, что код был вызван правильно, а не напрямую. Это может быть сделано для предотвращения прямого вызова скриптов фреймворка, который может быть уязвимым.
2. Проверка системных требований:
if (!defined('COT_INSTALL')) {
if (
!function_exists('version_compare') ||
!version_compare(PHP_VERSION, '7.3', '>=')
) {
die('Cotonti system requirements: PHP 7.3 or above.');
}
if (!extension_loaded('mbstring')) {
die('Cotonti system requirements: mbstring PHP extension must be loaded.');
}
}
Этот код проверяет, выполнены ли минимальные требования для работы фреймворка:
PHP 7.3 или выше.
Расширение mbstring должно быть загружено, так как оно используется для работы с многобайтовыми строками (например, для поддержки UTF-8).
Если эти условия не выполняются, выполнение останавливается с соответствующим сообщением.
3. Определение констант групп пользователей:
const COT_GROUP_DEFAULT = 0;
const COT_GROUP_GUESTS = 1;
const COT_GROUP_INACTIVE = 2;
const COT_GROUP_BANNED = 3;
const COT_GROUP_MEMBERS = 4;
const COT_GROUP_SUPERADMINS = 5;
const COT_GROUP_MODERATORS = 6;
Это определение констант для групп пользователей в системе. Каждой группе присваивается числовое значение.
Гости (COT_GROUP_GUESTS) — пользователи, не зарегистрированные или не вошедшие в систему.
Неактивные (COT_GROUP_INACTIVE) — пользователи, чьи аккаунты деактивированы.
Заблокированные (COT_GROUP_BANNED) — пользователи, заблокированные в системе.
Члены (COT_GROUP_MEMBERS) — зарегистрированные пользователи.
Суперадмины (COT_GROUP_SUPERADMINS) — администраторы системы.
Модераторы (COT_GROUP_MODERATORS) — пользователи с правами модератора.
4. Предустановленные массивы:
$out = [
'basehref' => '',
'contentType' => '',
'desc' => '', // Meta description
'head' => '',
'keywords' => '', // Meta keywords
'canonical_uri' => '',
'subtitle' => '',
];
Массив $out используется для хранения различных значений, связанных с выводом данных на страницу. Это могут быть мета-теги, ссылки на ресурсы, заголовки и другие данные, которые используются для формирования контента страницы.
$sys = [
'abs_url' => null,
'baseDir' => null,
'displayHeader' => true,
'displayFooter' => true,
'domain' => null,
'host' => null,
'now' => null,
'parser' => null,
'port' => null,
'query' => null, // Request query after the question mark '?'
'scheme' => null,
'secure' => null,
'site_id' => null,
'site_uri' => null,
'sublocation' => null, // @todo move to $env?
'uri' => null, // Request URI relative to $sys['abs_url']
'uri_curr' => null,
'uri_redir' => null,
'url_redirect' => null,
'xk' => null,
];
Массив $sys используется для хранения системных переменных, таких как:
URL сайта (abs_url, domain, scheme, secure).
Параметры запроса и текущий URI (query, uri, uri_curr).
Флаги, отвечающие за отображение элементов страницы, например, заголовка и футера (displayHeader, displayFooter).
Переменная now используется для текущего времени.
$usr = [];
Массив $usr предназначен для хранения информации о текущем пользователе. Он может содержать данные, такие как ID пользователя, его имя, права доступа и другие характеристики.
$env = [
'ext' => null, // extension code
'location' => null,
'last_modified' => 0,
'status' => null, // response status. 200 OK
'type' => null, // extension type
];
Массив $env используется для хранения информации о текущем расширении (если оно используется), его типе и состоянии (например, HTTP статус ответа).
$L = [];
$R = [];
Массивы $L и $R — это массивы для хранения локализации и ресурсов.
Например,
$L - строки на разных языках, а
$R - это ресурсные данные (например, изображения или файлы).
5. Получение текущего времени:
$i = explode(' ', microtime());
$sys['starttime'] = $i[1] + $i[0];
Здесь используется функция microtime(), которая возвращает текущее время с точностью до микросекунд. Время разбивается на две части (секунды и микросекунды), и они суммируются для получения точного времени запуска приложения.
6. Установка версии фреймворка:
$cfg['version'] = '0.9.xx beta';
Устанавливается версия фреймворка. Это значение используется для отслеживания версии, на которой работает сайт.
7. Права доступа по умолчанию:
if (!isset($cfg['file_perms'])) {
$cfg['file_perms'] = 0664;
}
if (!isset($cfg['dir_perms'])) {
$cfg['dir_perms'] = 0775;
}
Здесь проверяется, если в конфигурации фреймворка не заданы права доступа для файлов и каталогов, то они устанавливаются по умолчанию:
Для файлов — 0664.
Для каталогов — 0775.
Особенности синтаксиса и логики
Использование глобальных массивов:
Во фреймворке Cotonti много глобальных массивов ($cfg, $sys, $usr, $env, $out, $L и т. д.), которые хранят важную информацию, связанную с системой, пользователями, конфигурацией и выводом. Это типично для фреймворков, где глобальные данные доступны в любой точке приложения.
Проверки на ошибки и условия: В коде есть несколько проверок на системные требования, что повышает устойчивость системы.
Масштабируемость и расширяемость: Присутствуют массивы для настроек и расширений, которые можно легко изменить или дополнить при необходимости.