4

Enterprise Architect を使用して UML クラス図を作成し、それを使用して PHP5 コードを生成しています。thisを使用して、属性の getter と setter を作成できます。これは、コードでは次のようになります (関連する行のみが示されています)。

private $id;

public function getId()
{
    return $this->id;
}

/**
 * 
 * @param newVal
 */
public function setId($newVal)
{
    $this->id = $newVal;
}

プロパティごとに個別のメソッドを使用する代わりに、魔法のメソッド__get($property)を使用したいと思います。__set($property, $value)それは可能ですか?

ゲッターの場合、次のようになります。

public function __get($property)
{
    switch ($property) {
        case 'id': return $this->id; break;
        default: return null;
    }
}
4

5 に答える 5

6

実際には答えではありませんが、これをそのようにしたい場合は検討する必要があります。これには何のメリットもありませんが、IDE コード補完機能で問題が発生し、実際にはコードの保守が難しくなります。私の意見では、マジック __get/__set は動的プロパティにのみ使用する必要があります。それ以外の場合は、個別の set/get メソッドを使用するか、パブリック プロパティを使用してください。この答えはほとんどそれを要約しています。

それでもこの道を進みたい場合は、よりシンプルなアプローチをお勧めします。

于 2013-03-28T20:29:27.343 に答える
5

私はこのページの他の人々に同意します。それは悪い習慣であり、魔法のメソッドよりも単純な古いゲッターとセッターに固執する必要があります。アクセサー/ミューテーターで検証またはその他の計算が必要になると、スイッチ/ケースが爆発します。維持するのは面倒で、正確には継承に適していません。魔法のメソッドを持つ子クラスは、技術的に親の魔法のメソッドを上書きしています。

ただし、EA のコード テンプレート エディターを使用してコード テンプレートを変更することで、これを行うことができます。

コードテンプレートに関するエンタープライズアーキテクトユーザーガイドからの引用:

コード テンプレートを使用すると、既存の言語のコード生成をカスタマイズできます。例えば:

  • 新しいファイルの生成時に作成されたファイル ヘッダーを変更する
  • 必要なコーディング標準に合わせて、生成されたコードのスタイル (インデントや中括弧の位置など) を変更します。
  • 特定のステレオタイプを処理して、特殊なメソッド本体や追加のメソッドなどを生成します。

そしてさらに:

Enterprise Architect のベース コード テンプレートは、UML 要素から所定のプログラミング言語のさまざまな部分への変換を指定します。テンプレートは、マークアップ言語とスクリプト言語の両方の側面を共有する構文を使用して、プレーン テキストとして記述されます。

以下は、いくつかのテンプレートがロードされたコード エディターのサンプル画像です。

エンタープライズ アーキテクト コード テンプレート エディター

私はエディターや使用するテンプレート言語に精通していないため、実際の例を提供することはできません。しかし、本当にテンプレートを変更したい場合は、そこから理解できると思います。

于 2013-03-30T18:44:37.153 に答える
0

プロパティごとに個別のメソッドを使用する代わりに、魔法のメソッド __get($property) および __set($property, $value) を使用したいと考えています。それは可能ですか?

その場合、各プロパティを定義しないでください。1 つの単純な配列コンテナーで十分です。だから、これはまさにあなたが探しているものです:

class Foo 
{
   private $container = array();

   public function __set($property, $value)
   {
      $this->container[$property] = $value;
   }

   public function __get($property)
   {
       if (array_key_exists($property, $this->container)){

          return $this->container[$property];

       } else {

          trigger_error(sprintf('Undefined property "%s"', $property));
       } 
   }

}

$foo = new Foo();
$foo->bar = "123";

print $foo->bar; // prints 123

$foo->id = "test string";

print $foo->id; // test string

print $foo->nonExistingProp; //issues E_NOTICE 

アクセサー/修飾子を主張する場合は、それらをオーバーロードするだけです。使用して__call()

class Foo
{
    private $container = array();

    public function __call($method, array $args)
    {
        $property = substr($method, 3);

        if (substr($method, 0, 3) == 'get'){
           // getter is being used
           if (isset($this->container[$property])){
             return $this->container[$property];
           }
        }

        if (substr($method, 0, 3) == 'set'){
           //setter is being used
           $this->container[$property] = $args[0];
        }
    }
}

$foo = new Foo();

$foo->setId('__BAR__');
$foo->setStuff('__YEAH__'); 

print $foo->getId(); // prints __BAR__
print $foo->getStuff(); //prints __YEAH__
于 2013-04-03T19:26:37.793 に答える