[Перевод] О дженериках в 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);
    

© Habrahabr.ru