Настройка включает путь и автозагрузка двух разных вещей?
-
08-10-2019 - |
Вопрос
Я замечаю, что добавление включенного пути папки, которую мне нужно недостаточно для доступа к классам.
У меня есть приложение / тесты папки / которые содержит приложение / тесты / test.php
Class Test.php называется тестом без каких-либо префиксов
class Test {
}
Если я добавлю папку тестов только в пути включения
realpath(APPLICATION_PATH . '/tests')
Class Test.php не работает в контроллерах
new Test()
Так что не включая папку в WiLE PATH PATH достаточно?
Решение
@Stasm имеет право. Но вот немного больше объяснения.
То include_path
говорит PHP, где посмотреть, когда он выполняет include
, ан include_once
, А. require
, или а require_once
. Отказ Конечно, эти include
песок require
S Всегда ссылаться на конкретный файл.
Автозагрузка специально о пропущении классы. Отказ Когда в качестве не разгруженного класса упоминается в коде - как правило, хотя и не исключительно, вызывая new
Оператор, как в вашем примере - то автозагрузка - это процесс, который может ударить с алгоритмом для загрузки класса. Этот процесс, как правило, включает в себя начать с имени пропущенного класса и получения набора возможных путей - либо абсолютно в файловой системе, либо относительно записей в include_path
- от имени пропущенного класса, а затем выполнять выполнение include
В надежде, что определение класса находится в одном из них.
В вашем случае вы призвал класс по имени «тест». Файл, содержащий этот класс, находится в файле APPLICATION_PATH . 'tests/Test.php'
. Отказ И вы поместили каталог APPLICATION_PATH . 'tests'
в include_path
. Отказ Но пока не существует алгоритм автозагрузки, для системы нет никакого способа подключить имя класса 'Test'
к имени файла 'Test.php'
.
То Название класса в грушевом стиле предоставит это соединение. И автозагрузчик, который использует эту Конвенцию - как AutoLoader autoLoader Zend по умолчанию - сможет выполнить это отображение из имени класса к имени файла, а затем include
требуемый файл.
В качестве окончательного осложнения, обычная рамочная структура Zend Framework Directory размещает определенные классы в папках, которые НЕТ На включении пути: модели, формы, услуги, контроллеры, смотровые помощники, помощники действий и т. Д. Вот почему вы часто видите больше конфигурации автозагрузчика - как правило, в Bootstrap
класс - определение сопоставления между определенными классами и определенными местами в файловой системе, которые являются выключенный то include_path
.
Например, класс под названием «Default_Model_user» может на первый взгляд - ожидается проживать на include_path
в файле 'Default/Model/User.php'
. Отказ Но стандартная структура каталогов приложений хочет поместить этот файл в «Приложение / Модели / user.php». Обратите внимание на множественное число «модели» и нижний регистр «М» В названии пути, а также наличие «по умолчанию» в классе. Требуется дополнительная конфигурация на автозагрузчике для того, чтобы иметь смысл того, что предоставляет шаблон для отображения классов и имени файла. Это обычно достигается с Ресурс автозагрузчик.
Надеюсь, что кто-то из этого помогает, либо вы или кому-то еще. Ваше здоровье!
Другие советы
Включите путь показывает, где PHP будет искать сценарии, которые он собирается включить - так что, когда вы говорите include('blah.php')
PHP двигатель будет искать blah.php
во всех путях в включении пути.
Автозагрузка - это функциональность, которая позволяет вызывать определенную функцию, когда PHP обнаруживает, что нужен класс, но не определен. В этой функции вы можете использовать путь включения, чтобы найти файл, содержащий класс и загрузите его, но это абсолютно разные вещи.
realpath()
не связан с любым из них и является функцией, которая возвращает уникальную файловую систему пути данного файла с такими вещами, как ..
и символические ссылки решены.