Пути к файлам правильные у меня и phpStorm, но неправильные в реальном мире

Мы с phpStorm согласны, что это безумие, но «неправильные» пути к файлам работают, а «правильные» — нет. Базовая структура.

  |
  |------classes(directory)
  |         |
  |         |
  |         Person.php
  |
  |------include(directory)
  |         |
  |         |
  |         db-connect.inc.php
  |         autoloader.inc.php
  |         helper.inc.php
  |
  |
  |index.php
  |etc.php

В индексе я использую: (1)

include_once "include/autoloader.inc.php";
include_once "include/db-connect.inc.php";
include_once "include/helper.inc.php";

и в Person.php я бы хотел использовать: (2)

include_once "../include/autoloader.inc.php";
include_once "../include/db-connect.inc.php";
include_once "../include/helper.inc.php";

Но это получается:

"Warning: include_once(../include/autoloader.inc.php): failed to open stream:
No such file or directory in C:\xampp\htdocs\dummy\classes\Person.php on line 2"

странно (3)

include_once "/../include/autoloader.inc.php";
include_once "/../include/db-connect.inc.php";
include_once "/../include/helper.inc.php";

работает и даже более причудливо работает (4)

include_once "include/autoloader.inc.php";
include_once "include/db-connect.inc.php";
include_once "include/helper.inc.php";

даже если мы поднялись на один уровень каталога!

phpStorm помечает 3 и 4 как ошибки (говорит «Путь include/autoloader.inc.php не найден» и «Выражение Include не разрешено»), в то время как (2), что я считал «правильным», получает хороший большой зеленый поставить галочку, но не работает при отладке или при прямом доступе через http://localhost и т. д.

Я всегда борюсь с этими путями, но почему мы с phpStorm согласны, а реальный мир говорит «нет»!

Думаю, мне придется вставить $_SERVER['DOCUMENT_ROOT'] повсюду (намного проще со Storm, а не от руки!), но все равно больно!


person BeNice    schedule 27.09.2015    source источник
comment
Имя вашей папки «включает» в вашем примере дерева каталогов, но в вашем операторе включения написано «включить» - есть ли опечатка в вашем коде или примере?   -  person Anuj    schedule 27.09.2015
comment
Вы можете попробовать getcwd из включенного php-файла, чтобы увидеть, думает ли он, что вы находитесь там, где вы думаете. php.net/manual/en/function.getcwd.php   -  person Smack Jack    schedule 27.09.2015
comment
Попробуйте использовать больше абсолютных путей, например. include_once __DIR__ . "/../include/autoloader.inc.php"; -- намного надежнее, так как таким образом вы не даете PHP шанса неправильно интерпретировать его (например, потому что у вас могут быть сложные include_path и т. д.). В идеале я бы порекомендовал использовать классы, PSR-4 и автозагрузку классов - в таком случае только несколько include/require, а остальные будут загружены автоматически.   -  person LazyOne    schedule 28.09.2015


Ответы (1)


Это правильное поведение.

Загруженная вами страница находится в /

Туда вы включили файл из /includes

И теперь файл, который вы включили, является частью страницы в /.

Таким образом, все включения во включенный файл рассматриваются как родственники из /, а не из /includes.

и так далее...

person Julio Soares    schedule 27.09.2015
comment
Есть две разные страницы - одна в корне, другая в классах. Я не понимаю, как включение должно использовать тот же путь. - person BeNice; 27.09.2015
comment
Когда вы включаете файл на страницу, включенный файл становится частью страницы, и ссылки на дерево каталогов внутри страницы связаны с позицией страницы в дереве, а не с позицией какого-либо возможного включенного файла. - person Julio Soares; 27.09.2015