Intereting Posts
Как предотвратить использование методов признаков из области «использования» в PHP Сравнение структуры php – благодаря своим уникальным функциям Как проверить, если строка php содержит только английские буквы и цифры? PHP reindex array? Корреляция Пирсона в PHP Тот же веб-сервер, тот же drupal, тот же db, один знак? Время истечения срока действия изображения Каков наилучший способ реализации коррекции опечаток в поиске в php / mysql? PHP: не удается отправить ошибку cookie сеанса Ларавель Валет не работает. 127.0.0.1 Соединение Отказано Получение информации из массива внутри массива (php) ограничить длину текста в php и предоставить ссылку «Читать дальше» WAMPserver – почему стек установлен с двумя файлами php.ini? Разница между установкой ID напрямую и установкой красноречивого отношения ассоциирования при сохранении модели в Laravel? Предупреждение: mysqli_select_db () ожидает ровно 2 параметра, 1 заданных в C: \

Действительно ли работает статическая анонимная функция PHP?

Я пытаюсь изучить 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..."