1

製品クラスを持つ新しいプロジェクトから始めたところです。オブジェクトは製品を表します。

各製品には、未定義の属性がいくつもあります(色、foobarなど)。productオブジェクトには、次のいずれかの属性オブジェクトの配列が含まれます。

class attr {
  var type;  // string, float, int etc..
  var name;  // the name
  var value; // the value
  ...

(and then the product object has an array of these attr objects..)

または、製品ごとに配列を格納する必要があります。

class product {
  var attributes = array('colour' => 'red', 'weight' => '11')
  ...

明らかに、必要に応じて、配列を2Dにして、属性タイプを格納できます。

私の主な懸念は、製品が20程度の属性を持っている可能性があり、私が作成しているサイトに多くのユーザーがいる場合、これは大量のメモリを消費する可能性があるということです-それは正しいですか、それとも単なる神話ですか?

誰かがこの種のもののベストプラクティスが何であるかを知っているかどうか疑問に思っています。オブジェクトメソッドはより正しいと感じますが、私には少し無駄に感じます。何か提案/考えはありますか?

4

4 に答える 4

2

そのためのベストプラクティスはありません、AFAIK。

あなたの質問で説明されているように、それぞれにcos'n'の長所がある2つのオプションがあります。依存するのは、製品と属性がどのように/どこに格納されるかだけです。それがMySQLデータベースにある場合でも、DBから配列またはオブジェクトをフェッチできるため、違いはありません。

すべての単純なものにクラスを使用している場合は、属性にもクラスを使用します。大きなオブジェクトにのみクラスを使用している場合は、配列を使用します。それはあなたの好み次第です。クラスまたは配列を使用する場合、および20程度の属性を使用している場合は、メモリ消費量に大きな違いはありません。

もしそれが私にあったとしたら、属性を何らかの方法で拡張する必要が生じた場合に、将来さらに多くの利点が得られるので、属性のクラスとクラスの配列を使用します。

于 2012-12-17T11:55:08.857 に答える
2

一般的なアドバイスとして、特にそれがOOモデルを配列のような暗黙の(モデル化されていない概念)ものに変えることを意味する場合、私は初期の最適化に反対します。それらを使用するコンテキストはわかりませんが、第一級市民としての属性を持つことで、必要に応じて動作を委任できるようになり、よりクリーンな設計のIMOにつながります。私の観点からは、属性やそのタイプなどを操作する必要がある場合は、主に最初のアプローチを使用することでメリットが得られます。

_get()そうは言っても、配列と/_set() magicメソッドを使用してオブジェクトに動的にデータを取り込むために、配列アプローチを使用するフレームワークはたくさんあります。たとえば、 Elgg$attributesがクラスの配列をどのように処理するかElggEntityを見て、それが機能していることを確認し、いくつかのアイデアを得ることができます。

HTH

于 2012-12-17T12:03:18.807 に答える
2

Productクラスが本当に柔軟で、任意の数の属性に対応する必要がある場合は、__getと__setを使用したくなるでしょう。

class Product {

    protected $attributes = array();

    public function __get($name) {

        if (array_key_exists($name, $this->attributes)) {
            return $this->attributes[$name];
        }
    }

    public function __set($name, $value) {

        $this->attributes[$name] = $value;
    }
}


$o = new Product();
$o->foo = 123;
var_dump($o->foo);

これは、将来、ソリューションで必要になった場合に、ArrayAccessやその他のSPLイテレータ型クラスを実装するのに役立ちます。

于 2012-12-17T12:09:34.880 に答える
0

それらをデータベースにどのように保存するかを検討することがより重要だと思います。次のようなことを言うことができる検索をしたいと思うと思います。そうI want a RED HAT size 12すれば、これに一致する属性を持つすべての製品を見つけることができなければなりません。これはすべてデータベースレベルで行われます。最初にすべての製品をPHPクラスにロードしてから、検索するのは良い考えではありません。

表示したいもの(検索結果、概要ページ、詳細)を取得したら、属性を含む完全な製品クラスをロードします。そのすべてのテキスト/数字とおそらく一度に100を超える製品ではないので、速度的にはPHPで何を選択するかは重要ではありません。あなたが一番好きなことをしてください。

データベースでは、それが重要になる可能性があります(データベースでは常にすべての製品を使用しているため)。文字列/数字/ブールなどを分離して正しいインデックスを付けるようにしてください。そうしないと、市長のパフォーマンスが低下する可能性があります。

于 2012-12-17T11:59:40.330 に答える