НОВИНКА!
Занимательная математика от Трепачёва. Присоединяйтесь к нам!
⊗ppOpNsCA 107 of 107 menu

Своя функция для автозагрузки классов в ООП в PHP

Часто автозагрузка по умолчанию может вас не устраивать по каким-нибудь причинам. В таком случае можно написать свою автозагрузку.

Для этого в функцию spl_autoload_register нужно первым параметром передать написанную вами функцию-коллбэк. Эта функция будет вызываться, когда PHP будет обнаруживать обращение к незагруженному классу. В параметр этой функции будет попадать имя класса с пространством имен:

<?php spl_autoload_register(function($class) { // в переменной $class будет имя класса с пространством имен }); ?>

А обязанностью функции будет по имени класса выполнить загрузку этого класса через require. To есть внутри этой функции мы должны прописать свое правило для загрузки классов, то есть свое соглашение имен.

Давайте напишем пример какой-нибудь своей автозагрузки. Пусть, например, мы говорим, что путь к файлу класса от корня сайта будет такой же, как и пространство имен, но с сохранением регистра символов.

To есть, если у нас есть класс Core\Admin\PageController, то путь к нему должен быть Core/Admin/PageController.php.

Как вы видите, для преобразования имени класса с его пространством нужно просто поменять обратные слеши на прямые, а к имени класса добавить .php. Сделаем это:

<?php spl_autoload_register(function($class) { $filename = str_replace('\\', '/', $class) . '.php'; require($filename); }); ?>

У нас, однако, получится относительный путь к файлу (относительно корня сайта). Лучше сделать абсолютный путь, вот так:

<?php spl_autoload_register(function($class) { $root = $_SERVER['DOCUMENT_ROOT']; $filename = $root . '/' . str_replace('\\', '/', $class) . '.php'; require($filename); }); ?>

Есть еще нюанс. В разных операционных системах путь по папкам может быть с прямым слешем или с обратным. Сделаем наш код независимым от операционной системы. Для этого вместо прямого слеша для разделения путей будем ставить константу DIRECTORY_SEPARATOR, содержащую правильный слеш той операционной системы, в который сейчас запускается наш скрипт. В итоге получим следующий код:

<?php spl_autoload_register(function($class) { $root = $_SERVER['DOCUMENT_ROOT']; $ds = DIRECTORY_SEPARATOR; $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php'; require($filename); }); ?>

Потестируйте созданную мною функцию автозагрузки.

Придумайте свое правило автозагрузки и реализуйте его.

Русский
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить