PHP include_once не работает для файла в родительском каталоге - PullRequest
1 голос
/ 29 января 2010

Я только начал работать над сайтом, который был передан мне и который не работает. Я обнаружил, что есть проблема, когда в /admin/index.php он пытается создать экземпляр /classes/admin.php. Однако, если я скопирую /admin/index.php в /admin-index.php, он может создать экземпляр класса просто отлично. Кроме того, если я переместлю /classes/admin.php в /admin/classes/admin.php, я также могу отлично его создать. Есть по крайней мере еще один класс, с которым я это заметил.

Я также заметил, что это не проблема на моей локальной машине для разработки. Это только проблема на сервере.

Вы можете найти информацию о сервере по адресу http://charlesekublyfoundation.org/admin/phpinfo.php. Моя машина для разработки - это машина WinXP, на которой установлены Apache 2.2 и PHP 5.2.11 (Apache / 2.2.14 (Win32) PHP / 5.2.11).

Кто-нибудь видел что-нибудь подобное? Это кажется странным. Я довольно новичок в разработке PHP (в первую очередь .NET-разработчик), поэтому я не уверен, что могло бы вызвать это. Я не уверен, если это разница в PHP или Apache или что-то еще.

EDIT Должен заметить, что мой сервер работает под Linux какой-то марки, а на машине разработчика - Windows. У меня такое ощущение, что это как-то связано с этим после изучения include_paths.

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Я могу подумать о нескольких вещах, которые могут помочь в решении этой проблемы.

Наиболее вероятным из вашего описания, на мой взгляд, является то, что разработчик использовал настройку PHP include_path . Этот параметр работает с командами require() и include(), чтобы указать им, где искать запрошенный файл, если не указан жесткий путь. Если в коде используются относительные пути и параметры include_path отличаются, это может быть проблемой. Как правило, include_path будет содержать «текущий каталог» (т. Е. .) как часть пути и включает в себя, используя его в качестве основы.

Другая возможность состоит в том, что приложение использует автозагрузку , и почему-то это не переводится должным образом в рабочую среду. Я бы сделал быстрый поиск по приложению и увидел бы, есть ли указанная функция __autoload() или используется spl_autoload_register(). Если это так, возможно, функция автозагрузки делает предположения о каталогах, которые верны только на компьютере разработчика?

0 голосов
/ 29 января 2010

Вы должны изучить пути включения, чтобы понять, почему он не работает должным образом. Информация о пути включения будет расположена в вашем конфигурационном файле PHP (обычно php.ini), а также в самом приложении. В приложении вы можете попробовать использовать функцию get_include_path и распечатать то, что она возвращает.

...