Закрытие 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
Ответы
Ответ 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
как статические.