Установка включает в себя путь и автозагрузку двух разных вещей? - PullRequest
1 голос
/ 11 декабря 2010

Я замечаю, что добавления пути включения нужной мне папки недостаточно для доступа к классам.

У меня есть папка application / tests /, в которой содержится application / tests / Test.php

Класс Test.php называется Test без префиксов

class Test {

}

Если ядобавить папку тестов только в путь включения

realpath(APPLICATION_PATH . '/tests')

Класс Test.php не работает в контроллерах

new Test()

, поэтому не включает папку в путь включениядостаточно?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

@ StasM это правильно. Но вот немного больше объяснений.

include_path сообщает PHP, где искать, когда он выполняет include, include_once, require или require_once. Конечно, эти include s и require s всегда ссылаются на определенный файл .

Автозагрузка предназначена для пропущенных классов . Если в коде есть ссылка на еще не выгруженный класс - как правило, хотя и не исключительно, путем вызова оператора new, как в вашем примере - тогда автозагрузка - это процесс, который может задействовать алгоритм загрузки класса. Этот процесс обычно включает в себя начало с имени отсутствующего класса и создание набора возможных путей - либо абсолютных в файловой системе, либо относительно записей в include_path - из имени отсутствующего класса, а затем выполнение include в надежде, что определение класса находится в одном из них.

В вашем случае вы вызвали класс с именем "Test". Файл, содержащий этот класс, находится в файле APPLICATION_PATH . 'tests/Test.php'. И вы поместили каталог APPLICATION_PATH . 'tests' в include_path. Но пока не будет установлен алгоритм автозагрузки, система не сможет подключить имя класса 'Test' к имени файла 'Test.php'.

Соглашение об именах классов в стиле PEAR обеспечит это соединение. А автозагрузчик, использующий это соглашение - как автозагрузчик Zend Framework по умолчанию - сможет выполнить это сопоставление от имени класса к имени файла, а затем include требуемый файл.

В качестве последнего усложнения традиционное соглашение о разметке каталогов Zend Framework помещает определенные классы в папки, которые НЕ , в путь включения: модели, формы, службы, контроллеры, помощники представлений, помощники действий и т. Д. Вот почему вы часто будете видеть больше конфигурации автозагрузчика - обычно в классе Bootstrap - определяющего отображение между определенными именами классов и определенными местами в файловой системе, которые отключены include_path.

Например, класс с именем Default_Model_User, на первый взгляд, может находиться в include_path в файле 'Default/Model/User.php'. Но стандартная структура каталогов приложения хочет поместить этот файл в «application / models / User.php». Обратите внимание на множественное число 'models' и строчную букву 'm' в имени пути, а также наличие «Default» в имени класса. Дополнительная конфигурация в автозагрузчике необходима для того, чтобы иметь смысл, обеспечить шаблон для сопоставления имени файла с именем файла. Обычно это достигается с помощью автозагрузчика ресурсов .

Надеюсь, что это поможет вам или кому-то еще. Ура!

2 голосов
/ 11 декабря 2010

Путь включения показывает, где PHP будет искать сценарии, которые он собирается включить - так что, когда вы говорите, include('blah.php') движок PHP будет искать blah.php во всех путях в пути включения.

Автозагрузка - это функция, которая позволяет вызывать определенную функцию, когда PHP обнаруживает, что класс необходим, но не определен.В этой функции вы можете использовать путь включения, чтобы найти файл, содержащий класс, и загрузить его, но это абсолютно разные вещи.

realpath() не относится ни к одному из них и является функцией, которая возвращает уникальный путь к файловой системе для данного файла с разрешением таких вещей, как .. и символических ссылок.

...