2012-07-16 55 views
0

好吧,我知道這可能是不可能的,但我會試一試。也許我的知識不太好。請不要低估,這只是爲了好奇,這可能是由於糟糕的OO設計。覆蓋PHP中沒有繼承的實例方法?

承擔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 

回答

0

這是不是真的我清楚你正在嘗試做的,但在PHP中,你可以有CALSS甲乙經書面B類聲明爲如此擴大A類:

Class B extends Class A { 
    ... 
} 

您可以在覆蓋的像

public function fetchData { 
    // do something different than in class A 
} 

或者

public function fetchData { 
    // execute the Class A functionality first 
    parent::fetchData(); 

    // now do something in addition to what is in Class A functionality 
} 

希望這有助於B類內fetchData功能。

+0

當然我知道。但是把A和B想象成具有不同含義的獨立對象,這不是繼承的一部分...... – gremo 2012-07-16 23:10:55

0

簡短的回答是否定的。

你可以得到你所要求的正是最接近的是一樣的東西:

class A 
{ 
    public function __construct() 
    { 
    $this->bar = function() 
    { 
    }; 
    } 

    public function foo() 
    { 
    $bar = $this->bar; 
    $bar(); 
    } 
} 

$a = new A(); 
$a->bar = function() 
{ 
    // override 
}; 
$a->foo(); 

需要PHP 5.4 $this支持。但請記住,人們在JavaScript中這樣做,因爲它沒有「真正的」面向對象編程。你不應該試圖模仿JavaScript,Ruby,Python等等,只是爲了這樣做。

要清楚:在PHP中,繼承或組合或依賴注入可能是您正在嘗試執行的正確方法。 (上面的黑客肯定是而不是你應該怎麼做。)