2012-01-22 178 views
4

可能重複:
Referring to a static member of a subclass調用靜態方法繼承接口

請看看下面的代碼來了解我的問題。

<?php 

Interface IDoesSomething 
{ 
    public static function returnSomething(); 
} 

abstract class MiddleManClass implements IDoesSomething 
{ 
    public static function doSomething() 
    { 
     return 1337 * self::returnSomething(); 
    } 
} 

class SomeClass extends MiddleManClass 
{ 
    public static function returnSomething() 
    { 
     return 999; 
    } 
} 

// and now, the vicious call 
$foo = SomeClass::doSomething(); 

/** 
* results in a 
* PHP Fatal error: Cannot call abstract method IDoesSomething::returnSomething() 
*/ 
?> 

有沒有辦法來強制returnSomething()抽象,同時保持呼叫從一個抽象的「中間人」類中定義的函數的函數的可能性?看起來像PHP的瓶頸給我。

+0

我的問題是根本不同的,儘管答案是相同的。 – Daniel

+0

你的具體問題有些(不是根本上)不同,但抽象問題(LSB)是相同的。 – Gordon

回答

9

如果你的PHP版本> = 5.3爲什麼要使用靜態然後更改

public static function doSomething() 
{ 
    return 1337 * self::returnSomething(); 
} 

public static function doSomething() 
{ 
    return 1337 * static::returnSomething(); 
} 
2

,這不是很好的OOP?靜態在繼承中並不適用,因爲它們旨在爲該類專門提供功能。這就是你需要的。

<?php 

Interface IDoesSomething{ 
    public function returnSomething(); 
} 

abstract class MiddleManClass implements IDoesSomething{ 
    public function doSomething(){ 
     return 1337 * $this->returnSomething(); 
    } 
} 

class SomeClass extends MiddleManClass{ 
    public function returnSomething(){ 
     return 999; 
    } 
} 

$someClass = new SomeClass(); 
$foo = $someClass->doSomething(); 
+0

不幸的是,根據項目不能滿足我的要求...更抽象地說,儘管我完全同意你的看法。 – Daniel

+0

然後,我會重新評估您的設計,因爲靜力學不太可能是唯一的解決方案。 – Robert

2

這個問題被稱爲「後期靜態綁定」:php manual