У меня есть следующая структура каталогов;
script.php
inc / include1.php
inc / include2.phpобъекты / object1.php
объекты / object2.phpмыло / soap.php
Теперь я использую эти объекты в обоих script.php
и /soap/soap.php
могу их перемещать, но мне нужна такая структура каталогов по определенной причине. При выполнении script.php
пути включения inc/include.php
и при /soap/soap.php
его выполнении ../inc
работают абсолютные пути, /mnt/webdev/[project name]/inc/include1.php...
но это уродливое решение, если я когда-либо захочу переместить каталог в другое место.
Так есть ли способ использовать относительные пути или способ программно сгенерировать "/mnt/webdev/[project name]/"
?
DOCUMENT_ROOT
Вы можете использовать относительные пути. Попробуй
__FILE__
. Это константа PHP, которая всегда возвращает путь / имя файла сценария, в котором она находится. Итак, вsoap.php
, вы можете сделать:Другое решение - установить путь включения в вашем файле httpd.conf или .htaccess.
источник
/
в начало цитируемого выражения, чтобы отделить..
от имени ФАЙЛА .__DIR__
вместо использованияdirname(__FILE__)
. (Документы PHP)include dirname(__FILE__).'/../inc/include.php';
Не забывайте "/" перед относительным путем.Другой способ справиться с этим, который вообще устраняет необходимость во включениях, - это использовать функцию автозагрузки . Включение всего необходимого вашему скрипту «на всякий случай» может снизить производительность. Если все ваши включения - это определения классов или интерфейсов и вы хотите загружать их только при необходимости, вы можете перегрузить
__autoload()
функцию своим собственным кодом, чтобы найти соответствующий файл класса и загрузить его только при его вызове. Вот пример из руководства:Пока вы соответствующим образом устанавливаете переменные include_path, вам больше никогда не нужно включать файл класса.
источник
посмотрите http://au.php.net/reserved.variables
Я думаю, что переменная, которую вы ищете:
$_SERVER["DOCUMENT_ROOT"]
источник
Вы можете определить константу с путем к корневому каталогу вашего проекта, а затем поместить ее в начало пути.
источник
Другой вариант, связанный с Кевином, - использовать
__FILE__
, но вместо этого заменить имя файла php внутри него:Я уже давно этим пользуюсь. Единственная проблема в том, что иногда у вас ее нет
$_SERVER['SCRIPT_NAME']
, но иногда есть другая похожая переменная.источник
Я обнаружил, что это работает очень хорошо!
Использование:
источник
Я думаю, что лучший способ - включить ваши включения в путь включения PHP. Это можно сделать разными способами, в зависимости от ваших настроек.
Тогда вы можете просто сослаться на
изнутри любого файла, независимо от того, где он находится: в ваших включаемых файлах, в файлах, доступных в Интернете, или во вложенных подкаталогах любого уровня.
Это позволяет вам размещать включаемые файлы вне корня веб-сервера, что является наилучшей практикой.
например
Также проверьте __autoload для отложенной загрузки файлов классов.
http://www.google.com/search?q=setting+php+include+path
http://www.google.com/search?q=__autoload
источник
Я использую эту строку кода. Он возвращается на «верх» дерева сайтов, затем переходит к желаемому файлу.
Например, скажем, у меня есть это файловое дерево:
Я могу включить файл functions.php из любого места, просто скопировав и вставив
Если вам нужно использовать этот код много раз, вы можете создать функцию, которая возвращает
str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
часть. Затем просто вставьте эту функцию в первый включаемый файл. У меня есть файл "initialize.php", который я включаю в самый верх каждой страницы php и который содержит эту функцию. В следующий раз, когда мне нужно будет включить файлы, я просто использую функцию (с именемpath_back
):источник
Да, конечно. Так, например, мы используем один слой вложенных папок, как правило:
Вам нужно быть осторожным, слишком сильно полагаясь на путь включения на сайтах с очень высоким трафиком, потому что php должен искать через текущий каталог, а затем все каталоги на пути включения, чтобы увидеть, есть ли там ваш файл, и это может замедлить вещи вверх, если вас забьют.
Так, например, если вы выполняете MVC, вы должны указать путь к каталогу вашего приложения в пути включения, а затем указать ссылку на вещи в форме
или что угодно.
Но, вообще говоря, он просто позволяет вам работать с действительно короткими путями в вашем PHP, которые будут работать из любого места, и его намного легче читать, чем весь этот корневой документ с реальными путями.
Преимущество этих альтернативных сценариев, предложенных другими, заключается в том, что они работают где угодно, даже на общих ящиках; установка пути включения требует немного больше размышлений и усилий, но, как я уже упоминал, позволяет вам начать использовать __autoload, который является самым крутым.
источник
Если вы собираетесь включить определенный путь в большинство файлов в своем приложении, создайте глобальную переменную в своей корневой папке.
Теперь эту глобальную переменную « APPLICATION_PATH » можно использовать для включения всех файлов вместо вызова realpath () каждый раз, когда вы включаете новый файл.
EX:
Надеюсь, поможет ;-)
источник