Я пытаюсь передать переменную из одного файла include в другой. Это НЕ работает, если я не объявляю переменную глобальным во втором файле include. Однако мне не нужно объявлять его глобальным в файле, который вызывает первый include. Например:
front.inc:
$name = 'james';
index.php:
include('front.inc'); echo $name; include('end.inc');
вinclude('front.inc'); echo $name; include('end.inc');
вывод: james
end.inc:
echo $name;
выход: ничего
ЕСЛИ я объявляю глобальное имя $ до эхо-имени $ name в end.inc, тогда он работает правильно. Принятый ответ на этот пост объясняет, что это зависит от конфигурации вашего сервера: передача переменных в PHP из одного файла в другой
Я использую сервер Apache. Как настроить его так, чтобы объявление глобального имени не было необходимым? Существуют ли преимущества / недостатки для одного или другого?
При включении файлов в PHP он действует как код в файле, из которого они включены. Представьте копию и вставку кода из каждого из ваших включенных файлов непосредственно в ваш index.php
. Так работает PHP.
Итак, в вашем примере, поскольку вы front.inc
переменную с именем $name
в файле front.inc
, а затем включили в index.php
как front.inc
и end.inc
, вы сможете echo
переменную $name
в любом месте после include
front.inc
внутри вашего index.php
. Опять же, PHP обрабатывает ваш index.php
как если бы код из двух файлов, которые вы включаете, является частью файла.
Когда вы помещаете echo
внутри включенного файла, переменной, которая не определена внутри себя, вы не получите результат, потому что он обрабатывается отдельно, а затем любой другой включенный файл.
Другими словами, чтобы выполнить поведение, которое вы ожидаете, вам нужно будет определить его как глобальное.
Здесь есть ловушка, которой можно избежать. Если вам нужно получить доступ к переменной $ name внутри функции, вам нужно сказать «global $ name;» в начале этой функции. Вам нужно повторить это для каждой функции в том же файле.
include('front.inc'); global $name; function foo() { echo $name; } function bar() { echo $name; } foo(); bar();
вinclude('front.inc'); global $name; function foo() { echo $name; } function bar() { echo $name; } foo(); bar();
будут отображаться только ошибки. Правильный способ сделать это:
include('front.inc'); function foo() { global $name; echo $name; } function bar() { global $name; echo $name; } foo(); bar();
вinclude('front.inc'); function foo() { global $name; echo $name; } function bar() { global $name; echo $name; } foo(); bar();
Это все, что вам нужно сделать:
В передней .inc
global $name; $name = 'james';
У меня странное решение. в файле end.inc
, добавьте эту строку:
$name=$name;
Тогда эхо будет работать.
Я попал в это решение в своем проекте, без хорошего объяснения, почему он так сработал.