Передача переменной из одного php включает файл в другой: global vs. not

Я пытаюсь передать переменную из одного файла include в другой. Это НЕ работает, если я не объявляю переменную глобальным во втором файле include. Однако мне не нужно объявлять его глобальным в файле, который вызывает первый include. Например:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

вывод: james


end.inc:

echo $name;

вывод: ничего


ЕСЛИ я объявляю глобальное имя $перед повторением $name в end.inc, тогда он работает правильно. В принятом ответе на этот пост объясняется, что это зависит от конфигурации вашего сервера: Передача переменных в PHP из одного файла в другой

Я использую сервер Apache. Как настроить его так, чтобы объявление глобального имени не было необходимым? Существуют ли преимущества/недостатки для одного и другого?

Ответ 1

При включении файлов в PHP он действует как код в файле, из которого они включены. Представьте копию и вставку кода из каждого из ваших включенных файлов непосредственно в ваш index.php. Вот как работает PHP с.

Итак, в вашем примере, поскольку вы установили переменную с именем $name в свой файл front.inc, а затем включили как front.inc, так и end.inc в index.php, вы сможете echo переменная $name где-нибудь после include of front.inc внутри вашего index.php. Снова PHP обрабатывает ваш index.php, как если бы код из двух файлов, которые вы включаете, содержит часть файла.

Когда вы помещаете echo внутри включенного файла в переменную, которая не определена внутри себя, вы не получите результат, потому что он обрабатывается отдельно, а затем любой другой включенный файл.

Другими словами, чтобы выполнить поведение, которое вы ожидаете, вам нужно будет определить его как глобальный.

Ответ 2

Здесь есть ловушка, которой нужно избегать. Если вам нужно получить доступ к переменной $name внутри функции, вам нужно сказать "global $name;" в начале этой функции. Вам нужно повторить это для каждой функции в том же файле.

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();

Ответ 3

Это все, что вам нужно сделать:

В front.inc

global $name;
$name = 'james';

Ответ 4

У меня странное решение. в файле end.inc, добавьте эту строку:

$name=$name;

Тогда эхо будет работать.

Я попал в это решение в своем проекте, без хорошего объяснения, почему он работает следующим образом.