我希望我的函数能够专门从其父函数访问外部变量。但是,使用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'
?>
答案 0 :(得分:27)
仅仅为了举例,如果我理解你要做什么,你可以使用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 />'
闭包最常用于回调函数。但是,这可能不是使用它的最佳方案。正如其他人所说,仅仅因为你可以做某事并不意味着它是最好的主意。
答案 1 :(得分:9)
PHP没有嵌套函数或作用域的概念,嵌套函数是一种可怕的做法。会发生什么是PHP只是遇到一个函数声明并创建一个正常的函数second
。如果您再次尝试调用first
,PHP将再次遇到second
的函数声明并崩溃,因为函数second
已经声明。因此,不要在函数内声明函数。
对于传递值,要么显式地将它们作为函数参数传递,要么如果有意义的话,创建一个类 。