Size: a a a

2020 July 27

A

Aleksandr Khristenko in PHP
Посмотри на свой пример, который ты первым кинул и к которому я прикопался. И попытайся, например, реализовать его тело.
источник

АГ

Алексей Гевондян... in PHP
они призваны заменить плейсхолдеры типов на какие-то конкретные типы. в пхп все динамическое... зачем это в пхп, если есть интерфейсы, никак не догоню... сигнатура сигнатурой, но в коде же будет подразумеваться, что с этими переменными что-то делается... ну тут разве что для скалярных типов это применимо... но ведь можно же обернуть классом...
источник

A

Aleksandr Khristenko in PHP
Алексей Гевондян
они призваны заменить плейсхолдеры типов на какие-то конкретные типы. в пхп все динамическое... зачем это в пхп, если есть интерфейсы, никак не догоню... сигнатура сигнатурой, но в коде же будет подразумеваться, что с этими переменными что-то делается... ну тут разве что для скалярных типов это применимо... но ведь можно же обернуть классом...
Объясняю. Типы нужны чтобы до запуска программы проверить, что программа удовлетворяет неким условиям. И отбросить заведомо некорректную программу.
источник

SP

Sergey Protko in PHP
Алексей Гевондян
они призваны заменить плейсхолдеры типов на какие-то конкретные типы. в пхп все динамическое... зачем это в пхп, если есть интерфейсы, никак не догоню... сигнатура сигнатурой, но в коде же будет подразумеваться, что с этими переменными что-то делается... ну тут разве что для скалярных типов это применимо... но ведь можно же обернуть классом...
interface Foo {
   public function bark(object $obj): array;
}

class MyFoo implements Foo {
   public function bark(MyClass $obj): array;
}

что будет?
источник

A

Aleksandr Khristenko in PHP
Sergey Protko
вот тебе any any
в этом примере с мапом у тебя тип получается [a] -> ( a -> b) -> [b] и это имеет смысл.
А первый пример был с типом a -> b
источник

SP

Sergey Protko in PHP
Aleksandr Khristenko
в этом примере с мапом у тебя тип получается [a] -> ( a -> b) -> [b] и это имеет смысл.
А первый пример был с типом a -> b
function post<T, R>(data: T): Promise<R> {}
источник

SP

Sergey Protko in PHP
в таком смысл есть?
источник

SP

Sergey Protko in PHP
тут же тоже a -> b
источник

АГ

Алексей Гевондян... in PHP
Sergey Protko
interface Foo {
   public function bark(object $obj): array;
}

class MyFoo implements Foo {
   public function bark(MyClass $obj): array;
}

что будет?
будет ошибка несоответствия сигнатур?
источник

АГ

Алексей Гевондян... in PHP
в целом не вижу тут проблемы, т.к. MyClass это object (ковариантен)
источник

SP

Sergey Protko in PHP
Алексей Гевондян
будет ошибка несоответствия сигнатур?
вот. И как ты прикажешь сделать автору фреймворка интерфейс который нельзя менять и который позволяет пользователю библиотеки свой тип подставить?
источник

A

Aleksandr Khristenko in PHP
Sergey Protko
в таком смысл есть?
Окей. Предположим ты написал функцию с такой сигнатурой. И даже сделал для нее реализацию.
У меня есть код $result = post('some string);
Какой-тип в результате должен быть у $result?
источник

АГ

Алексей Гевондян... in PHP
просто интерфейс требует более общий тип, а тут получается что этот класс уже нельзя будет использовать как реализацию этого интерфейса, т.к. он требует более конкретного типа, чем подразумевается интерфейсом
источник

SP

Sergey Protko in PHP
Aleksandr Khristenko
Окей. Предположим ты написал функцию с такой сигнатурой. И даже сделал для нее реализацию.
У меня есть код $result = post('some string);
Какой-тип в результате должен быть у $result?
ладно, понял... туплю
источник

SP

Sergey Protko in PHP
Алексей Гевондян
просто интерфейс требует более общий тип, а тут получается что этот класс уже нельзя будет использовать как реализацию этого интерфейса, т.к. он требует более конкретного типа, чем подразумевается интерфейсом
"аргументы в наследнике могут быть шире чем в паренте но не наоборот, а вот тип возвращаемого значения всегда должен быть уже". Так завещала бабушка Лисков и ее принцип подстановки
источник

SP

Sergey Protko in PHP
еще это называется robustness principle
источник

АГ

Алексей Гевондян... in PHP
Sergey Protko
вот. И как ты прикажешь сделать автору фреймворка интерфейс который нельзя менять и который позволяет пользователю библиотеки свой тип подставить?
что мешает реализовать интерфейс, и сунуть объект этого класса туда, где требуется некая реализация этого интерфейса? не пойму в чем проблема...
источник

SP

Sergey Protko in PHP
> Be conservative in what you do, be liberal in what you accept from others (often reworded as "Be conservative in what you send, be liberal in what you accept").
источник

SP

Sergey Protko in PHP
Алексей Гевондян
что мешает реализовать интерфейс, и сунуть объект этого класса туда, где требуется некая реализация этого интерфейса? не пойму в чем проблема...
покажи как это будет выглядеть
источник

SP

Sergey Protko in PHP
ибо мне кажется что у тебя выйдет свой object который ничего конкретного не говорит
источник