PHP - self, static или $this в функции обратного вызова

Можно ли получить доступ к классам/объектам, обозначенным как self, static и $this в анонимных обратных вызовах в PHP? Именно так:

class Foo {
    const BAZ = 5;
    public static function bar() {
         echo self::BAZ; // it works OK
         array_filter(array(1,3,5), function($number) /* use(self) */ {
             return $number !== self::BAZ; // I cannot access self from here
         });
    }
}

Есть ли способ заставить его вести себя как с обычными переменными, используя предложение use(self)?


person Pavel S.    schedule 25.02.2012    source источник
comment
Начиная с PHP 5.4 можно использовать $this.   -  person Dejan Marjanović    schedule 25.02.2012
comment
(связано) PHP 5.4 - 'закрытие $ эта поддержка'   -  person Gordon    schedule 25.02.2012


Ответы (3)


С PHP5.4 это будет. Пока это невозможно. Однако, если вам нужен доступ только к общедоступным свойствам, метод

$that = $this;
function () use ($that) { echo $that->doSomething(); }

Для констант нет причин не использовать полное имя

function () { echo Classname::FOO; }
person KingCrunch    schedule 25.02.2012
comment
Спасибо за ответ. Однако невозможно использовать имя класса, если мне нужно заменить static::FOO, то есть позднее связывание. - person Pavel S.; 25.02.2012
comment
Похоже, вы больше ищете свойства класса (также известные как статические свойства), чем константы. Однако в первом примере в моем ответе вы сможете вызывать константу, например $that::FOO. - person KingCrunch; 25.02.2012
comment
На самом деле, я думаю, что делать то, что хочет OP с поздним связыванием, было бы не так: $that=static::FOO; - person Tim Seguine; 27.08.2013
comment
@Tim Closures не являются объектами (на самом деле они есть, но это скорее деталь реализации и не должна вас беспокоить), поэтому нет static и self, но последний можно легко заменить конкретным именем класса. static в любом случае имеет очень ограниченное применение, и вам следует дважды подумать, если оно вам действительно нужно. - person KingCrunch; 29.08.2013
comment
Я думаю, вы неправильно поняли, что я хотел сказать. Я понимаю все, что вы говорите. Я указывал, что ваш ответ на запрос ОП о поздней статической привязке не сработает. Решением будет заменить первую строку вашего первого блока кода на $that=static::FOO; Это обеспечит позднюю статическую привязку в точке создания закрытия, что является лучшим, что можно сделать в php 5.3. - person Tim Seguine; 01.09.2013
comment
@ Тим, я уже понял. Пожалуйста, покажите мне один случай для static::, который не связан с ORM, ActiveRecord или чем-то подобным ;) Вот что я хочу сказать: на самом деле других вариантов использования нет, поэтому этот обходной путь также делает это. , если вам это действительно нужно: $class = get_class($this); $closure = function () use ($class) { echo $class::FOO; }. Разве это не красиво, но вы, вероятно, никогда этого не увидите :D - person KingCrunch; 02.09.2013
comment
Ладно, значит, я неправильно понял ваше возражение. Это весь код, который я бы никогда не написал :) - person Tim Seguine; 03.09.2013

Просто используйте стандартный способ:

Foo::BAZ;

or

$baz = self::BAZ;
... function($number) use($baz) {
   $baz;
}
person dynamic    schedule 25.02.2012

Что насчет этого:

class Foo {
    const BAZ = 5;
    $self = __class__;
    public static function bar() {
         echo self::BAZ; // it works OK
         array_filter(array(1,3,5), function($number) use($self) {
             return $number !== $self::BAZ; // access to self, just your const must be public
         });
    }
}
person Gosha Lem    schedule 13.11.2017