从闭包内访问私有变量
我试图从闭包中引用对象的私有变量。下面的代码似乎可以工作,但它抱怨 Fatal error: Cannot access self:: when no class scope is active in test.php on line 12
和 Fatal error: Using $this when不在 test.php 第 20 行的对象上下文中。
任何想法如何使用闭包实现相同的结果,同时保持变量私有并且不创建辅助函数(击败私有变量的整个想法)。
class MyClass
{
static private $_var1;
private $_var2;
static function setVar1( $value )
{
$closure = function () use ( $value ) {
self::$_var1 = $value;
};
$closure();
}
function setVar2( $value )
{
$closure = function () use ( $value ) {
$this->_var2 = $value;
};
$closure();
}
}
MyClass::setVar1( "hello" ); //doesn't work
$myclass = new MyClass;
$myclass->setVar2( "hello" ); //doesn't work
I'm trying to reference a private variable of an object from within a closure. The code below would seem to work, but it complains Fatal error: Cannot access self:: when no class scope is active in test.php on line 12
and Fatal error: Using $this when not in object context in test.php on line 20
.
Any ideas how to accomplish the same results using a closure while keeping the variables private and without making helper functions (defeating the whole idea of a private variable).
class MyClass
{
static private $_var1;
private $_var2;
static function setVar1( $value )
{
$closure = function () use ( $value ) {
self::$_var1 = $value;
};
$closure();
}
function setVar2( $value )
{
$closure = function () use ( $value ) {
$this->_var2 = $value;
};
$closure();
}
}
MyClass::setVar1( "hello" ); //doesn't work
$myclass = new MyClass;
$myclass->setVar2( "hello" ); //doesn't work
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
编辑注意,这个答案最初是针对PHP5.3及更早版本的,现在是可能的。有关最新信息,请参阅此答案。
这不是直接可能的。特别是,闭包没有关联的作用域,因此它们无法访问私有和受保护的成员。
但是,您可以使用参考:
Edit to note, this answer was originally meant for PHP5.3 and earlier, it's possible now. For current information, see this answer.
This is not directly possible. In particularly, closures have no associated scope, so they cannot access private and protected members.
You can, however, use references:
从 PHP 5.4.0 开始可以实现这一点
This is possible starting in PHP 5.4.0
闭包没有
$this
或self
的概念——它们不以这种方式绑定到对象。这意味着您必须通过use
子句传递变量...类似于:我还没有测试上面的代码,但我相信它是正确的。
Closures have no concept of
$this
orself
-- they are not tied to objects in that way. This means that you would have to pass the variables through theuse
clause... something like:I haven't tested the above code, but I believe it to be correct.