开发者

PHP: Functions have no idea variables even exist

I've noticed an annoying peculiarity in PHP (running 5.2.11). If one page includes another page (and both contain their own variables and functions), both pages are aware of each others' variables. However, their functions seem to be aware of no variables at all (except those declared within the function).

My question: Why does that happen? How do I make it not happen, or what's a better way to go about this?

An example of what I'm describing follows.

Main page:

<?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";
}
?>

The output:

Included script says: Success! and myvar.

Main script says: Success! and myvar.

Main function says: and

Included function says: and

The end.

Both pages output the variables just fine. Their functions do not.

WRYYYYYY


You need to use global before using outside-defined variables in a function scope:


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

More detailed explanation provided at: http://us.php.net/manual/en/language.variables.scope.php

As comments & other answers pointed out accurately, globals can be evil. Check out this article explaining just why: http://my.opera.com/zomg/blog/2007/08/30/globals-are-evil


While you could be using global variables, it's generally good practice to pass the variables in as parameters to the functions upon calling. This ensures you know exactly what variables a function is expecting for proper execution. This is not a bug, just intended functionality.

$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";
}

Also notice that the variables outside of the function scope do not have to have matching names as the function parameters themselves. This allows you to do things like:

$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);
}


php has no scoping hierarchy, that is, functions are not aware of each others' (or global) variables. This is a bit weird if you worked with other languages before, but it's essentially a Good Thing, because globals are "evil". The best approach is to avoid them altogether.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜