从闭包中访问私有变量

Ken*_*ins 12 php closures scope

我试图从一个闭包中引用一个对象的私有变量.下面的代码似乎有效,但它抱怨Fatal error: Cannot access self:: when no class scope is active in test.php on line 12Fatal error: Using $this when not in object context in test.php on line 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
Run Code Online (Sandbox Code Playgroud)

Art*_*cto 14

编辑注意,这个答案最初是针对PHP5.3及更早版本的,现在可能.有关最新信息,请参阅此答案.


这不是直接可能的.特别是,闭包没有相关的范围,因此它们无法访问私有和受保护的成员.

但是,您可以使用引用:

<?php
class MyClass
{

    static private $_var1;
    private $_var2;

    static function setVar1( $value )
    {
        $field =& self::$_var1;
        $closure = function () use ( $value,  &$field ) {
            $field = $value;
        };
        $closure();
    }

    function setVar2( $value )
    {
        $field =& $this->_var2;
        $closure = function () use ( $value, &$field ) {
            $field = $value;
        };
        $closure();
    }

}

MyClass::setVar1( "hello" );

$myclass = new MyClass;
$myclass->setVar2( "hello" );
Run Code Online (Sandbox Code Playgroud)