2

コレクションエンティティを表すクラスがあります。これには、配列という1つの属性しかありません。このクラスは、を実装\Countableし、\IteratorAggregateこの質問で最も重要な、を実装し\ArrayAccessます。

しかし、使用する場合:

        usort($collectionData, function($a, $b) {
            return ($a->getPosition() > $b->getPosition());
        });

次のキャッチ可能な例外が発生します:

警告:usort()は、パラメーター1が配列であり、オブジェクトが/home/alain/workspace/(...)n.php行1057(500内部サーバーエラー)で指定されていることを想定しています。

私は中間変数を使って騙すことができます:

        $data = $collectionData->getData();
        usort($data, function($a, $b) {
            return ($a->getPosition() > $b->getPosition());
        });
        $collectionData->setData($data);

しかし、の配列パラメーター型の期待値を通過できるSPLインターフェースがあるかどうかを知りたいと思いましたusort()

4

3 に答える 3

2

私は本当にあなたが拡張すべき唯一のクラスは ArrayIteratorそれがすでに実装しているからだと思います

ArrayIteratorは、Iterator、Traversable、ArrayAccess、SeekableIterator、Countable、Serializableを実装します。

また、それはサポートします

 public void uasort ( string $cmp_function )
 public void uksort ( string $cmp_function )

そして他の多くの方法

だからあなたのクラスは

class CollectionEntity extends ArrayIterator {
}

それで

$collectionData->uasort(function ($a, $b) {
    return ($a->getPosition() > $b->getPosition());
});
于 2013-02-28T13:39:37.683 に答える
1

私が知っていることではありません。オブジェクトをとにするインターフェイスはありません。arrayこれをに渡す必要がありますusort()usort()ただし、クラスにメソッドを追加することで、この動作をクラスにカプセル化できます。

class CollectionEntity implements Countable, IteratorAggregate, ArrayAccess {

  private $data = array();

  /* other methods omitted for simplicity */

  public function usort(Closure $callback) {
    usort($this->data,$callback);
  }


}
于 2013-02-28T13:23:42.343 に答える
-2

そのようなインターフェースはありません。配列関数はネイティブ配列でのみ機能します。ただし、TraversablesなどIteratorAggregateを配列に変換することはできますiterator_to_array

ちなみに、特にArrayAccess役に立たない理由は次のとおりです。PHP:ArrayAccessを実装するオブジェクトである「配列」を並べ替えてフィルタリングするにはどうすればよいですか?

于 2013-02-28T13:27:36.063 に答える