Я пытаюсь изучить PHP, и теперь я застрял в «статической анонимной функции».
Я нашел это в учебнике ( http://www.slideshare.net/melechi/php-53-part-2-lambda-functions-closures-presentation )
Ориентация объектов
- Лямбда-функции – это закрытие, потому что они автоматически привязаны к сфере действия класса, в котором они созданы.
- '
$this
' не всегда требуется в области.- Удаление «
$this
» может быть сохранено в памяти.- Вы можете заблокировать это поведение, объявив функцию лямбда как статическую. "
Что не так с этим кодом?
Я получаю эту ошибку:
Ошибка анализа: ошибка синтаксического анализа, ожидающая `T_PAAMAYIM_NEKUDOTAYIM 'в C: \ wamp \ www \ z-final \ a.php в строке 11
Почему эта строка кода не работает? Return static function () {var_dump ($ this);}; " ?
class foo { public function getLambda() { return function(){var_dump($this);}; } public function getStaticLambda() { return static function(){var_dump($this);}; } } $foo = new foo(); $lambda = $foo->getLambda(); $staticLambda = $foo->getStaticLambda(); $lambda(); $staticLambda();
Да, это вполне допустимый синтаксис в 5.4+.
В принципе, это предотвращает автоматическую привязку текущего класса к закрытию (фактически, он предотвращает все привязки, но больше об этом позже).
class Foo { public function bar() { return static function() { var_dump($this); }; } public function baz() { return function() { var_dump($this); }; } }
Если мы создадим экземпляр, который на 5.4+, возврат bar()
будет иметь значение $this
set равное null. Как будто вы сделали статический звонок. Но baz()
имел бы $this
набор для экземпляра foo, который вы назвали baz()
.
Так:
$bar = $f->bar(); $bar();
Результаты в:
Примечание. Неопределенная переменная: это в / in / Bpd3d в строке 5
НОЛЬ
А также
$baz = $f->baz(); $baz();
Результаты в
объект (Foo) # 1 (0) {
}
Имеют смысл? Отлично.
Теперь, что произойдет, если мы возьмем замыкания, определенные вне функции:
$a = function() { var_dump($this); }; $a();
Мы получаем null
(и уведомление)
$c = $a->bindTo(new StdClass()); $c();
Мы получаем StdClass
, как и ожидали
$b = static function() { var_dump($this); }; $b();
Мы получаем null
(и уведомление)
$d = $b->bindTo(new StdClass()); $d();
Здесь все становится интересным. Теперь мы получаем предупреждение, уведомление и null:
Предупреждение: невозможно привязать экземпляр к статическому закрытию в / in / h63iF в строке 12
Примечание. Неопределенная переменная: это в / in / h63iF в строке 9
НОЛЬ
Таким образом, в 5.4+ вы можете объявить статическое закрытие, из-за чего он никогда не получает $this
привязки к нему, и вы не можете привязать к нему объект …
Не нужно определять его с помощью ключевого слова static
.
<?php class House { public function paint($color) { return function() use ($color) { return "Painting the house $color..."; }; } } $house = new House(); $callback = $house->paint('red'); var_dump($callback); // object(Closure)#2 (2) {..} var_dump($callback()); // "Painting the house red..."