Как стать автором
Обновить

Комментарии 15

Спасибо за очередной дайджест!
Благодарю за отличный дайджейт :)
class Test {
    public function doWhatever(): static {
        // Do whatever.
        return $this;
    }
}


Интересно, каким образом в $this окажется родитель?
Статик говорит не о родителе, а о текущем классе.
Если унаследовать этот класс, то doWhatever будет возвращать объект того самого производного класса (как и без этой rfc). Только об этом вы явно укажите в возвращаемом типе и ваше IDE будет видеть дополнительные методы из производного класса.
Сейчас это делается через PHPDoc с помощью
@return static
Может я что-то не понимаю, но контроль типа в возвращаемом значении должен облегчать поиск ошибок. Это rfc ещё более ужесточает требование к значению, не только объект этого типа но ещё и тот самый, метод которого используется.
Так вот каким образом, если мы адекватны и возвращаем $this, в $this может быть что-то другое кроме именно этого конкретного объекта? Что мы в итоге контролируем?
Или только для IDE нужно? Но это странно
Быть может, это ограничение можно прочитать как «возвращаемый тип должен быть типом производного класса». Т.е. если в производном классе вернуть объект базового класса, то словим ошибочку.
Именно.
А еще этот PR по идее должен решить проблему с методами, возвращающими сами себя в интерфейсах(сейчас мы только можем вернуть исходный интерфейс). Вот синтетический пример абсолютно рабочего кода, но при этом невалидного с точки зрения статического анализатора:
interface Foo
{
    public function setA(int $a): Foo;
    public function doSomeStuff();
}

class Bar implements Foo
{
    private array $params = [];
    private int $a = 0;

    public function setA(int $a): Foo
    {
        $this->a = $a;
        return $this;
    }

   public function setSomeParams(array $params): self
   {
        $this->params = $params;
        return $this;
   }

    public function doSomeStuff()
    {
        //...
    }
}

(new Bar)
   ->setA(1)
    // Вот тут ИДЕ справедливо видит несовпадение типов
   ->setSomeParams(['baz' => 1])
   ->doSomeStuff()
;


Замена интерфейса на ключевое слово static в методе setA четко укажет, что метод возвращает себя(или хотя бы наследника), а не какую-то другую имплементацию Foo.
А чем
:self
в качестве возвращаемого типа плох?
Declaration of Bar::setA(int $a): Bar must be compatible with Foo::setA(int $a)
— вот этим, к сожалению.
Вы 7.4 пробовали?
Да, Вы правы, на 7.4 это валидный вариант.
Более того, с началом полноценного внедрения в PHP ко(нтр)вариативности для параметров и возвращаемых значений, что-то вообще не приходит в голову ни один пример, где static в качестве тайп-хинта хоть что-то добавляет.
Странные же люди :)
Писал nikic по поводу фичи Static return type аж 23 декабря.
Он так и не ответил, зато через 2.5 недели после письма выкатывает RFC.
Соавторство в 2019 2020 уже не то.
А что писал? Давай пруфы.

вы правда считаете, что по поводу static в return declaration писали только вы и самый первый аж 23-его декабря?) Ведь это на столько не очевидный кейс...

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории