2

私がやろうとしているのは、Plain Old PHP Object を使用してドメイン モデルを作成することです。すべてのインフラストラクチャを実行するライブラリを作成しています。だから私のモデルの1つはこのように見えます

class Project {
  public $id;
  public $name;
  public $typeId;

  private $type;

  public function getType() {
    return $this->type;
  }

  public function setType(Type $type) {
    $this->typeId = $type->id;
    $this->type = $type;
  }
}

新しいプロジェクトを作成setTypeし、有効な Type オブジェクトで呼び出し、ORM を使用してプロジェクト インスタンスを保存すると、プロジェクトとタイプの両方が保存されます。しかし、その後、プロジェクトをロードし、getTypeメソッドを使用して、ORM がこのメソッドを透過的に変更して、永続性からオブジェクトをロードするようにします。したがって、この方法は次のとおりです。

public function getType() {
  return $this->type;
}

透過的に次のように変更されます。

public function getType() {
  if (is_null($this->type) {
    $this->type = $this->adapter->findById('table', $this->typeId);
  }

  return $this->type; // or return parent::getType();
}

アウトレット PHP は eval を使用して Project_Proxy という Project の Proxy クラスを作成しますが、Project のサブクラスが存在する場合があるため、方法があれば Reflection API を使用して解決策を探しています。

Googleで検索しましたが、メソッドの動作を変更する方法が見つかりませんでした

編集:または、Outlet PHP の eval メソッドを使用して、モデルとそのすべてのサブクラスのプロキシ クラスを作成することをお勧めしますか?

4

2 に答える 2

3

これを行う組み込みの方法はありません。runkitという PECL 拡張機能を使用してそれを行うこともできますが、別の解決策を見つけることを強くお勧めします。何も知らない関数の実装を変更することは非常に危険であり、すべてif (is_null(...の関数のステートメントを記述するよりも、そのようなバグを 1 つデバッグするのに時間がかかる可能性があるというバグにつながる可能性があります。

ところで: を使用しないis_null()でください。データベースから null 値を何度も取得する可能性があるためです。フェッチした値を別の変数に格納する必要があります。

于 2009-11-18T06:55:16.557 に答える
0

php.netのリフレクションドキュメントを見ると、飛行中にメソッドを変更することはできないようです。

別の方法でそれを行うようにしてください。

于 2009-11-18T06:51:03.817 に答える