Size: a a a

2020 July 23

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Мне нужна мапа из имен классов в их инстансы, то есть генерик на уровне массива.
Вообще вот так тайпчекается https://psalm.dev/r/05246f89af
источник

A

Aleksandr Khristenko in PHP
Евгений Ромашкан
Вообще вот так тайпчекается https://psalm.dev/r/05246f89af
Но не будет работать.
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Но не будет работать.
Что именно?
источник

ЕР

Евгений Ромашкан... in PHP
Оно не будет следить за значениями в мапе, да
источник

A

Aleksandr Khristenko in PHP
Вообще этот подход. У тебя тут генерик параметр на уровне класса. Т.е. тип T будет зафиксирован на момент создания класса.
Соответственно метод get всегда будет возвращать один и тот-же класс.
источник

A

Aleksandr Khristenko in PHP
Т.е. чтобы этот подход работал нужно перенести @psalm-template в get, тогда да, будет работать.
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Вообще этот подход. У тебя тут генерик параметр на уровне класса. Т.е. тип T будет зафиксирован на момент создания класса.
Соответственно метод get всегда будет возвращать один и тот-же класс.
Не один и тот же класс, но максимум пересечение
источник

ЕР

Евгений Ромашкан... in PHP
Я бы просто добавил второй темплейт и сделал хак с @var, покрыть мапу типами вряд ли удастся
источник

A

Aleksandr Khristenko in PHP
Евгений Ромашкан
Не один и тот же класс, но максимум пересечение
Конкретно в твоем примере get всегда будет возвращать некий подкласс класса, который будет зафиксирован в генерик параметра.
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Конкретно в твоем примере get всегда будет возвращать некий подкласс класса, который будет зафиксирован в генерик параметра.
Угу, и если as object убрать, будет получаться что-то вроде A|B|C
источник

A

Aleksandr Khristenko in PHP
Эм? Какой as object?
источник

ЕР

Евгений Ромашкан... in PHP
Хотя о чём я, там просто mixed будет, ладно.
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Конкретно в твоем примере get всегда будет возвращать некий подкласс класса, который будет зафиксирован в генерик параметра.
https://psalm.dev/r/6d757f6171
Вот тут get будет возвращать A|B|null
источник

ЕР

Евгений Ромашкан... in PHP
Но в целом не поможет, поэтому https://t.me/prophp7/230144
источник

A

Aleksandr Khristenko in PHP
Евгений Ромашкан
https://psalm.dev/r/6d757f6171
Вот тут get будет возвращать A|B|null
Ну нет же.
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
Ну нет же.
источник

A

Aleksandr Khristenko in PHP
И что нам это говорит? А это нам говорит, что псалм в качестве типа Т вывел и зафиксировал тип A|B|Null.
И соответственно метод get нам всегда будет возвращать тип A|B|Null.
Чтобы эта хрень работала корректно нужно генерик-параметр вводить не на уровне класс а на уровне метода.
Тогда он будет выводится по месту использования метода.
https://psalm.dev/r/22868ce967
источник

ЕР

Евгений Ромашкан... in PHP
Aleksandr Khristenko
И что нам это говорит? А это нам говорит, что псалм в качестве типа Т вывел и зафиксировал тип A|B|Null.
И соответственно метод get нам всегда будет возвращать тип A|B|Null.
Чтобы эта хрень работала корректно нужно генерик-параметр вводить не на уровне класс а на уровне метода.
Тогда он будет выводится по месту использования метода.
https://psalm.dev/r/22868ce967
Все так, я об этом и писал, ты там выше просто про класс написал а не про тип.
источник

ЕР

Евгений Ромашкан... in PHP
Тип get можно было бы вывести, если б был способ задать соответствие ключа-значения в массиве, но увы
источник

A

Aleksandr Khristenko in PHP
Или я неправильно тебя понимаю, или ты меня =\
источник