У меня есть некоторые проблемы с включением файлов относительно. Проблема не в том, что require_once не может найти файл, а в том, что он МОЖЕТ найти файл там, где его нет. Я разобрал проблему до трех небольших классов.
Итак, это моя структура dir:
public_html/
index.php
commands/
CommandFactory.php
account/
Status.php
index.php:
require_once 'commands/CommandFactory.php';
$factory = new CommandFactory();
CommandFactory.php:
class CommandFactory{
public function __construct()
{
echo getcwd() . '<br/>'; //xxx\public_html (which is good, this is where index.php is
//require_once 'account/Status.php'; // This works as expected
require_once 'account/Status.php'; // This ALSO works, but it shouldn't
$status = new Status(); // This works, though it shouldn't.
}
}
Я проверил, переместив CommandFactory в другой каталог, который решает проблему. Тем не менее, я не могу понять, почему файл может быть включен. Он не должен содержать Status относительно CommandFactory, он должен быть относительным из index.php. Я добавил текущий рабочий каталог, чтобы увидеть, что идет не так, но я не могу понять это. Кто-нибудь знает, как и почему это работает?
С сайта php.net:
Файлы включаются на основе заданного пути к файлу или, если он не указан,
указанный include_path. Если файл не найден в
include_path, include наконец проверит собственный вызывающий скрипт
каталог и текущий рабочий каталог до сбоя.
конструкция include выдаст предупреждение, если не сможет найти файл; этот
поведение отличается от require, что приведет к фатальной ошибке
Других решений пока нет …