Как автоматически загрузить одноэлементный класс (приватный конструктор) в Zend-контроллере? - PullRequest
3 голосов
/ 13 января 2012

В моем каталоге моделей есть одноэлементный класс, и я должен использовать его функцию в классе Controller. Делаем это с помощью require_once ('путь к файлу'); и вызов функции как ClassName :: FunctionName () работает нормально, но мне нужно использовать Zend Autoloader вместо включения класса через require_once. Здесь я нашел несколько решений для stackoverflow, которые использовали bootstrap.php с точки зрения добавления следующего кода, и похоже, что он делает то же самое, что и require_once ('путь к файлу'); сделал в контроллере

  protected function _initAutoload()
    {   
       Zend_Loader_Autoloader::getInstance();
    }

В этом случае я получаю фатальную ошибку: класс 'ClassName' не найден в {path} \ controllers \ SampleController.php в {line no.} Я уверен, что что-то упустил, но не могу понять, что именно.

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Как правильно сказал пользователь1145086, если вы следуете соглашению об именах Zend, ваш класс должен быть загружен автоматически.

Если у вас есть класс, скажите AutoloadedClass , и вы хотитеон автоматически загружается, вы можете сделать следующее:

  1. Создать папку в папке / library и назвать ее 'My' .
  2. Напишите следующий код в методе класса initAutoload вашего Bootstrap:

    Zend_Loader_Autoloader::getInstance()->registerNamespace(array('My_'));
    
  3. Поместите файл, содержащий 'AutoloadedClass' , в 'My' папку, которую вы только что создали, и переименуйте файл в AutoloadedClass.php, чтобы файл в конечном итоге находился таким образом: / library / My / AutoloadedClass.php
  4. Наконец, переименуйте сам классMy_AutoloadedClass, как требует соглашение об именах Zend.Отныне вы можете получить ссылку на ваш класс, используя это имя класса My_AutoloadedClass из любой точки вашего приложения.
1 голос
/ 13 января 2012

Если имена классов и местоположения в вашей библиотеке не соответствуют Соглашения о присвоении имен Zend , то вы можете написать автозагрузчик для этой библиотеки и поместить этот автозагрузчик в стек Zend_Loader_Autoloader.

См. https://stackoverflow.com/a/8820536/131824 для примера.

1 голос
/ 13 января 2012

если вы называете свой класс в соответствии с соглашениями Zend, класс должен автоматически загружаться.Если ваш класс находится по адресу / application / models / myClass.php и имеет имя:

class Application_Model_MyClass {

    public function myMethod(){
    }
}

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

Если вам нужно использовать собственные имена классов, вы можете добавить новое пространство имен к автозагрузчику, работающему в каталоге / library , добавьте эту строку в application.ini :

autoloaderNamespaces[] = "MyNamespace_"

, затем добавьте каталог / MyNamespace в каталог / library и присвойте свои файлы соответствующим образом:

class MyNamespace_MyClass {
}

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

...