Автозагрузка

firep91613

Новичок
Не могу найти нигде, как работает spl_autoload_register без аргументов? Судя по примерам из книги, нэймспейсы должны соответствовать названиям папок и файлов. Правильно ли я понимаю?
PHP:
namespace Factory\Models
class Collection extends \Factory\Router
Физическое расположение - /factory/models/collection.php
 

firep91613

Новичок
@ksnk, не, там только spl_autoload_register.

Этот файл находится в папке patters.
PHP:
spl_autoload_register();

use Factory\Router;

$obj = Router::parse('users');
echo $obj->render();
В папке factory находится файл router.php и папка models. В папке models - collection.php, page.php, pages.php, user.php, users.php.
 

ksnk

прохожий
И в чем проблема то ? Вот структура каталогов теста
1642
test.php
PHP:
<?php
spl_autoload_register();

use Factory\Router,
    Factory\Models\Collection;

$obj = new Router();//Router::parse('users');
echo $obj->render();
$collection= new Collection();
echo $collection->callsomething(1);
factory/router.php

PHP:
<?php

namespace Factory;

class Router {
    function __call (string $name, array $arguments){
        return " ama ".__CLASS__.'::'.$name."\n";
    }
}
factory/models/collection.php
PHP:
<?php
namespace Factory\Models;
class Collection extends \Factory\Router {
    function __call (string $name, array $arguments){
        return " ama ".__CLASS__.'::'.$name."\n";
    }
}
вот что выдает запущенный в консоли скрипт
Код:
1# php test.php
 ama Factory\Router::render
 ama Factory\Models\Collection::callsomething
 

AmdY

Пью пиво
Команда форума
Ну так надо сходить в доку и прочитать про spl_autoload_register
там написано, но
Функцию __autoload() требуется зарегистрировать в очереди __autoload явным образом, если эту функцию объявили в коде
Получается что вы каким-то фреймворком пользуетесь, где эта функция определена и это она такую магию делает.p
А если передете и прочитаете про функцию, https://www.php.net/manual/ru/function.autoload.php, то узнате что она уже давно депрекетид и вырезана из свежего php, пользоваться ей не рекомендуется
 

firep91613

Новичок
PHP вызывает функцию spl_autoload если spl_autoload_register была вызвана без аргументов.

spl_autoload:
class - имя класса (и пространства имён), которое требуется загрузить.
file_extensions - по умолчанию функция проверяет пути директивы include_path на наличие имён файлов, которые состоят из имени класса в нижнем регистре и расширения .inc или .php.

Ну вообщем, как и предполагал.
 

AnrDaemon

Продвинутый новичок
А зачем полагаться на неявное поведение, если можно этого не делать?
 

ksnk

прохожий
Так, на всякий случай, мы сейчас живем в эпоху победившего композера, так что с точки зрения практического использования spl_register... - не нужны, так как в явном виде никто их не пишет и не использует. Тем более, что функционал spl_autoload писался авторами php еще для 5.1.0, до фиксации PSR-0, не говоря об остальных соглашениях, так что использование именно этого функционала скорее всего разрушит стандартную на текущий момент механику поиска файлов. В общем - для учебной задачи - почему бы и нет, а вот для более менее практичного проекта - однозначно нет.
 
Сверху