[Перевод] О дженериках в PHP и о том, зачем они нам нужны
Комментарии (5)
26 мая 2017 в 18:38
0↑
↓
Впервые узнал про дженерики из Java. Абсолютно согласен с тем, что это была бы крайне полезная фича. Особенно для различных библиотек.P.S. Я читаю теги!
26 мая 2017 в 19:26
+2↑
↓
Если циклически пройти по нашему набору постов, то в результате получим критическую ошибку.
Так мы работаем с массивом постов, или с массивом рандомных элементов?PHP Fatal error: Uncaught Error: Call to a member function getId () on string
26 мая 2017 в 19:50
0↑
↓
Согласен, статья рассматривает какую-то гипотетическую проблему, а не практическую. Если контролировать формирование массива, то описанная ситуация невозможна.
26 мая 2017 в 19:48
0↑
↓
Чот странное ощущение от этих дженнриков. С одной стороны ругают php за динамическую типизацию, с другой стороны тащат в пых динамическое все, следить за которым еще то удовольствие.Полочается «Возьми то, не знаю что, и верни его точно существующее свойство или метод.
Сорян, хрень какая то, в масштабах 10 — 20 сущностей.
Если больше то может и имеет смысл26 мая 2017 в 20:03 (комментарий был изменён)
0↑
↓
Реализовать дженерики в PHP можно проще простого, достаточно чу-чуть изменить конструктор и метод offsetSet:class Collection implements Iterator, ArrayAccess { // ... /** @var string */ private $className = null; /** * @param string $T */ public function __construct($T) { if (is_string($T) && class_exists($T)) { $this->className = $T; } else { throw new \InvalidArgumentException("T must be name of class."); } $this->position = 0; } //... public function offsetSet($offset, $value) { if (!($value instanceof $this->className)) { throw new \InvalidArgumentException("value must be instance of {$this->className}."); } if (is_null($offset)) { $this->array[] = $value; } else { $this->array[$offset] = $value; } } } $postCollection = new Collection(Post::class); $postCollection[] = new Post(); //ok $postCollection[] = 'Post'; //throw Exception
Единственное чего не хватает, так это дополнения в IDE. Но и как выше говорили, достаточно нормально следить за заполнением массива.
UPD: Если указать тип для $postCollection через PHPDoc как массив постов, то будет подсказывать
/** @var Post[] $postCollection */ $postCollection = new Collection(Post::class);