2012-07-16 74 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中,继承或组合或依赖注入可能是您正在尝试执行的正确方法。 (上面的黑客肯定是而不是你应该怎么做。)