Этот сайт — моя персональная записная книжка. Интересны мне, по большей части, программирование, история и события из моей жизни.

PHP: что ты такое?

Мне сегодня показали вот такой код и спросили, знал ли я, что так можно. Речь идёт о вызове $this::w00t(). То есть мы используем $this как бы в статическом контексте. Мне бы такое в голову не пришло.

Код ниже, понятное дело, чисто демонстрационный.

Нет, я не знал, но, как ни удивительно, эта конструкция работает! Причём работает уже очень давно — это не свежее веяние: она появилась ещё в версии 5.4!

(new class() {
    public function w00t():void {
        echo "WHAT THE HELL ARE YOU?\n";
    }

    public function test():void {
        $this::w00t();
    }
})->test();

Дополнено: работает как эквивалент static, что ожидаемо, конечно.

2 комментария
Макс 24 дн

Насколько я понял, это типо как в пайтоне:
@staticmethod
def s():
print(«ok»)

def m(self):
self.s()

Но выглядит эстетичней.

Евгений Степанищев 23 дн

Обычный и привычный способ работы с  «$this» такой: «$this->w00t()». Через двоеточия — это статический контекст.

Макс 23 дн

Да, как в перле. Только в перле это не работает. А примером я хотел написать, что Пайтон сам видит контекст и если метод статический, то объект не передаёт. В этом элегантность

Евгений Степанищев 23 дн

Ну, я знаю и как в Перле, и как в Пайтоне, но мне не кажется, что похоже.