Comments 15
Спасибо за очередной дайджест!
+4
Благодарю за отличный дайджейт :)
+1
class Test {
public function doWhatever(): static {
// Do whatever.
return $this;
}
}
Интересно, каким образом в $this окажется родитель?
-1
Статик говорит не о родителе, а о текущем классе.
Если унаследовать этот класс, то doWhatever будет возвращать объект того самого производного класса (как и без этой rfc). Только об этом вы явно укажите в возвращаемом типе и ваше IDE будет видеть дополнительные методы из производного класса.
Сейчас это делается через PHPDoc с помощью
Если унаследовать этот класс, то doWhatever будет возвращать объект того самого производного класса (как и без этой rfc). Только об этом вы явно укажите в возвращаемом типе и ваше IDE будет видеть дополнительные методы из производного класса.
Сейчас это делается через PHPDoc с помощью
@return static
+1
Может я что-то не понимаю, но контроль типа в возвращаемом значении должен облегчать поиск ошибок. Это rfc ещё более ужесточает требование к значению, не только объект этого типа но ещё и тот самый, метод которого используется.
Так вот каким образом, если мы адекватны и возвращаем $this, в $this может быть что-то другое кроме именно этого конкретного объекта? Что мы в итоге контролируем?
Или только для IDE нужно? Но это странно
Так вот каким образом, если мы адекватны и возвращаем $this, в $this может быть что-то другое кроме именно этого конкретного объекта? Что мы в итоге контролируем?
Или только для IDE нужно? Но это странно
0
Быть может, это ограничение можно прочитать как «возвращаемый тип должен быть типом производного класса». Т.е. если в производном классе вернуть объект базового класса, то словим ошибочку.
0
Именно.
А еще этот PR по идее должен решить проблему с методами, возвращающими сами себя в интерфейсах(сейчас мы только можем вернуть исходный интерфейс). Вот синтетический пример абсолютно рабочего кода, но при этом невалидного с точки зрения статического анализатора:
Замена интерфейса на ключевое слово static в методе setA четко укажет, что метод возвращает себя(или хотя бы наследника), а не какую-то другую имплементацию Foo.
А еще этот 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.
0
А чем
:self
в качестве возвращаемого типа плох?0
Declaration of Bar::setA(int $a): Bar must be compatible with Foo::setA(int $a)
— вот этим, к сожалению.
— вот этим, к сожалению.
0
Странные же люди :)
Писал nikic по поводу фичи Static return type аж 23 декабря.
Он так и не ответил, зато через 2.5 недели после письма выкатывает RFC.
Соавторство в2019 2020 уже не то.
Писал nikic по поводу фичи Static return type аж 23 декабря.
Он так и не ответил, зато через 2.5 недели после письма выкатывает RFC.
Соавторство в
-4
Sign up to leave a comment.
Articles
Change theme settings
PHP-Дайджест № 171 (1 – 13 января 2020)