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.
WRYYYYYYYou 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.
精彩评论