Acessando variables ​​privadas dentro de um fechamento

Estou tentando fazer referência a uma variável privada de um object dentro de um fechamento. O código abaixo parece funcionar, mas queixa o Fatal error: Cannot access self:: when no class scope is active in test.php on line 12 e Fatal error: Using $this when not in object context in test.php on line 20 .

Qualquer idéia de como realizar os mesmos resultados usando um fechamento, mantendo as variables ​​privadas e sem desempenhar funções auxiliares (derrotando toda a idéia de uma variável privada).

 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 

Editar para anotar, esta resposta foi originalmente significada para PHP5.3 e anterior, é possível agora. Para obter informações atualizadas, veja esta resposta .


Isso não é diretamente possível. Em particular, os encerramentos não têm alcance associado, portanto não podem acessar membros privados e protegidos.

No entanto, você pode usar referências:

 _var2; $closure = function () use ( $value, &$field ) { $field = $value; }; $closure(); } } MyClass::setVar1( "hello" ); $myclass = new MyClass; $myclass->setVar2( "hello" ); 

Isso é possível a partir do PHP 5.4.0

 class test { function testMe() { $test = new test; $func = function() use ($test) { $test->findMe(); // Can see protected method $test::findMeStatically(); // Can see static protected method }; $func(); return $func; } protected function findMe() { echo " [find Me] \n"; } protected static function findMeStatically() { echo " [find Me Statically] \n"; } } $test = new test; $func = $test->testMe(); $func(); // Can call from another context as long as // the closure was created in the proper context. 

Closures não tem conceito de $this ou self – eles não estão ligados a objects dessa maneira. Isso significa que você teria que passar as variables ​​através da cláusula de use … algo como:

 $_var1 =& self::$_var1; $closure = function() use ($value, &$_var1) { $_var1 = $value; }; $_var2 =& $this->_var2; $closure = function() use ($value, &$_var2) { $_var2 = $value; }; 

Não testei o código acima, mas acredito que esteja correto.

Intereting Posts