Skip to content

Instantly share code, notes, and snippets.

@mvriel
Created October 2, 2012 20:14
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mvriel/3823010 to your computer and use it in GitHub Desktop.
Save mvriel/3823010 to your computer and use it in GitHub Desktop.
Generic notation in PHPDoc vs. plain array notation
<?php
/**
* @template <T> The type of the individual elements
*/
class ArrayCollection implements IteratorAggregate
{
private $elements;
/**
* @param array<T> $elements
*/
public function __construct(array $elements)
{
$this->elements = $elements;
}
/**
* @return Iterator<T>
*/
public function getIterator()
{
return new ArrayIterator($this->elements);
}
}
// usage
/** @type ArrayCollection<Foo> $col */
$col = new ArrayCollection();
foreach ($col as $elem) {
// $elem is instance of Foo here
}
?>
<?php
class ArrayCollection implements IteratorAggregate
{
private $elements;
/**
* @param mixed[] $elements
*/
public function __construct(array $elements)
{
$this->elements = $elements;
}
/**
* @return ArrayIterator
*/
public function getIterator()
{
return new ArrayIterator($this->elements);
}
}
// usage
/** @type ArrayCollection|Foo[] $col */
$col = new ArrayCollection();
foreach ($col as $elem) {
// $elem is instance of Foo here
}
?>
@ashnazg
Copy link

ashnazg commented Apr 22, 2013

Could these ideas be successfully condensed into just this one syntax:

@type (class name or primitive type 'array')<(optional key type, ) (required member type) (description)

@mvriel
Copy link
Author

mvriel commented Apr 22, 2013

I have been thinking quite a bit about this proposal in the past time and to be honest, it is starting to grow on me. Though I am not so sure about the @template tag since that would only serve a purpose for a Collection object that only intends to be used with a specific set of values (that and I don't think the name @template is intuitive).

Some concerns that I still have:

  • How to deal with generics where the value may be of several types? Use the or operator (|) as has been done so far?
  • We should also support multi-dimensional notations

@Deltachaos
Copy link

I think we sould keep the or operator for working with several types. But what do you mean by "multi-dimensional notations"?

@cmrafifar
Copy link

Coming from a Java perspective, I would love some kind of Generics support in PHP and/or PHPDOC. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment