2012-02-28 51 views
0

我有兩個班作爲PHP函數了兼容性問題

class A{ 
public function Get($a='0',$b=''){ 
    retrun 0; 
} 
} 

class B extends A{ 
public function Get($a){ 
    return 0; 
} 
} 

它在本地機器上工作用PHP 5.2.5,當我遷移與PHP 5.3.4它給了以下錯誤直播服務器上的應用程序:

Declaration of B::Get() should be compatible with that of A::get() 

我該怎麼辦?我不能改變PHP版本的遠程服務器。

+0

我不認爲它的錯誤,它只是一個通知。最簡單的解決方法是將seipram添加到函數中,例如。 '函數get($ a,$ b = NULL)'所以你不需要給第二個參數,但是對於這兩個參數的聲明是一樣的。 – Rufinus 2012-02-28 16:01:25

+0

但是我有這樣幾百萬個函數 – Kutta 2012-02-28 16:02:07

+0

只是一個猜測,但你使用的是接口嗎?沒關係 - 你能檢查它的錯誤或通知嗎?如果是這樣的話,你可以在php.ini或(.htaccess或ini_set())中禁用這種通知。尋找E_STRICT(afaik) – Rufinus 2012-02-28 16:06:29

回答

2

Get()的函數聲明需要匹配A類和B類,也就是說它們需要有相同數量的參數。從你上面的例子看來,A :: Get()需要2個參數,B :: Get()只需要1個參數。他們都需要採取2.

+0

但是我的應用程序中有數百萬個這樣的函數 – Kutta 2012-02-28 16:02:59

+0

不推薦,但可以通過關閉E_STRICT錯誤來抑制錯誤。 – mmcnickle 2012-02-28 16:06:17

1

基本上你的問題的根源是破碎的API。

如果你有兩個類有兩個完全不同的方法,那麼一個不能是其他的子類。這只是錯誤的。

但讓我們假設你無能爲力。在這種情況下,要解決的最簡單的方法是改變B的聲明中得到::():

class B extends A 
{ 
    public function get($a , $b = null) 
    { 
     return $this->do_something_with($a); 
    } 
} 

這樣,您就可以完全忽略第二個參數,它不會是必要的。

但是這是一個壞主意

但請記住,整個情況是由於違反Liskov substitution principle而導致的。圖像應有助於理解:

enter image description here

0
class A{ 
public function Get($a='0',$b=''){ 
    retrun 0; 
} 
} 

class B extends A{ 
public function Get($a){ 
    return parent::Get($a,null); 
} 
} 

它正在與PHP 5.3.5。