Есть ли способ, чтобы можно было неявно объявлять переменные верхнего уровня глобальными для использования в закрытии?
Например, если вы работаете с таким кодом:
$a = 0; //A TOP-LEVEL VARIABLE Alpha::create('myAlpha') ->bind(DataSingleton::getInstance() ->query('c') ) ->addBeta('myBeta', function($obj){ $obj->bind(DataSingleton::getInstance() ->query('d') ) ->addGamma('myGamma', function($obj){ $obj->bind(DataSingleton::getInstance() ->query('a') ) ->addDelta('myDelta', function($obj){ $obj->bind(DataSingleton::getInstance() ->query('b') ); }); }) ->addGamma('myGamma', function($obj){ $a++; //OUT OF MY SCOPE $obj->bind(DataSingleton::getInstance() ->query('c') ) . . .
Затворы вызываются из метода как такового:
public function __construct($name, $closure = null){ $this->_name = $name; is_callable($closure) ? $closure($this) : null; }
Итак, в резюме / TL; DR, существует ли способ неявно объявлять переменные глобальными для использования в закрытиях (или других функциях, которые, как я полагаю), не используя global
ключевое слово или глобальный глобальный глобальный глобальный?
Я начал эту тему на другом форуме, который я часто посещал ( http://www.vbforums.com/showthread.php?p=3905718#post3905718 )
Вы должны объявить их в определении закрытия:
->addBeta('myBeta', function($obj) use ($a) { // ...
В противном случае вы должны использовать ключевое слово global
. Вы должны сделать это для каждого закрытия, которое также использует $a
.