給定一個基類,其中有一些必須在特定方法之前和之後運行的邏輯,它在其不同的派生類中採用截然不同的參數。 作爲一個例子:在PHP中執行掛鉤方法
abstract class Base{
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }
abstract public function doIt();
}
class Cheating extends Base
{
public function doIt(){
$this->pre();
print "Doing it the cheating way\n";
$this->pos();
}
}
但是其實我喜歡做的是沿着線:
class Alpha extends Base
{
public function doIt($x, $y){
print "Doing it in Alpha with x=$x, y=$y";
}
}
class Beta extends Base
{
public function doIt($z){
print "Doing it in Alpha with z=$z";
}
}
,並有一些方法來始終運行前和POS機的方法,而不必改變doIt方法本身。
最顯而易見的方法,應該doIt方法是同質的跨庫的所有派生會是這樣的:
abstract class Base
{
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }
public function process($a,$b){
$this->pre();
$this->doIt($a,$b);
$this->pos();
}
abstract public function doIt();
}
class Wishful extends Base
{
public function doIt($a, $b){
print "Doing it the Wishful way with a=$a, b=$b\n";
}
}
問題存在是因爲我們有不同的參數個數和類型上的doIt方法的每個實現,它實際上並沒有解決問題。
這聽起來像是一個「鉤子」的情況 - 人們如何去實現這些?或者任何其他體面的解決問題的方式......我相信應該有一種更簡單的方式,我只是想念 - 可能是在圈子裏思考一件錯誤的事情。
謝謝!
讓你的方法私人和使用魔術方法__call – datasage