web-dev-qa-db-ja.com

PHP7のオブジェクトの配列の関数戻り型のヒント

PHP 7.の新しい機能に非常に満足しています。しかし、PHP 7。

たとえば、クラスItemがあり、関数からこのクラスのオブジェクトの配列を返します。

function getItems() : Item[] {
}

しかし、この方法では機能しません。

38
Robert Limanto

私は実際にあなたの意味を理解していますが、残念なことに答えはあなたがそれをすることができないということです。 PHP7にはそのような表現性がないため、関数を宣言して "array"(汎用配列)を返すか、Itemの配列である新しいクラスItemArrayを作成する必要があります(ただし、自分でコーディングする必要があります) )。

現在、「アイテムの配列が欲しい」インスタンスを表現する方法はありません。

編集:追加の参照として、ここで 「RFCの配列」 あなたがやりたいことの、それは様々な理由により拒否されました。

42
Johnny

これは Generics と呼ばれますが、残念ながら この機能はすぐには表示されません です。 docblocks を使用しても、この方法でヒントを入力できます。

PhpStorm のようなPHPエディター(IDE)はこれを非常によくサポートし、そのような配列を反復処理するときにクラスを適切に解決します。

/**
 * @return YourClass[]
 */
public function getObjects(): iterable

PHPStormはネストされた配列もサポートしています。

/**
 * @return YourClass[][]
 */
public function getObjects(): iterable
28
emix

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)
    }
  }
}
7
Ruslan Osmanov