PHP 7.の新しい機能に非常に満足しています。しかし、PHP 7。
たとえば、クラスItem
があり、関数からこのクラスのオブジェクトの配列を返します。
function getItems() : Item[] {
}
しかし、この方法では機能しません。
私は実際にあなたの意味を理解していますが、残念なことに答えはあなたがそれをすることができないということです。 PHP7にはそのような表現性がないため、関数を宣言して "array"(汎用配列)を返すか、Itemの配列である新しいクラスItemArrayを作成する必要があります(ただし、自分でコーディングする必要があります) )。
現在、「アイテムの配列が欲しい」インスタンスを表現する方法はありません。
編集:追加の参照として、ここで 「RFCの配列」 あなたがやりたいことの、それは様々な理由により拒否されました。
これは Generics と呼ばれますが、残念ながら この機能はすぐには表示されません です。 docblocks を使用しても、この方法でヒントを入力できます。
PhpStorm のようなPHPエディター(IDE)はこれを非常によくサポートし、そのような配列を反復処理するときにクラスを適切に解決します。
/**
* @return YourClass[]
*/
public function getObjects(): iterable
PHPStormはネストされた配列もサポートしています。
/**
* @return YourClass[][]
*/
public function getObjects(): iterable
PHPの現在のバージョンは、オブジェクトの配列の組み込み型ヒントをサポートしていません。クラス名は、特定のコンテキストではarray
と同様に型として解釈できますが、一度に両方ではありません。
実際、 ArrayAccess
インターフェースに基づいてクラスを作成することにより、このような種類の厳密な型ヒントを実装できます。
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());
出力
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)
}
}
}