Всем привет! Не нашел информации в интернете задам здесь. Есть код: PHP: function autoloadModel($className) { $filename = "models/" . $className . ".php"; if (is_readable($filename)) { require $filename; } } function autoloadController($className) { $filename = "controllers/" . $className . ".php"; if (is_readable($filename)) { require $filename; } } spl_autoload_register("autoloadModel"); spl_autoload_register("autoloadController"); Вопрос: На сколько корректный данный код? Можно ли по правилам (PSR-0, PSR-4 и т.д.) использовать такую автозагрузку? Спасибо!
https://github.com/MouseZver/Lerma/blob/master/autoload.php --- Добавлено --- Mouse\Model\Responce::class Mouse\Controllers\Responce::class
есть второй способ , реестром. PHP: <?php final class Aero { protected static $maps = [ 'Karma' => 'core\Karma', 'Component' => 'classes\Component', 'House' => 'model\House', ]; public function autoload( string $name ) { include strtr ( self::$maps[$name] ?? $name, [ '\\' => DIRECTORY_SEPARATOR ] ) . '.php'; } } spl_autoload_register ( [ Aero::class, 'autoload' ] );
@webog, PSR-0 и PSR-4 придуманы для того, чтобы организовать много пространств имён, и чтоб можно было найти любой класс, подставив вместо пространств имён папки, а вместо имени класса - имя файла. То,что ты написал, к PSR никакого отношения не имеет. --- Добавлено --- Но PSR - это не правила, это набор рекомендаций, которым можно и не следовать.
Относится к этой теме, задам тут вопрос: Что бы загрузилась страница, нужно выполнить ф-ю loadPage и в нее передать $twig. Все работает! работало до того момента как добавились @бучи@ наймспейсы. Работало вот так: PHP: $cn = $this->controllerName.'_Controller'; $controller = new $cn; $action = $this->actionName.'Action'; if(method_exists($controller, $action)) { $controller->$action($twig); } Все, метод (ф-я) запущена, страница загружена. НО! С namespace нужно запускать вот так: PHP: $controller = new application\controllers\News_Controller(); НО! Так будут только новости везде. Вопрос: Как сделать автоматическое подставление вызваного контроллера? Так не получилось: PHP: $cn = $this->controllerName.'_Controller'; $ass = 'application\controllers'; $controller = new $ass.'\\'.$cn; Может есть способ иначе вызвать indexAction в файле контроллера который сейчас подключен/загружен/вызван?
Без неймспейсов ты либо будешь дописывать "неймспейс" в имя класса, чтобы он ни с чем не пересекался, либо словишь гарблей. Вариант с дописыванием имени тоже работает, в общем-то. И до изобретения неймспейсов был прям манной небесной. Но неймспейсы гибче.
@webog, раз уже ты сам заговорил о PSR-ах, почему бы тебе их не использовать? И любой PSR-совместимый автозагрузчик. И composer взять хотя бы просто для автозагрузки - там можно очень гибко настраивать его стандартный автозагрузчик
Все это хорошо, но наймспейсы пройдены и сделаны. Речь шла о создании объекта и вызова его метода автоматически. Зависит от выбранного (что в браузере открыто) контроллера.