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

Я пытаюсь передать переменную из одного файла 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; 

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

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