Подтвердить что ты не робот

Закрытие php: почему "static" в объявлении анонимной функции при привязке к статическому классу?

Пример в документации php на Closure::bind включает static в объявление анонимной функции. Зачем? Я не могу найти разницу, если он удален.

с

class A { private static $sfoo = 1; }
$cl1 = static function() { return self::$sfoo; }; // notice the "static"
$bcl1 = Closure::bind($cl1, null, 'A');
echo $bcl1(); // output: 1

без

class A { private static $sfoo = 1; }
$cl1 = function() { return self::$sfoo; };
$bcl1 = Closure::bind($cl1, null, 'A');
echo $bcl1(); // output: 1
4b9b3361

Ответ 1

Как вы заметили, это не имеет большого значения, хотя может показаться ошибкой, если в error_reporting включен E_STRICT. (Обновление: нет, это не так)

Это похоже на использование ключевого слова static в методе класса. Вам не обязательно это нужно, если вы не ссылаетесь на $this внутри метода (хотя это нарушает строгие стандарты).

Я полагаю, PHP может работать, вы имеете в виду Closure для доступа к A статически из-за null второго аргумента bind()

Ответ 2

нашел разницу: вы не можете привязывать статические замыкания к объекту, а только изменять область объекта.

class foo { }

$cl = static function() { };

Closure::bind($cl, new foo); // PHP Warning:  Cannot bind an instance to a static closure
Closure::bind($cl, null, 'foo') // you can change the closure scope

Ответ 3

Статические замыкания, как и любой другой статический метод, не могут получить доступ к $this.

Как и любой другой метод, нестатическое замыкание, которое не имеет доступа к $this, обычно работает в статическом контексте.

Однако статические замыкания, как и любой другой статический метод, имеют небольшое преимущество в производительности по сравнению с нестатическими замыканиями, поэтому в интересах оптимизации микрокода я лично рекомендую объявлять любые замыкания, которым не требуется доступ к $this как статические.