【发布时间】:2011-01-25 10:03:59
【问题描述】:
是否可以在 PHP 子函数中访问外部局部变量?
在下面的代码中,我想访问内部函数栏中的变量$l。在 bar 中将 $l 声明为 global $l 不起作用。
function foo()
{
$l = "xyz";
function bar()
{
echo $l;
}
bar();
}
foo();
【问题讨论】:
是否可以在 PHP 子函数中访问外部局部变量?
在下面的代码中,我想访问内部函数栏中的变量$l。在 bar 中将 $l 声明为 global $l 不起作用。
function foo()
{
$l = "xyz";
function bar()
{
echo $l;
}
bar();
}
foo();
【问题讨论】:
function a()
{
function val1($arg=null)
{
static $a;
if ($arg !== null) $a = $arg;
else return $a;
}
function b()
{
val1('1234');
echo val1() . '<br>'; // shows: 1234
val1('my custom data');
echo val1() . '<br>'; // shows: my custom data
}
b();
}
a();
使用val1('my custom data')设置我的值
使用val1() 获取我的价值
【讨论】:
您可能可以使用闭包来做到这一点......
编辑:花了一些时间来记住语法,但它是这样的:
function foo()
{
$l = "xyz";
$bar = function () use ($l)
{
var_dump($l);
};
$bar();
}
foo();
并且,运行脚本,你会得到:
$ php temp.php
string(3) "xyz"
几个注意事项:
;!use 变量,在其名称前加上&:use (& $l)
更多信息,作为参考,你可以看看手册中的这个页面:Anonymous functions
【讨论】:
[&] 表示法(C++ 的[] 等同于PHP 的use())但是PHP 中的use(&) 不起作用。在一个有很多局部变量的函数中,最好能写一些简短的东西而不是use($foo, $bar, /*lots of other variables*/)。
您可以通过以下方式读取默认值:
function(){
return preg_match(
"yourVar = \d+"
, str_file_get_contents(functionFile)
, arrayToPutFieldsValue
);
}
如果您同时使用两个功能 - 就像有人在使用勺子,而您想从勺子中取食物 - 您会浪费食物,或者您中的一些人会挨饿。 无论如何-您将不得不以某种困难的方式设置指针。 如果不调用它,就不可能从其他函数或类中获取任何字段。 函数/方法类似于实例——它们需要被调用。
通过使用同步函数访问全局字段来共享公共字段。
【讨论】:
您必须使用use 关键字。
$bar = function() use(&$l) {
};
$bar();
在非常古老的 PHP 5.2 和更早版本中,这不起作用。你得到的语法不是闭包,而是全局函数的定义。
function foo() { function bar() { } }
工作原理与:
function foo() { include "file_with_function_bar.php"; }
如果你执行函数foo 两次,PHP 会抱怨你试图重新定义一个(全局)函数bar。
【讨论】:
use'd 变量?死是什么意思(不是刻薄,只是想知道)。 die 是否意味着该变量无法使用或必须通过其他方式重新建立?我猜它会死掉(在任何意义上),因为它们都指向的共享位置在第一次执行后无法重新指向?如果将变量设为静态然后立即取消设置怎么办?
die("Fatal Error")。 PHP