Можно ли использовать оператор php require внутри файла php, который сам был загружен оператором require? - PullRequest
0 голосов
/ 19 сентября 2019

Есть ли проблема, требующая наличия файлов в другом обязательном файле, когда файлы не «вызывают» друг друга?

Я пытаюсь загрузить файл, который используется всеми сгенерированными веб-страницамимоим php-приложением, использующим оператор php require внутри php-файла, который сам загружается оператором require внутри файла контроллера / пакета Symfony v2.8, но яполучаю следующую ошибку:

Compile Error: main(): Failed opening required '../common_code/setPageLogo.php' 
(include_path='.:/usr/share/pear:/usr/share/php')
500 Internal Server Error - FatalErrorException

Stack Trace
in src/AppBundle/Controller/pages/home_main.php at line 55  -
52
53 // Show page header (logos, search box, and index buttons
54
55 require '../common_code/setPageLogo.php';
56

Структура каталогов:

src
  AppBundle
    Controller    (where the controller file exists that requires pages/home_main.php)
      pages       (where the home_main.php file exists that requires setPageLogo.pphp)
      common_code (where the setPageLogo.php file exists)

Контроллер использует следующие операторы require для загрузки в различные частисоздаваемая веб-страница:

    require 'pages/head.php';
    require 'pages/header.php';
    require 'pages/home_main.php';
    require 'pages/footer.php';

Из этих обязательных файлов только 'pages / home_main.php' содержит оператор require тот, на который жалуется компилятор, пытается загрузить файл с именем setPageLogo.php , который находится в подкаталоге с именем common_code , вне родительского каталога, где находится файл контроллерарасположен.Вот оператор require из файла home_main.php:

require '../common_code/setPageLogo.php';

Я попытался удалить .. / из пути,но это не сработало.

Файл setPageLogo.php начинается с

Примечание. Если я просто скопирую код в *Файл 1049 * setPageLogo.php в файл home_main.php , где находится оператор require, и закомментируйте оператор require , а затемвеб-страница генерируется и загружается нормально.

1 Ответ

0 голосов
/ 19 сентября 2019

Как сказали Дитер Кройтль и 04FS, да.Вывод из связанной статьи заключается в том, что пути, используемые в инструкциях require, должны быть относительно файла контроллера или абсолютных путей, но абсолютные пути могут быть определены во время компиляции в файле контроллера следующим образом:

        if( !defined( 'ROOT' ) ) { define( 'ROOT', dirname(__FILE__) ); }

        require ( ROOT . '/pages/home_main.php' );

Обязательные / включенные файлы, которые имеют свои собственные операторы require / include, также используют ROOT, но не должны (пере) определять его, поэтому, если в файл home_main.php должен быть включен другой файл, который был в common_codeЭто одно и то же. Это выглядит так:

        require ( ROOT . '/common_code/loadRequiredVars.php' );  

Таким образом, ROOT скрывает абсолютную часть пути, и его нужно редактировать только в том случае, если структура подкаталога под директором контроллера каким-либо образом изменяется.

Конечно, вместо этого можно использовать относительные пути, но они должны относиться к каталогу контроллера, а не так, как у меня было в моем вопросе.

...