Я давно работаю с PHP, но сейчас начинаю экспериментировать с новыми языковыми функциями, такими как пространства имен. У меня есть вопрос относительно автозагрузки, на который я не смог найти адекватного ответа в своем поиске в сети.
Предположим, у меня есть классы в разных пространствах имен:
namespace foo\bar\baz;
class Quux
{
}
namespace fred\barney\wilma;
class Betty
{
}
Тогда предположим, что у меня был автозагрузчик, который предполагает, что между пространствами имен и структурами каталогов есть соотношение 1: 1:
function autoload ($className)
{
$className = str_replace ('\\', DIRECTORY_SEPERATOR, $className);
include ($className . 'php');
}
spl_autoload_register ('autoload');
Передается ли полностью определенное пространство имен автозагрузчику при любых обстоятельствах, или автозагрузчик должен учитывать пространство имен, используемое в настоящее время?
Например, если я сделаю следующее:
$a = new \foo\bar\baz\Quux;
$b = new \fred\barney\wilma\Betty;
автозагрузчик должен работать нормально.
Но что, если я сделаю следующее?
use \foo\bar\baz as FBB;
$a = new Quux;
$b = new \fred\barney\wilma\Betty;
При попытке создания нового Quux автозагрузчик все равно получит \foo\bar\baz\Quux
в качестве аргумента имени класса? Или он должен получить FBB\Quux
, или даже просто Quux
?
Если последнее, могу ли я определить пространство имен, в котором должен находиться класс, из моего автозагрузчика, используя __NAMESPACE__
или какой-либо другой такой механизм?