Передача переменной из одного включаемого php-файла в другой: глобальный или нет - PullRequest
66 голосов
/ 13 января 2011

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


front.inc:

$name = 'james';

index.php:

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

вывод: james


end.inc:

echo $name;

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


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

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

Ответы [ 4 ]

54 голосов
/ 13 января 2011

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

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

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

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

29 голосов
/ 28 сентября 2011

Вот ловушка, чтобы избежать. Если вам нужен доступ к вашей переменной $ 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();
0 голосов
/ 18 января 2017

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

In front.inc

global $name;
$name = 'james';
0 голосов
/ 16 августа 2012

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

$name=$name;

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

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

...