PHP函数兼容性问题

时间:2012-02-28 15:57:36

标签: php oop

我有两个班级

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

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

当我使用PHP 5.3.4在实时服务器上迁移应用程序时,它使用PHP 5.2.5在本地计算机上工作,它发出以下错误:

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

我该怎么办?我无法更改远程服务器的PHP版本。

3 个答案:

答案 0 :(得分:2)

Get()的函数声明需要匹配A类和B类,即它们需要具有相同数量的参数。从上面的例子中可以看出,A :: Get()接受2个参数而B :: Get()只接受一个参数。他们都需要2。

答案 1 :(得分:1)

基本上你问题的根源是API。

如果你有两个类有两个完全不同的方法,那么一个不能是其他的子类。这是错的。

但我们假设你无能为力。在这种情况下,最简单的修复方法是更改​​B :: get()的声明:

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

通过这种方式,您可以完全忽略第二个参数,但不需要它。

但这是一个坏主意

但请记住,整个情况都是违反Liskov substitution principle的原因。图像应该有助于理解它:

enter image description here

答案 2 :(得分: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。