Переменная phpdoc класса ArrayObject
У меня есть класс, который расширяет ArrayObject
class Collection extends ArrayObject
Я знаю, что могу определить массив объектов, используя этот код:
/* @var $userArray Model_User[] */
Но как я могу определить переменную $userArray
как настраиваемый массив класса Collection
, который содержит объекты класса Model_User
?
Без изменения class Collection
или его phpdoc.
Я хочу использовать те же class Collection
для разных массивов объектов.
Это не то же самое, что тип типа PHPDoc для массива объектов?, потому что в этом обсуждении темы есть общие массивы в php, которые phpdoced как
/* @var $userArray Model_User[] */
, в то время как мой вопрос относится к настраиваемому массиву сборки, который, если phpdoced мой метод выше, не будет вводить методы подсказки класса custom build array, например $userArray->echoChanges()
, потому что он будет считать его общим массивом, а не массивом класса Коллекция. И да $userArray
также действует как массив, поэтому он должен вводить содержимое массива подсказок $userArray[3]->name
.
Ответы
Ответ 1
PSR-5: PHPDoc предлагает форму нотации в стиле Generics.
Синтаксис
Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>
Значения в коллекции МОГУТ даже быть другим массивом и даже другой коллекцией.
Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>
Примеры
<?php
$x = [new Name()];
/* @var $x Name[] */
$y = new Collection([new Name()]);
/* @var $y Collection<Name> */
$a = new Collection();
$a[] = new Model_User();
$a->resetChanges();
$a[0]->name = "George";
$a->echoChanges();
/* @var $a Collection<Model_User> */
Примечание. Если вы ожидаете, что IDE сделает помощь по коду, тогда возникает еще один вопрос о том, поддерживает ли IDE нотацию коллекций в стиле Generic в стиле PHPDoc.