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


76

Я намагаюся передати змінну з одного файлу включення в інший. Це НЕ працює, якщо я не оголошую змінну глобальною у другому файлі включення. Однак мені НЕ потрібно оголошувати його як глобальний у файлі, який викликає перше включення. Наприклад:


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 глобальним не потрібно? Чи є переваги / недоліки у одного проти іншого?


2
включає не схожі функції. включає не порушувати область змінної. це як якщо б ви скопіювали вставлений вміст файлів включення безпосередньо у скрипт виклику.
dqhendricks

2
це відлуння в end.inc всередині функції?
dqhendricks

2
це порушить область дії змінної. і в такому випадку ви, мабуть, повинні передати $ name функції у аргументі.
dqhendricks

Це має працювати, як написано!
обдурити

ехо в end.inc не знаходиться всередині функції. Припустимо, що описані вище три файли містять не більше і не менше того, що я написав.
maxedison

Відповіді:


62

Включаючи файли в PHP, він діє так, ніби код існує у файлі, з якого вони включені. Уявіть, як скопіюйте та вставте код з кожного включеного файлу безпосередньо у ваш index.php. Ось як PHP працює з включеннями.

Таким чином, у вашому прикладі, так як ви встановили змінну $nameв вашому front.incфайлі, а потім включені як front.incі end.incу вашій index.php, ви будете в змозі echoзмінної $nameвсюди після того , includeв front.incмежах Вашого index.php. Знову ж таки, PHP обробляє ваш файл index.phpтак, ніби код із двох файлів, які ви включаєте, є частиною файлу.

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

Іншими словами, щоб виконати очікувану поведінку, вам потрібно буде визначити її як глобальну.


51
Ваша відповідь суперечить сама собі. Ви пару разів сказали, що включення файлу - це те саме, що якби весь код був просто частиною одного файлу. Тому те, що я описав у своєму дописі, було б еквівалентно: $ name = 'james'; echo $ name; echo $ name; - Це повинно виробляти джемджам. Але ваш останній абзац суперечить тому, що я щойно описав. Можливо, ви маєте на увазі, що ТІЛЬКИ файл, що робить виклик include, має доступ до змінних включеного файлу, тому інші включені файли НЕ мають доступу до цих змінних. Це правильно?
maxedison

24
Так, це звучить правильно. Вибачте, якщо я те, що сказав, заплутав. Я редагував його як 5 разів, тому що мені було дуже важко описати процес, не втрачаючи вас. Отже, батьківський файл має доступ до змінних в обох включених файлах, але включений файл не має доступу до іншого включеного файлу. Якщо це має якийсь сенс.
Michael Irigoyen

Окрім прийнятої відповіді, її виправлення також є помилковим (або застарілим). У PHP7 (принаймні) я можу визначити змінну в included1.phpі посилатися на неї пізніше, included2.phpне посилаючись на неї parent.php, і отримати значення, яке я визначив у included1.php. Я дотримуюсь тих самих правил обсягу, як і у випадку, якщо код розміщений на одній сторінці. Нічого більше.
biscuitstack

3
Проголосували проти, оскільки перші два абзаци явно суперечать наступному реченню.
Джошуа Флуд

Коротше кажучи: додайте включений файл до функції та передайте необхідні змінні як параметри. Це неприємно, але це працює. 😒︀
Джон

32

Ось підводного каменю, якого слід уникати. Якщо вам потрібен доступ до вашої змінної $ 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 $varперш ніж використовувати це в іншій функції.
Chris Happy

2

Це все, що вам потрібно зробити:

Попереду

global $name;
$name = 'james';

2
Додайте пояснення з відповіддю на те, як ця відповідь допомагає ОП у вирішенні поточної проблеми
ρяσѕρєя K

1
У мене була та сама проблема, як описана maxedison. Я також був плутаний з багатьма відповідями: "процес php включає, як ви копіюєте та вставляєте ...", що не відповідає дійсності, і завдяки поясненню Майкла під його відповіддю я розумію, що код у включеному файлі не розпізнає глобальну змінну, визначену в попередньому файлі включення . У своїх експериментах я також зустрів, що якщо я використовую "глобальне" ключове слово у першій iclude, це можна виправити, - відповів Пол. Але де я можу знайти обидва випадки, описані в документації PHP? І друге питання, якщо обидва не відповідають дійсності лише з якоїсь версії PHP?
StackPeter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.