2009-10-16 8 views
16

私はPHP5を学んでいます(前回PHPがPHP4であったことを確認しました)、PHP5のOOがPHP4よりもJavaに似ていることを嬉しく思います。私のJavaのバックグラウンドであるARRAYSのために、私はかなり不快に感じます。PHPのようなJavaのようなコレクション

私は "Proffesional PHP6"(Wrox)を読んでおり、独自のコレクション実装を示しています。 私はSPLに基づいてhttp://aheimlich.dreamhosters.com/generic-collections/Collection.phpsにあるもののような他のクローズを見つけました。 SPL(ArrayObject)に何らかのコレクションがあることがわかりました

しかし、私はPHPでコレクションを使用している人は実際には見えないので、配列が好きです。

Javaの基本配列の代わりにArrayListを使うのと同じように、PHPでCollectionsを使用するのは良い考えですか?結局のところ、php配列は本当にjava配列のようなものではありません。

+3

PHPの配列よりJavaのコレクションの利点を指摘できますか?探しているenterpriseyを除いて? –

+0

実際には、PHPで設定された実装を持つのはいいですが、Pythonのセットのようなものです。 –

+0

私は以下の答えで本当に簡単な実装を提供しました。 –

答えて

19

Javaのコレクションは強く型付けされた言語なので、多くの意味があります。それは "車"と "オートバイ"の別の言葉のコレクションを持っていることは理にかなっています。

しかし、PHPでは、動的に型指定された性質のため、コレクションの形式を犠牲にすることはかなり一般的です。配列は、さまざまなオブジェクト型(車、オートバイなど)の汎用コンテナとして使用するには十分です。また、配列が非常に簡単に変更される可能性があるという事実(適切なエラーチェックがない場合には大きな欠点になることがあります)という利点もあります。

私はJavaの背景から来ており、PHPでCollectionsデザインパターンを使用しても、マルチスレッド化、メモリ割り当ての最適化、イテレータのない利点はほとんど得られません。 )。

これらの利点のいずれかを探しているなら、おそらく配列の周りにラッパークラスを構築し、各フィーチャー(イテレーターなど)を単体で実装する方がよいでしょう。

+0

私自身のラッパークラスを構築することは、そのような基本的なもののために非スタンダードクラスを使うという欠点があります。 SPLのArrayObjectはラッパーですか? – ktulur

+1

合意どおり、カスタムラッパーは標準ではないという欠点がありますが、実際には標準のコレクションラッパーがないため、それほど悪くないかもしれません。 私はSPLのArrayObjectで実際に作業していませんが、ドキュメント(http://www.php.net/~helly/php/ext/spl/classArrayObject.html)を見ると、それはクローン関数とイテレータを追加します。これがあなたが必要とするものなら、それを使うことをお勧めします。しかし、同期、リンクリスト対arraylistなどが必要な場合は、おそらくあなた自身のラッパーを書くか、ArrayObjectを拡張する必要があります。 – Pras

+0

完全に同意しますが、時には配列にオブジェクトの種類が1つしか含まれていないという基本的な保証をしたいことがあります。私は、私が使用する簡単な実装を持っています - 私の答えを参照してください –

5

PHP配列は結合的です... Java配列よりはるかに強力で、リスト<>とMap <>の多くの機能が含まれています。

「いいアイデア」とはどういう意味ですか?彼らは別のツールで、別の言語を使用する方法で1つの言語を使用すると、通常は欲求不満が生じます。

+0

PHPで使用されているオブジェクト指向のデザインパターンがたくさんあり、PHP5のOOは本当にJavaのようなので、コレクションのいくつかの種類を使用して私には良いアイデア。 – ktulur

+2

PHPがJavaからいくつかのものを借りたということは必ずしも良いことではありません。 –

+0

私は混乱していると思います。あなたには "コレクション"があります。彼らはちょうど "リスト"または "マップ"という名前ではありません。 PHP配列は動的に成長します。キーと値のペアを関連付けることができます。 セットは少し違っていますが、ちょっと、そこにあまり積もりすぎることはありません。 :) Javaから来るのは間違いなくそこそこの世界ですが、これらの違いとそれらに付随するトレードオフを受け入れます! –

3

私も、PHPではCollection型のクラスが見つからないと思っていました。配列は私の経験ではいくつかの真の欠点を持っています。

最初に、それらを操作するために利用可能な機能の数は幾分制限されています。たとえば、指定されたインデックス位置にあるコレクションに対してアイテムを任意に挿入したり削除したりする必要があります。 PHPの配列のための組み込み言語関数を使ってそれを行うのは、せいぜい苦しいです。

第2に、最初のポイントの一種として、シンプルなプッシュ/ポップとイテレーターのものを超えた複雑さのレベルで配列を操作するきれいで読みやすいコードを書くのは難しいです。私はしばしば、私が作成するデータ集約型のアプリケーションで別の配列を索引付けして追跡するために、1つの配列を使用しなければならないことがよくあります。

私はフレームワーク(私の個人的な選択はNOLOH)での作業を好む。そこには、Add、Insert、RemoveAt、RemoveRange、Toggleなどの機能を持つArrayListという実際のCollectionクラスがあります。他のPHPフレームワークもこの問題に対処していると思います。

6

私はPHPで非常にプロコレクションのオブジェクトですが、型の安全性を追加し、検索、並べ替え、操作の機能を使いやすくするために使用でき、配列や有用ではあるが手続き的なソース上の異なるパターンでそれらを操作する関数

さまざまな目的で使用される様々なコレクションがあり、型の安全性、一貫したコーディング標準、高いレベルのコード再利用などをきちんと継承しています。

しかし、最終的には、それらはすべて内部的に配列されています!

私はオブジェクト指向の世界では、基本クラスのソートや検索アルゴリズムなどのコードの繰り返しを簡単に保つのが好きです。

0

PHPのコレクションの素晴らしい実装がVarien Libによって提供されています。このライブラリは、OSLライセンスのMagentoコードの一部です。 Magentoのライセンスとコードの再利用hereについて(詳細は。

最良の方法は、Magentoのをダウンロードして、/ libに/ Varienをで見ているので、ライブラリのすべてのソースコードを見つけることができません/

0

Yiiは完全なJavaの実装を持っていますコレクションは、私は時々私のラフと準備ができてコレクションを与えるためにこれは本当に簡単な実装を使用

http://www.yiiframework.com/doc/api/1.1/CList

0

を積み重ねるように。

通常COLの主な要件を1つのタイプのオブジェクトのグループを強制しているので、それを実装するためにコンストラクタで基本クラスをセットアップするだけで済みます。

class SomeObjectCollection { 

    /** 
    * @var SomeObject[] 
    */ 
    private $collection = array(); 

    /** 
    * @param SomeObject $object1 
    * @param SomeObject $_ [optional] 
    */ 
    function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
    { 
     foreach (func_get_args() as $index => $arg) { 
      if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject'); 
      $this->collection[] = $arg; 
     } 
    } 

    /** 
    * @return SomeObject[] 
    */ 
    public function getAll() 
    { 
     return $this->collection; 
    } 
} 
関連する問題