16

Doctrine 2モデルでは、プロパティ/フィールドを公開するべきではないことを読んだことを覚えています。では、これらのフィールドをどのように公開しますか?使用したサンドボックスget*()set*()方法。それが最良のアイデアですか?その非常に面倒です。魔法のメソッド__get() __set()を使用すると、フィールドを公開するのと同じようになりますか?

あなたの推薦は何ですか?

4

6 に答える 6

12

パブリック プロパティを使用できない理由は次のとおりです: Doctrine 2 でパブリック フィールドはどのように「遅延読み込みを中断する」ことができますか?

/フィールドへのアクセスを__get()容易にすることができます。__set()protectedprivate

簡単な例を次に示します。

public function __get($name)
{
  if(property_exists($this, $name)){
    return $this->$name;
  }
}

もちろん、すべてのプロパティにアクセスできます。すべてのエンティティが拡張されたクラスにそれを配置し、評価できないフィールドを として定義できますprivate。または、配列を使用して、アクセスできるプロパティを決定することもできます。$this->accessable = array('name', 'age')

すべてのプロパティを保護する方法はたくさんありますが、それらを取得/設定するかなり簡単な方法があります。

于 2010-12-16T19:21:07.500 に答える
9

個人的には、些細な目的のボイラープレート コードは好きではありません。コードが見苦しく、読みにくくなります。したがって、私は__get/を強く好み__setます。とはいえ、いくつかの欠点があります。

  • データベースアクセスは数桁遅いため、実際にはそれほど違いはありませんが、通常の関数呼び出しよりも大幅に遅くなります。
  • __get/__setフィールドが表示されていない場合にのみ呼び出されます。エンティティ クラスのコードでプロパティにアクセスしても、それらは呼び出されず、プロキシはそれ自体をロードする機会がありません。(Doctrine は、パブリック メソッドの 1 つが呼び出されるとすぐにプロキシをロードすることでこれを回避しようとしますが、__constructやなどの例外があり__wake、それが意味をなさない場合があります。コンストラクタ。)
  • PHP には、マジック メソッドに関連する紛らわしい動作がいくつかあります。たとえば、呼び出されempty($entity->field)ません__get(したがって、使用するとプロキシの動作が壊れます)。
于 2012-06-07T09:45:18.893 に答える
6

一部の情報を公開する必要がある場合は、そのゲッターを定義します。変更可能な場合は、setter を追加します (さらに良いのは、流暢な setter を追加することです!)。

API はこの方法でよりクリーンになり、魔法は使用されません。私は自分のコードで魔法が好きではありません。

ちょうど私の2セント:)


「流暢なセッター」とは、流暢なインターフェイス パターンを実装するものを意味します。

于 2010-12-27T08:13:17.667 に答える
2

はい、ゲッター メソッドとセッター メソッドは、データにアクセスする方法です。doctrine2 や hibernate を好まない人がいる理由は少し面倒です。ただし、エンティティごとに 1 回だけ実行する必要があり、希望する出力フォーマットを非常に柔軟に生成できます。cli を使用して、これを行うことができます。しかし、あなたがそれらを転がすとき、私はそれが大したことではないと思います. 特に、必要なプロパティに対してのみこれを行うためです。

乾杯

于 2010-12-16T13:45:47.550 に答える
2

ゲッターとセッターを別々にしたり、魔法の関数を使用したりするのではなく..クラスにこのようなものがあることに問題はありますか

public function Set($attrib, $value)
{
    $this->$attrib = $value;    
}

public function Get($attrib)
{
    return $this->$attrib;
}   

属性へのアクセスが非常に簡単になり、キーペア配列から動的に設定されることを意味します..何かコメントはありますか? または代替提案?

于 2012-01-14T18:55:01.007 に答える
1

Doctine 2 は、基本的なエンティティ クラスを生成するための [コマンド ライン ツール][1] を提供します。

以下を使用して、マッピングから基本的な Entity クラス定義を取得し、各プロパティのゲッター/セッター関数を完成させます。

path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/

Entity 用に生成された getter/setter メソッドは型のキャスト/変換を行わないため、適切なデータ型であることを確認するために、各 getter/setter を変更する必要があります。

于 2011-12-14T20:42:11.200 に答える