匿名函数 - 声明全局变量和在php中使用之间的区别是什么?

时间:2015-09-23 12:46:57

标签: php anonymous-function

在学习PHP中的匿名函数时,我遇到了这个问题:

  

匿名函数可以使用其封闭中定义的变量   范围使用使用语法。

例如:

    $test = array("hello", "there", "what's up");
    $useRandom = "random";

    $result = usort($test, function($a, $b) use ($useRandom){

                                if($useRandom=="random")
                                    return rand(0,2) - 1;
                                else
                                    return strlen($a) - strlen($b);
                            } 
                    );

为什么我不能像下面那样只使用$ useRandom 全球

    $test2 = array("hello", "there", "what's up");
    $useRandom = "random";

    $result = usort($test, function($a, $b){

                                global $useRandom;

                                if($useRandom=="random")
                                    return rand(0,2) - 1;
                                else
                                    return strlen($a) - strlen($b);
                            } 
                    );

这两种方法有什么区别?

2 个答案:

答案 0 :(得分:4)

您的示例有点简化。为了获得差异,尝试将示例代码包装到另一个函数中,从而围绕内部回调创建一个额外的范围,这不是全局的。

在以下示例中,$useRandom在排序回调中始终为null,因为没有名为$useRandom的全局变量。您需要使用use来访问非全局范围的外部作用域中的变量。

function test()
{
    $test = array( "hello", "there", "what's up" );
    $useRandom = "random";

    $result = usort( $test, function ( $a, $b ) {

            global $useRandom;
            // isset( $useRandom ) == false

            if( $useRandom == "random" ) {
                return rand( 0, 2 ) - 1;
            }
            else {
                return strlen( $a ) - strlen( $b );
            }
        }
    );
}

test();

另一方面,如果存在全局变量$useRandom,则可以使用use仅访问一个范围。在下一个示例中,$useRandom再次为null,因为它定义了两个范围“更高”,而use关键字仅直接从当前范围之外的范围导入变量。

$useRandom = "random";

function test()
{
    $test = array( "hello", "there", "what's up" );

    $result = usort( $test, function ( $a, $b ) use ( $useRandom ) {

            // isset( $useRandom ) == false

            if( $useRandom == "random" ) {
                return rand( 0, 2 ) - 1;
            }
            else {
                return strlen( $a ) - strlen( $b );
            }
        }
    );
}

test();

答案 1 :(得分:3)

出于多种原因,你必须小心全局变量,其中最重要的是出乎意料的行为:

 <?php echo $this->getReviewsSummaryHtml($_product, 'default', true)?>

在这个例子中,您可能希望一旦将变量设为全局变量,它就可用于后续函数。运行此代码的结果表明此不是的情况:

  

我是全球性的吗?是的,我是。

     

全球无法使用。

以这种方式声明全局使得变量在其全局声明(在本例中为函数$foo = 'Am I a global?'; function testGlobal(){ global $foo; echo $foo . ' Yes, I am.<br />'; } function testAgain() { if(isset($foo)) { echo $foo . ' Yes, I am still global'; } else { echo 'Global not available.<br />'; } } testGlobal(); testAgain(); )的范围内可用,但不在脚本的一般范围内。

Using Globals上查看此答案以及为什么这是一个坏主意。