PHP правильно получает "Корень приложения" в Xampp в Windows


Я нашел этот поток в StackOverflow о том, как получить "Корень приложения" из моего веб-приложения.

Однако большинство подходов, предложенных в этом потоке, вряд ли могут быть применены к моему Xampp в Windows. Скажи, у меня есть"common.php "который остается в каталоге приложений моего веб-приложения:

/
/app/common.php
/protected/index.php

В моем common.php , то, что у меня есть, выглядит так:

define('DOCROOT', $_SERVER['DOCUMENT_ROOT']);
define('ABSPATH', dirname(__FILE__));
define('COMMONSCRIPT', $_SERVER['PHP_SELF']);

После того, как я потребовал common.php внутри/protected/index.php , Я нашел это:

C:/xampp/htdocs     //<== echo DOCROOT;
C:\xampp\htdocs\comic\app //<== echo ABSPATH
/comic/protected/index.php //<== echo COMMONSCRIPT

Итак самая неприятная часть заключается в том, что разделители путей не являются универсальными, плюс, похоже, все суперглобальные значения из массива $_SERVER[] asso, такие как $_SERVER['PHP_SELF'], относятся к сценарию "вызывающий", а не к сценарию "вызываемый".

Похоже, что я могу полагаться только на dirname(__FILE__), чтобы убедиться, что это всегда возвращает абсолютный путь к common.php файл.

Я, конечно, могу проанализировать возвращаемые значения из DOCROOT и ABSPATH, а затем вычислить правильный "корень приложения". Например, я могу сравните части после htdocs и замените все обратные косые черты косыми чертами, чтобы получить unix-подобный путь

Интересно, правильно ли это делать? Что делать, если я разверну свое веб-приложение в среде LAMP? будет ли этот подход, зависящий от окружающей среды, бомбить меня?

Я использовал некоторые PHP-фреймворки, такие как CakePHP и CodeIgniter, честно говоря, они просто работают либо на LAMP, либо на WAMP, но я не уверен, как они подошли к такому элегантному решению.

Заранее большое спасибо за все советы и предложения.

Author: Community, 2010-05-09

1 answers

dirname(__FILE__) это распространенный метод получения пути. На самом деле, если ваш скрипт будет работать только на PHP 5.3 или более поздней версии, __DIR__ сделает то же самое и будет немного короче для ввода.

Я думаю, что ваша стратегия, включающая common.php это немного излишне. Для начала, DOCROOT и COMMONSCRIPT бесполезны - они просто дублируют некоторые данные, которые уже являются глобальными. (Все разработчики PHP знают, что такое $_SERVER['PHP_SELF'], но я лично не знал бы, что означает COMMONSCRIPT, не посмотрев его.)

Во-вторых, это может быть больше проблем, чем того стоит. Сравните некоторые различные способы получения пути к /protected/protected2.php из /protected/protected.php:

ABSPATH . "/../protected/protected2.php";
"protected2.php"
dirname(__FILE__) . "/protected2.php";

Все они действительны, но некоторые из них проще, чем другие. Это просто иллюстрирует, что то, о чем вы просите (получение корневого каталога приложения), не всегда может быть тем, что вам нужно. Поэтому я бы сказал, что нет волшебного пути, который решит все ваши проблемы. Если вы окажетесь в ситуации, в которой константа ABSPATH поможет вам, используйте ее.

Вторая часть ваш вопрос: Прямые косые черты будут работать в Windows, даже смешанные с обратными косыми чертами. Например:

include("c:\whatever\whatever/something/anything.php");

Будет работать на PHP в Windows (по крайней мере, в любой версии 5.0+; не уверен насчет 4.x). Обратные косые черты не будут работать в Unix, поэтому просто всегда вводите косые черты вперед, и вы будете в кросс-платформенной безопасности.

Если вы пишете кроссплатформенный скрипт, вам никогда не захочется писать код в букве диска. Вместо этого напишите это так:

include("/whatever/whatever/something/anything.php");

Начальный / будет интерпретирован PHP на Windows как c:\. (Я не знаю, как указать другую букву диска кроссплатформенным способом.)

НТХ

 3
Author: alexantd, 2010-05-09 17:57:33