4

他のクラスを拡張し、クラス内の特定の設定に基づいて機能を提供するクラスを処理する場合、2 つの異なる実装が見られます。

  • 変数は、設定を保存するために使用されます。
  • メソッドは、設定を返すために使用されます。

変数の使用:

    class Model {
        var $fields = array();
        function getFields() {
            return array_keys($this->fields);   
        }
        function getRules() {
            return $this->fields;   
        }
    }
    class Person extends Model {
        var $fields = array(
            'name' => array('maxLength'=>10),
            'email' => array('maxLength'=>50, 'validEmail'=>true),
        );
    }

メソッドの使用:

    class Model {
        function getFields() {}
    }
    class Person extends Model {
        function getFields() {
            return array('name','email');
        }
        function getRules() {
            return array(
                'name' => array('maxLength'=>10),
                'email' => array('maxLength'=>50, 'validEmail'=>true),
            );
        }   
    }

どちらの例でも同じ結果が得られます。 と のようなことができます$person->getFields()が、 method-example では、フィールドがと の両方で実際に定義されており、毎回配列を計算する必要$person->getRules()があるため、「重複した」フィールド リストは好きではありません。メソッドで求められます。一方で、すべてのオブジェクトがすべての設定を変数に格納するのは好きではありません。資源の無駄遣いのようです。だから私はちょうど良い方法が何であるか疑問に思っています。$person->getFields()$person->getRules()

私の主な質問は次のとおりです。

  1. どちらか一方の方法を選択するパフォーマンス上の理由はありますか? 2)
  2. OOP ロジック/プログラミングの容易さ/他の方法を選択するその他の理由はありますか?
4

2 に答える 2

1

いくつかのベンチマークテストから-時間はかなり似ています-ただし、例外

return array('name','email');

よりもはるかに高速です

return array_keys($this->fields);

メソッドごとに 10,000 回の操作を実行すると、次の平均値が得られました。

Variable:
    getFields    0.06s
    getRules     0.05s
Method:
    getFields    0.04s
    getRules     0.05s

2番目の質問に答えるには、ユースケースによって異なります-これらのオブジェクトに保存されているデータが静的であるか、別のデータソース/構成ファイルから取得されるか。

フォローアップの質問が 1 つあります。なぜオブジェクト プロパティを使用しないのですか?

class Person extends Model {
    protected $name
    protected $email

    public function getName() {
        return $this->name;
    }

    public function getEmail() {
        return $this->email;
    }

}
于 2012-08-01T16:29:28.403 に答える
1

私の意見では、快適なものを選択してください。どちらを使用しても、パフォーマンスが大幅に低下したり、パフォーマンスが向上したりすることはありません。データ処理のためにパフォーマンスを節約する労力を節約することをお勧めします。

私はオブジェクトのプロパティを使用しています。クラスを見ていると、そのようなデフォルトのプロパティを格納するために明確に見えます。それらをオーバーライドする場合は、次の美しい構文を使用します。

array()+array()
于 2012-08-01T16:39:27.097 に答える