2011-12-05 41 views
3

我希望我的函数专门访问外部变量 - 从其父函数。但是,使用global关键字设置的范围太宽;我需要限制它。我如何获得这个代码来吐出'Level 2'而不是'Level 1'?我需要上课吗?如何从父函数的作用域访问变量?

<?php 
$a = "Level 1"; 

function first() { 
    $a = "Level 2"; 

    function second() { 
     global $a; 
     echo $a.'<br />'; 
    } 

    second(); 
} 

first(); 
//outputs 'Level 1' 
?> 

回答

9

PHP没有嵌套函数或范围的概念,嵌套函数的做法很糟糕。会发生什么是PHP只是遇到一个函数声明并创建一个正常的函数second。如果您尝试再次调用first,则PHP将再次遇到second的函数声明并崩溃,因为函数second已被声明。因此,不要在函数内声明函数。

至于传递值,或者明确地将它们作为函数参数传递,或者如您所说,创建类(如果有意义的话)

+0

啊哈!感谢您的教育答案。这很有道理,你解释得很好。我会尝试函数参数路由。 –

+0

也可以防御性地检查'if(function_exists('second')){} – WraithKenny

25

只是为了举例起见,如果我理解你想要做什么,你可以使用一个closure(PHP 5.3+),为“闭包也可以继承父范围变量”与use关键词。

$a = "Level 1"; 

function first() { 
    $a = "Level 2"; 

    $func = function() use ($a) { 
     echo $a.'<br />'; 
    }; 

    $func(); 
} 

first(); 
// prints 'Level 2<br />' 

闭包最常用于回调函数。但是,这可能不是使用最佳方案。正如其他人所建议的,仅仅因为你可以做点什么并不意味着它是最好的主意。

+0

哇,你们很快。我会将此建议搁置以备将来参考。谢谢! –

+0

我还需要将数据传入和传出回调函数,所以我必须编写'use(&$ a)'来通过引用传递它。 (记住preg_replace_callback场景中的匹配。) – ygoe