代码之家  ›  专栏  ›  技术社区  ›  doppelgreener Perry Tew

函数甚至不知道变量是否存在

  •  2
  • doppelgreener Perry Tew  · 技术社区  · 15 年前

    我注意到PHP中有一个令人讨厌的特性(运行5.2.11)。如果一个页面包含另一个页面(两者都包含自己的变量和函数),则两个页面都知道彼此的变量。但是,它们的函数似乎根本不知道变量(除了在函数中声明的变量)。

    我的问题: 为什么会这样?我如何才能让它发生,或者有什么更好的方法来解决这个问题?

    下面是我描述的一个例子。

    主页面:

    <?PHP
    $myvar=“我的var。”;
    include('page2.php');
    
    echo“主脚本显示:$somevar和$myvar\n”;
    doSuffor();
    DimoRestufff();
    函数dostuf()。{
    echo“主函数说:$somevar和$myvar\n”;
    }
    回响“结束”。
    ?gt;
    < /代码> 
    
    

    第2页.php:。

    <?PHP
    $somevar=“成功!”;
    
    echo“包含的脚本说:$somevar和$myvar\n”;
    
    函数domorestuf()。{
    echo“included函数说:$somevar和$myvar\n”;
    }
    ?gt;
    < /代码> 
    
    

    输出:

    包含的脚本说:成功!和MyVa.
    主脚本说:成功!和MyVa.
    主功能显示:和
    包含的函数表示:
    结束。

    两个页面都输出变量。它们的功能没有。
    WRYYYYY

    我的问题:为什么会这样?我怎么做发生了,或者有什么更好的方法来解决这个问题?

    下面是我描述的一个例子。

    主页:

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

    PGE2.PHP:

    <?php
    $somevar = "Success!";
    
    echo "Included script says: $somevar and $myvar\n";
    
    function doMoreStuff() {
        echo "Included function says: $somevar and $myvar\n";
    }
    ?>
    

    输出:

    其中的剧本说:成功!和MyVar。
    主脚本说:成功!和MyVar。
    主要功能是:和
    包含的函数表示:和
    结束。

    两个页面都输出变量。它们的功能没有。
    韦里耶伊

    3 回复  |  直到 15 年前
        1
  •  11
  •   Joel A. Villarreal Bertoldi    15 年前

    你需要使用 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

        2
  •  5
  •   Corey Ballou    15 年前

    虽然您可以使用全局变量,但在调用时将变量作为参数传递给函数通常是一个好的实践。这样可以确保您确切地知道函数需要哪些变量才能正确执行。这个 不是bug ,只是 预期功能 .

    $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);
    }
    
        3
  •  -1
  •   user187291    15 年前

    PHP没有范围层次结构,也就是说,函数不知道彼此(或全局)的变量。如果你以前使用过其他语言,这有点奇怪,但这本质上是一件好事,因为全球语言是“邪恶的”。最好的方法是完全避免它们。