Передача переменной из одного включаемого php-файла в другой: глобальный или нет

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


front.inc:

$name = 'james';

index.php:

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

вывод: джеймс


end.inc:

echo $name;

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


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

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

6 ответов

Решение

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

Итак, в вашем примере, так как вы установили переменную с именем $name в вашем front.inc файл, а затем включены оба front.inc а также end.inc в вашем index.php, Вы сможете 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');

function foo() {
  global $name;
  echo $name;
}

function bar() {
  global $name;
  echo $name;
}

foo();
bar();

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

Впереди

global $name;
$name = 'james';

То же самое и с php 5.4.7

      $mysql = false;
include("inc_mysql.php");
echo($mysql);

Где inc_mysql.php:

      $mysql = true;

Отображает значение $mysql = false;

НО

если вы удалите первый $mysql = false;

      include("inc_mysql.php");
echo($mysql);

Отображает значение $mysql = true;

ТАК определенно, включение НЕ похоже на копирование / вставку кода, по крайней мере, в некоторых версиях PHP.

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

Из руководства по PHP:

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

Таким образом, переменная доступна для обоих включений ( front.incа также end.inc), но любая функция, определенная в этих файлах, не будет иметь доступа к переменной $nameесли только globalиспользуется ключевое слово или константа.

Я взял некоторый код с https://www.php.net/manual/en/language.variables.scope.php , чтобы лучше понять эту проблему:

      <?php
$a = 1; /* global scope */ 

function test()
{
    /* the code below will throw a Warning: Undefined variable $a ... */
    echo $a; /* reference to local scope variable */
} 

Чтобы получить значение переменной, вам нужно будет вызвать global $a следующим образом:

      <?php
$a = 2; /* global scope */

function test2() {
    global $a;
    /* now we have access to the global $a so no more warnings */
    echo $a;
}

Вы также можете положиться на $GLOBALSчтобы получить доступ к глобальному, как это:

      <?php
$a = 3; /* global scope */

function test3() {
    echo $GLOBALS['a'];
}

Вы можете получить список всех глобальных переменных с помощью такого кода:

      echo "<pre>";
print_r($GLOBALS);
echo "</pre>";

Источник кода выше: возможно ли перечислить все глобальные переменные в PHP?

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

$name=$name;

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

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

Другие вопросы по тегам