リフレクションを使用して、オブジェクトインスタンスのメソッドを変更することが可能です
-
20-09-2019 - |
質問
私は何をしようとしていることは平野古いPHPオブジェクトとドメインモデルを作成することです。 私は、すべてのインフラストラクチャのものを行いますライブラリを作成しています。 だから私のモデルの一つは、このようになります。
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;
}
}
これで新しいプロジェクトを作成し、有効なTypeオブジェクトをsetType
を呼び出し、プロジェクトとタイプの両方が保存されているORMを使用してプロジェクトのインスタンスを保存する場合。しかし、その後、私はプロジェクトをロードし、私はORMはpersitenceからオブジェクトをロードするために透過的にこの方法を変更したしたいgetType
メソッドを使用します。そこでここでは、この方法:
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はので、私は方法があるかどうリフレクションAPIを使用して解決策を探していますプロジェクトのサブクラスをProject_Proxyと呼ばれるプロジェクトのためのプロキシクラスを作成するためにevalを使用していますが、時々あるでしょう。
私はメソッドの動作を変更するために、とにかくGoogleで検索しましたが、見つかっていない。
の編集:?のか、私のモデルのためのプロキシクラスを作成するために、アウトレットPHPのevalメソッドを使用することをお勧めし、それらのすべてのサブクラスになります。
解決
これを行うことのない組み込み方法はありません。そして、あなたはは、runkit に呼ば PECL拡張モジュールを使用して、私は強く、別の解決策を見つけることをお勧めしますことを行うことができますが、 。あなたはの何でものを知ることができない関数の実装を変更することは非常に危険であり、単一の、そのようなバグをデバッグするには、のすべてののためのif (is_null(...
文を書くよりも長くかかることがバグにつながる可能性がありますあなたの関数ます。
ところで:あなたは何度も何度も、データベースからNULL値をフェッチするかもしれないので、is_null()
を使用しないでください。あなたが別の変数にフェッチされた値を格納する必要があります。
他のヒント
php.netでの反射ドキュメントのを見ると、それがに表示されます私は飛行方式に変更することは不可能です。
あなたは別の方法でそれを行うようにしてくださいます。