类A
的成员具有函数:
class A {
public function foo() {
static $x=2;
function bar() {
echo "x=$x";
}
bar();
}
}
$a = new A();
$a->foo();
这会在行echo "x=$x";
中出现错误。
如何从功能$x
中的班级成员foo()
访问bar()
?
我使用的是PHP 5.5.9。
答案 0 :(得分:2)
不要尝试在函数中声明静态变量。
class A {
protected static $x = 2;
public function foo() {
function bar() {
echo "x=" . self::$x;
}
bar();
}
}
$a = new A();
$a->foo();
答案 1 :(得分:0)
最后找到了一个解决方案,基于@ishegg的封闭理念:
class A {
public function foo() {
static $x=2;
$bar = function () use (&$x,&$bar) {
echo "x=$x\n";
if (++$x<6) $bar();
};
$bar();
}
}
$a = new A();
$a->foo();
这种递归是可能的,因为闭包作为参考传递给它自己。由于引用只是一个指针,因此可以在完全定义函数之前对其进行求值。所以解决方案有效地依赖于通过引用传递的闭包。
请注意,$x
也已作为参考&$x
传递,否则我们只会获得$x
的副本,而静态变量$x
永远不会更改。
像魅力一样运行:https://3v4l.org/U293s
结果:
x=2
x=3
x=4
x=5