PHP __autoload () с пространством имен

spl_autoload_register('Think\Think::autoload'); 

В пространстве имен Think \ я создал указанную выше регистрационную функцию, когда я пытаюсь использовать класс, который не был включен как класс Storeage, php будет чересчур пропускать Storeage в качестве переменной для функции Think \ Think :: autoload, но она фактически передала Think \ Храните как переменную, почему она добавляет дополнительный Think \ к автозагрузке, а не только к Storeage?

Означает ли это, что autoload будет искать только классы, объявленные в том же пространстве имен, где создана функция автозагрузки?

Функции Autoload обычно работают, включая файлы для вас по требованию. Так, например, у меня есть класс Spell в пространстве имен Write и он находится в write/spell.php . Поэтому я сообщаю функции автозагрузки, как найти файл (в этом случае мои каталоги отражают мое пространство имен).

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

Теперь, вот предостережение с тем, как вы это делаете. Функция автозагрузки уже находится в пространстве имен. Это означает, что вам придется вручную включить файл, содержащий этот класс, или ваша автозагрузка не удастся.

Вот вам пример.

loader.php

 namespace bigpaulie\loader; class Loader { /** * DIRECTORY_SEPARATOR constatnt is predefined in PHP * and it's different for each OS * Windows : \ * Linux : / */ public static function load($namespace){ $filename = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . ".php"; if(file_exists($filename)){ require_once $filename; }else{ throw new \Exception("Error Processing Request", 1); } } } 

index.php

 require_once 'path/to/loader.php'; spl_autoload_register(__NAMESPACE__ . 'bigpaulie\loader\Loader::load'); $class1 = new \demos\Class1(); // or use bigpaulie\core\Class2; $class2 = new Class2(); 

как вы можете видеть, мы можем использовать любое пространство имен, которое нам нужно, чтобы убедиться, что существует путь к файлу класса.

Надеюсь это поможет!

С наилучшими пожеланиями, Пол.