PHP: функции понятия не имеют, переменные даже существуют - PullRequest
2 голосов
/ 23 января 2010

Я заметил раздражающую особенность в PHP (работает 5.2.11). Если одна страница включает в себя другую страницу (и обе содержат свои собственные переменные и функции), обе страницы знают о переменных друг друга. Однако их функции, похоже, не знают ни о каких переменных (кроме тех, которые объявлены внутри функции).

Мой вопрос: Почему это происходит? Как сделать так, чтобы это произошло , а не , или как лучше это сделать?

Ниже приведен пример того, что я описываю.

Главная страница:

<?php
$myvar = "myvar.";
include('page2.php');

echo "Main script says: $somevar and $myvar\n";
doStuff();
doMoreStuff();
function doStuff() {
    echo "Main function says: $somevar and $myvar\n";
}
echo "The end.";
?>

page2.php:

<?php
$somevar = "Success!";

echo "Included script says: $somevar and $myvar\n";

function doMoreStuff() {
    echo "Included function says: $somevar and $myvar\n";
}
?>

Выход:

Included script says: Success! and myvar.<br> Main script says: Success! and myvar.<br> Main function says: and<br> Included function says: and<br> The end.

Обе страницы выводят переменные просто отлично. Их функции нет.
WRYYYYYY

Ответы [ 3 ]

11 голосов
/ 23 января 2010

Вам необходимо использовать global перед использованием внешних переменных в области действия функции:


function doStuff() {
    global $somevar, $myvar;
    echo "Main function says: $somevar and $myvar\n";
}

Более подробное объяснение предоставлено по адресу: http://us.php.net/manual/en/language.variables.scope.php

Как точно указали комментарии и другие ответы, глобалы могут быть злыми . Проверьте эту статью, объясняя, почему: http://my.opera.com/zomg/blog/2007/08/30/globals-are-evil

5 голосов
/ 23 января 2010

Хотя вы можете использовать глобальные переменные, обычно рекомендуется передавать переменные в качестве параметров в функции при вызове. Это гарантирует, что вы точно знаете, какие переменные ожидает функция для правильного выполнения. Это не ошибка , просто предполагаемая функциональность .

$someVar = 'hey';
$myVar = 'you';

doStuff($someVar, $myVar);
doMoreStuff($someVar, $myVar);


function doStuff($somevar, $myvar) {
    echo "Main function says: $somevar and $myvar\n";
}

function doMoreStuff($somevar, $myvar) {
    echo "More function says: $somevar and $myvar\n";
}

Также обратите внимание, что переменные вне области действия функции не обязательно должны иметь совпадающие имена в качестве самих параметров функции. Это позволяет вам делать такие вещи, как:

$badVar = 'look at me, im a bad var.';
goodFunction($badVar);

function goodFunction ($goodVar) {
    // output: look at me, im a good var
    echo str_replace('bad', 'good', $goodVar);
}
0 голосов
/ 23 января 2010

php не имеет иерархии областей видимости, то есть функции не знают переменных (или глобальных) друг друга.Это немного странно, если вы раньше работали с другими языками, но по сути это хорошая вещь, потому что глобалы - это «зло».Наилучший подход - полностью их избегать.

...