#php #zend-framework #autoload #require-once
#php #zend-framework #автозагрузка #требовать-один раз
Вопрос:
Я пишу крошечный школьный проект на php. Мне нужно было отобразить некоторую информацию в формате pdf и отправить файл по почте.
Когда я скопирую папку PDF с файлом класса pdf из библиотеки.вот моя структура папок
/ /библиотека /Swift /.... /Zend /Pdf Pdf.php test_file.php
вот содержимое test_file.php
require_once 'lib/Zend/Pdf.php';
$pdf = new Zend_Pdf();
$pdf->render();
и это выдает это
( ! ) Неустранимая ошибка: require_once() [function.require]: требуется неудачное открытие ‘Zend/Pdf/Page.php ‘ (include_path=’.;C:xamppphpPEAR ;C:ZendFramework-1.10.8bin ;’) в C:xampphtdocsschoolprojectlibZendPdf.php в строке 27
но я заметил, что все классы включаются путем ссылки на верхнюю папку Zend, даже классы-братья и сестры, например :
require_once 'Zend/Pdf/Page.php';
я немного запутался в том, как с этим справиться. Я думаю о функции автоматической загрузки или вручную скорректировать требуемый путь в соответствии с моим проектом (что будет непросто).
Каков наилучший способ обойти это?
Спасибо, что прочитали это.
Комментарии:
1. Добавьте папку библиотеки вашего проекта в путь включения:
include_path=".:/usr/share/php:/usr/share/pear:/path/to/zf"
— через Zend Framework: «Местоположение, местоположение Местоположения!»
Ответ №1:
Что ж, вам нужно настроить включаемый путь к корню папки библиотеки Zend Framework.
set_include_path(implode(PATH_SEPARATOR, array(
'c:ZendFramework-1.10.8library',
get_include_path(),
)));
Поскольку Zend использует псевдопространства имен, вам необходимо включить каталог верхнего уровня library/
, а не library/Zend
Возможно, вы также захотите использовать автозагрузчик
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
Это позволяет избежать вызова require_once()
каждый раз, когда вам нужно «потребовать» файл для загрузки класса
Комментарии:
1. Поскольку проект будет развернут на школьном сервере, я предпочитаю не привязывать его к своей среде, я предпочитаю включать саму необходимую библиотеку в папку lib спасибо
2. Независимо от того, используете ли вы полную библиотеку в комплекте или автономные файлы, вам НЕОБХОДИМО использовать папку верхнего уровня из-за инструкции require_once, используемой в ZF. Однако настройте свой путь включения в соответствии с вашей средой, и это сработает.
3. куда следует поместить сам этот код
require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
? Спасибо4. Это действительно зависит от вашего приложения, однако его следует установить перед любым использованием компонентов Zend Framework. Если у вас есть передний index.php возможно, это подходящее место для его размещения. Вы также можете захотеть указать это непосредственно перед вызовом new Zend_Pdf();
Ответ №2:
Вы должны зарегистрировать автозагрузчик ZF. После этого вы можете просто использовать классы, а автозагрузчик разберется с остальным.
$zf_path = 'PATH/TO/YOUR/LIB/FOLDER';
set_include_path($zf_path.PATH_SEPARATOR.get_include_path());
require_once($zf_path.'/Zend/Loader/Autoloader.php');
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Zend_');
Комментарии:
1. Привет, спасибо за быстрый ответ. Я думаю, что я понял идею. Это означает, что мне нужно было бы добавить
Zend Loade
папку r иLoader.php
вZend
папку mylib
. самый важный вопрос — где будет находиться опубликованный вами код? вboostrap
тип файла, который я включаю в свои php-файлы? еще раз спасибо2. Мне трудно понять ваш комментарий. Где именно находится ваш Zend-код, на самом деле не имеет значения, если вы добавляете его в include path. Перед использованием любого из классов Zend необходимо загрузить Zend_Loader_Autoloader. Это может быть где угодно в вашем коде: «наверху», в файле начальной загрузки или в какой-нибудь конструкции отложенной автозагрузки — это зависит от используемой вами системы / фреймворка. Если вы используете symfony1, например, этот код войдет в класс конфигурации проекта.