わかりました、おそらくこれが不可能であることはわかっていますが、試してみます。私の知識があまりよくないのかもしれません。反対票を投じないでください。これは単なる好奇心のためであり、おそらく OO の設計が不十分であることが原因です。
のクラス定義A
が次のとおりであるとします。
class A
{
public function build()
{
$data = $this->fetchData();
...
}
public function fetchData()
{
// Database eavy query
return $this->repository->fetchDataForCharting();
}
}
そして、適切でまともな OO 設計を使用せずに、他のさまざまな計算を行うために、リポジトリB
から使用するクラスを作成します。fetchDataForCharting
class B
{
public $data;
public function getMonthlyLimit()
{
// Database eavy query
$data = $this->getData();
}
public function getData()
{
return isset($this->data) ? $this->data :
$this->repository->fetchDataForCharting();
}
}
だけが必要な場合もあればA
、 だけが必要な場合もあれば、両方が必要な場合もありますB
。fetchData
実行時にオーバーライドする方法はありますか? $.extend()
jQueryのようなものを意味します:
$b = new B();
$b->getMonthlyLimit(); // $b->data filled
$a = new A();
// Override fetchData
$a = extend($a, 'fetchData', function() use($b) { return $b->data; });
$a->build(); // Just 1 query