PHP 5 - переменная область действия включаемых файлов без классов и функций - PullRequest
6 голосов
/ 20 мая 2011

Я прочитал много-много веток по этому вопросу и до сих пор не могу обдумать это.

Вот моя основная проблема:

header.php включает файл с именем navigation.php.В пределах navigation.php, $previous и $next определены.Используя эхо-операторы, я убедился, что они имеют значения.

Далее header.php включает файл с именем backnext.php.Мне нужно backnext.php, чтобы узнать значения $previous и $next.Если я объявлю их как global в верхней части backnext.php, я не получу ошибок, но операторы echo показывают, что они пусты.Если нет, я получаю ошибку undefined variable.

Где именно мне нужно объявить их как global, чтобы backnext.php мог правильно читать их значения?

Ни один из этих файлов не использует функции или классы.

Ответы [ 2 ]

8 голосов
/ 20 мая 2011

Если ни один из этих файлов не имеет функций или классов, тогда $prev и $next находятся в глобальной области видимости и должны просматриваться всеми вашими включаемыми файлами, и вам не нужно использовать ключевое слово global.

Похоже, порядок ваших включений может быть немного неправильным.

Обновление:

Если я правильно понимаю, у вас есть что-то вроде этого:

header.php:

<?php
echo "In header.php\n";

require_once("navigation.php");
require_once("backnext.php");

echo "Also seen in header.php:\n";
echo "prev=$prev\n";
echo "next=$next\n";
?>

navigation.php:

<?php
echo "In navigation.php\n";
$prev = "Hello World#1";
$next = "Hello World#2";
echo "Exiting navigation.php\n";
?>

backnext.php:

<?php
echo "In backnext.php\n";
echo "prev=$prev\n";
echo "next=$next\n";
echo "Exiting backnext.php\n";
?>

Если я запускаю это, я получаю:

In header.php
In navigation.php
Exiting navigation.php
In backnext.php
prev=Hello World#1
next=Hello World#2
Exiting backnext.php
Also seen in header.ph
prev=Hello World#1
next=Hello World#2

backnext.php может видеть как $prev, так и $next.

1 голос
/ 20 мая 2011

Я думаю, что у вас, вероятно, есть логическая ошибка где-то, где содержимое переменных стирается, или, как @Kev указал, что поток выполнения неверен. Вот некоторый тестовый код:

Файл: test.php

<?php
    $test = "Hi!";
    require_once 'test2.php';
    require_once 'test3.php';
?>

Файл: test2.php

<?php
    echo("Test 2: " . $test . "<br/>");
?>

Файл: test3.php

<?php
    echo("Test 3: " . $test . "<br/>");
?>

Это приводит к выводу:

Test 2: Hi!
Test 3: Hi!

Что доказывает, что переменная $test имеет глобальную область видимости и должна быть доступна любому сценарию после ее определения.

PS- Не полагайтесь на пользователей SO, чтобы предоставить ваш справочный материал. Идите прямо к источнику: Область переменных - Руководство по PHP Первый абзац на этой странице гласит:

Область действия переменной - это контекст в пределах которого это определено. Для большая часть всех переменных PHP имеет только единая сфера. Эта единственная сфера включенные пробы и необходимые файлы как хорошо.

Редактировать

Попробуйте это в header.php и посмотрите, что произойдет:

<?php
    include 'navigation.php';
    echo($previous . " ; " . $next . "<br/>");
    include 'backnext.php';
    echo($previous . " ; " . $next . "<br/>");
?>

Если вы не получаете один и тот же вывод оба раза, то в backnext.php есть проблема, когда переменные стираются. Если он выдает тот же результат, переместите эхо-сигналы внутрь backnext.php в самом верху и в самом низу. Логически это не на самом деле их перемещение, но вы можете продолжать перемещать их все ближе и ближе друг к другу, пока не найдете причину проблемы.

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