PHP:函数甚至不存在变量

dop*_*ner 2 php variables function

我注意到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.";
?>
Run Code Online (Sandbox Code Playgroud)

使page2.php:

<?php
$somevar = "Success!";

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

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

输出:

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

两个页面输出变量就好了.他们的职能没有.
WRYYYYYY

Joe*_*ldi 11

global在函数范围中使用外部定义的变量之前需要使用:


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

更详细的解释提供于:http://us.php.net/manual/en/language.variables.scope.php

正如评论和其他答案准确指出的那样,全局变量可能是邪恶的.看看这篇文章解释原因:http://my.opera.com/zomg/blog/2007/08/30/globals-are-evil

  • 没错,但是一个坏主意 - 在大多数情况下,全局变量在使用参数方面是不好的.:-) (4认同)
  • 不好的想法,但它遵循原始代码的想法.更明智的解决方案是将变量作为参数或类似的东西传递. (3认同)

Cor*_*lou 5

虽然您可以使用全局变量,但通常很好的做法是在调用时将变量作为参数传递给函数.这可以确保您确切地知道函数期望正确执行的变量.这不是一个错误,只是预期的功能.

$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";
}
Run Code Online (Sandbox Code Playgroud)

另请注意,函数作用域之外的变量不必具有匹配的名称作为函数参数本身.这允许您执行以下操作:

$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);
}
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,你真的应该考虑将这些信息存储在某种对象结构而不是全局. (3认同)