2

現在、渡された特定のタイプのレポートから情報を解析するスクリプトを作成しています。レポートから生徒の情報を取得し、後で処理するために保存するスクリプトの一部があります。

クラスの形で保持するのが最善ですか、それとも配列変数で保持するのが最善ですか? 私が使用できる3つの方法があると思います。

編集:本当に、質問は、いずれかの方法に何らかのパフォーマンス上の利点があるかどうかにかかっていますか? それ以外の場合、各メソッドは実際には最後のメソッドと同じです。

変数に直接アクセスできるクラスとして:

class StudentInformation {

    public $studentID;
    public $firstName;
    public $lastName;
    public $middleName;
    public $programYear;
    public $timeGenerated;

    function StudentInformation(){} 
}

関数を持つクラスとして:

class StudentInformation {

    private $studentID;
    private $firstName;
    private $lastName;
    private $middleName;
    private $programYear;
    private $timeGenerated;

    function StudentInformation(){}

    public function setStudentID($id)
    {
        $this->studentID = $id;
    }

    public function getStudentID()
    {
        return $this->studentID;
    }

    public function setFirstName($fn)
    {
        $this->firstName = $fn;
    }

    /* etc, etc, etc */
}

または、文字列をキーとする配列として:

$studentInfo = array();
$studentInfo["idnumber"] = $whatever;
$studentInfo["firstname"] = $whatever;
$studentInfo["lastname"] = $whatever;
/* etc, etc, etc */
4

7 に答える 7

3
  1. 配列と単純な値オブジェクトの使用を最適化しようとするのは、おそらく不必要なマイクロ最適化です。new最も単純なケースでは、オブジェクトを構築するオーバーヘッドがないため、配列の方が高速です。

  2. これを覚えておくことが重要です:存在するデータ構造は配列だけではありません。ハッシュ機能が必要ない場合は、単純なSplFixedArrayドキュメントを使用すると、オブジェクト作成の初期オーバーヘッドを乗り越えると、メモリ オーバーヘッドが低くなり、反復処理が高速になります。大量のデータを格納している場合は、前述の固定配列または他のSPL データ構造のいずれかが適切なオプションである可能性があります。

  3. 最後に、値オブジェクトは不変でなければならないので、あなたのケースでは、ハッシュマップ値を自由に割り当てる機能よりも、オブジェクトによって提供されるカプセル化を強くお勧めします。配列表記を簡単に使用したい場合は、クラスにArrayAccessドキュメントを実装させ、両方の長所を活用してください。__getと を使用した魔法のゲッターとセッターを提案する人もい__setます。魔法は一般にコードを不必要に難読化するため、私はそうしません。本当に魔法が必要なら、デザインを再考するかもしれません。

OOP パラダイムが、私たちが考え出した最高のプログラミング パラダイムとして認識されているのには理由があります。それは、私たちが考え出した最高のパラダイムだからです。あなたはそれを使うべきです。すべてに配列を使用する多く/ほとんどの PHP 開発者の罠に陥らないようにします。

于 2012-06-05T19:51:20.460 に答える
3

成績の更新やフルネームの取得など、1 人の学生に適した操作 (アクセス用の関数を持つプライベート データ メンバー) を使用して、1 人の学生用のクラスを作成できます。次に、単一の学生の配列を含む複数の学生用の別のクラスを作成します。学生のセットで動作する関数を作成し、必要に応じて個々の学生関数をテストして呼び出すことができます。

大まかな答えは、あなたが提案するどの方法でもこれを行うことができるということですが、私たちのほとんどは OOP ソリューションをお勧めします。ニーズが非常に単純な場合は、単純な配列で十分です。ニーズが変わった場合は、とにかくオブジェクト全体を再コーディングする必要があるかもしれません。クラスもシンプルに保つことができるので、クラスから始めて、必要に応じて複雑さを追加することをお勧めします。長期的には、クラスで構築されたものをより適切に維持および拡張できると信じています。

于 2012-06-05T19:27:00.730 に答える
1

パフォーマンスの問題に関しては、異なるインスタンスが個別に格納されるため、クラスはおそらく配列よりも高速です。すべてのものを 1 つの巨大なハッシュ マップ (連想配列) に配置することで、配列の制限/プロパティの一部も得られます。たとえば、注文。あなたはそれを必要としません。また、PHP インタープリターが賢くない場合は、ルックアップのたびにルックアップ文字列をハッシュします。必要のないクラスと静的型付けの使用。

于 2012-06-05T19:31:31.160 に答える
1

3 つのオプションは有効ですが、カプセル化/外部からの保護の程度が異なります。

最低の保護から最高へ:

  1. 配列
  2. パブリック プロパティに直接アクセスできるオブジェクト
  3. ゲッター/セッターを持つオブジェクト

選択はプロジェクトの環境に大きく依存します (2 時間 ? 明日ゴミ箱に送られますか ?)

選択肢 2 は実用的なようです。

データベースラッパーによっては、データが配列またはオブジェクトにフェッチされる可能性があることを考慮してください。配列としてフェッチされる場合は、それらをオブジェクトにマップする必要がある場合があります。

于 2012-06-05T19:31:40.890 に答える
0

これは決定的な答えのない主観的な質問ですが、OOP の方法をお勧めします。Parserのインスタンスを保持するクラスを作成できますStudentInformation

より快適で、追加の処理が必要な場合はメソッドを追加できます。

于 2012-06-05T19:22:30.013 に答える
0

多くの関数を持たない小さなプロジェクトのみをコーディングする場合は、配列の方が適しています。ただし、クラスには利点があります。たとえば、次のように入力しますか

$class->db_update("string", $database);

また

$query = "SELECT * FROM `table` WHERE foo='".$array['bar'].'";
mysql_connect("...
mysql_query($query...

基本的に、それぞれの側に利点があります。ここにいる他のほとんどの人がそうすべきであり、そうするであろうように、私はOOPの方法をお勧めします。

編集:また、これを見てください。

于 2012-06-05T19:27:50.510 に答える
0

プロパティを非公開にして、クラスを使用します。

学生情報に関連するすべての操作は、そのクラスで作成できます/作成する必要があります。

これが 1 回限りのことであれば、配列を選びますが、実際には、1 回だけ使用されるものを持つことの意味を知っており、データに対して n 回の操作を実行する必要があることを知り、クラスに行かなければならなくなります。

于 2012-06-05T19:31:31.187 に答える