2013-04-17 3 views
0

Я построил новый объект в моем файле без пространств имен:Namespaces - __autoload() требует, неправильный класс

new My\Validator(); 

Выше, в том же файле я получил __autoload():

function __autoload($className) 
{ 
    var_dump($className); 
} 

__autoload() функция печатает

'My\My\Validator'. 

Где находится двойная 'My' из?

+0

Вы должны объявить свою автозагрузку в глобальном пространстве – Federkun

+0

Из-за пространства имен «Мой»? –

+0

Вы вызываете 'new My \ Validator();' из глобального пространства имен или пространства имен 'My'? Возможно, вы захотите также просмотреть функцию 'spl_autoload_register' - она ​​более гибкая, чем функция' __autoload', так как позволяет регистрировать несколько автозагрузчиков. – GarethL

ответ

1

Он добавляет пространство имен My, потому что вы, вероятно, находитесь в пространстве имен My уже при создании объекта с помощью new My\Validator().

namespace My; 
$obj = new My\Validator(); 

будет переведен на:

$obj = new My\My\Validator(); 

Поскольку вы внутри My имен уже вы можете:

  • либо просто позвоните new Validator()
  • или позвоните new \My\Validator()

Начало \ скажет PHP, чтобы посмотреть в глобальное пространство имен.


На стороне записки, это considere хорошая практика, чтобы использовать spl_autoload_register вместо __autoload, потому что вы можете установить несколько автозагрузчика обратных вызовов.

Смежные вопросы