Php, автозагрузка синглетонов - PullRequest
2 голосов
/ 31 декабря 2010

Я сделал стандартный автозагрузчик для своих классов, используя spl_autoload_register.Но у меня есть проблема.spl_autoload_register заставляет работать только когда мы создаем экземпляр класса с помощью оператора new.Итак, когда у меня есть: $singleton = Name\Singleton::get_instance() в коде, автозагрузчик не работает, и я должен включить этот файл вручную.Как я могу решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 31 декабря 2010

Независимо от того, создаете ли вы объект или получаете доступ к статическому классу, они будут загружены.

ваш пример будет работать с файлом, так как класс загружается до оператора разрешения ::, поэтому он находится в области действия.

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

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

и

http://gist.github.com/221634

Поскольку в предложении о пространстве имен указано, что каждое корневое пространство имен должно быть поставщиком \<Vendor Name>\(<Namespace>\)*<Class Name>, вы бы сделали следующее (с версией GitHub):

   $App = new SplClassLoader('MyApp', '/myapp');
   $App->register();

Обновление, чтобы помочь вам снемного больше пространства имен.

Возьмем этот пример

namespace MyApp\Classes;

class SomeClass
{
    public function __construct()
    {
        $Doctrine = Doctrine\Common\EntityManager::Singleton();
    }
}

Вызов Doctrine будет искать в пространстве имен MyApp\Classes\Doctrine\Common для класса EntityManager.

Что вы должны дедобавив к нему \ в качестве пространства имен вне доктрины, вы всегда должны указывать \, чтобы сказать, что его нет в текущем пространстве имен.

В вашем посте это может быть причиной того, что он не работаетИнж.

3 голосов
/ 31 декабря 2010

Это не должно иметь место, классы автоматически загружаются всякий раз, когда они необходимы.Постарайтесь убедиться, что ваше пространство имен / имя класса правильно, если вы используете пространства имен.Вы также можете сделать var_dump(class_exists('Name\Singleton'));, чтобы проверить, существует ли класс или нет, это наверняка будет использовать автозагрузчик.

1 голос
/ 30 апреля 2011

На самом деле namspace немного запутались.

Если у вас есть синглтон, вы, вероятно, делаете что-то вроде этого:

self :: $ _ instance = new self ();

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

edit: На самом деле я ошибся в этом ответе, я действительно использовал stdClass в конструкторе, поэтому мне пришлось импортировать его из глобального пространства с помощью функции use, фактически я использовал приведение (объекта) в любом случае я думаю, что глобальное пространство должно быть всегда доступно.

После того, как я импортировал stdClass, синглтон просто работал

0 голосов
/ 31 декабря 2010

Я бы согласился с @Seldaek и посмотрел бы на пространство имен, из которого вы вызываете метод.В каком пространстве имен вы находитесь, когда вызываете статический метод?Если вы находитесь в пространстве имен «Имя», вам не нужно вводить имя класса перед именем пространства имен.Если вы находитесь в другом пространстве имен, вам необходимо предвосхитить вызов метода с помощью символа «\», чтобы вернуться в корневое пространство имен, например $singleton = \Name\Singleton::get_instance().

...