Je suis très heureux avec les nouvelles fonctionnalités de PHP 7.). Mais je ne comprends pas comment retourner un tableau d’objets dans PHP 7.
Par exemple, nous avons une classe Item
et nous voulons renvoyer un tableau d'objets de cette classe à partir de notre fonction:
function getItems() : Item[] {
}
Mais ça ne marche pas comme ça.
Je comprends réellement ce que vous voulez dire, mais la réponse est malheureusement que vous ne pouvez pas faire cela. PHP7 manque de ce genre d'expressivité, vous pouvez donc déclarer votre fonction pour qu'elle retourne "array" (un tableau générique) ou créer une nouvelle classe ItemArray qui est un tableau de Item (mais cela signifie que vous devrez le coder vous-même. ).
Il n’existe actuellement aucun moyen d’exprimer les instances "Je veux un tableau d’éléments".
EDIT: Comme référence supplémentaire, voici le "tableau de" RFC de ce que vous vouliez faire, il a été refusé pour diverses raisons.
Cela s'appelle Génériques , malheureusement, nous nous ne verrons pas cette fonctionnalité de si tôt . Vous pouvez taper allusion de cette façon en utilisant docblocks .
L'éditeur PHP (IDE) comme PhpStorm le supporte très bien et résoudra correctement la classe lors de l'itération sur un tel tableau.
/**
* @return YourClass[]
*/
public function getObjects(): iterable
PHPStorm prend également en charge les tableaux imbriqués:
/**
* @return YourClass[][]
*/
public function getObjects(): iterable
La version actuelle de PHP ne prend pas en charge les indicateurs de type intégrés pour un tableau d'objets , car Il n’existe pas de type de données comme "un tableau d’objets". Un nom de classe peut être interprété comme un type dans certains contextes, ainsi que array
, mais pas les deux à la fois.
En fait, vous pouvez implémenter ce type de repère de type strict en créant une classe basée sur l'interface ArrayAccess
, par exemple:
class Item
{
protected $value;
public function __construct($value)
{
$this->value = $value;
}
}
class ItemsArray implements ArrayAccess
{
private $container = [];
public function offsetSet($offset, $value)
{
if (!$value instanceof Item) {
throw new Exception('value must be an instance of Item');
}
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->container[$offset]);
}
public function offsetUnset($offset)
{
unset($this->container[$offset]);
}
public function offsetGet($offset)
{
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
function getItems() : ItemsArray
{
$items = new ItemsArray();
$items[0] = new Item(0);
$items[1] = new Item(2);
return $items;
}
var_dump((array)getItems());
Sortie
array(2) {
["ItemsArrayitems"]=>
array(0) {
}
["container"]=>
array(2) {
[0]=>
object(Item)#2 (1) {
["value":protected]=>
int(0)
}
[1]=>
object(Item)#3 (1) {
["value":protected]=>
int(2)
}
}
}