如何在抽象方法的参数中添加classname类型?

时间:2016-04-26 12:14:24

标签: php html5 oop polymorphism extends

我有一个使用此方法的抽象类:

abstract class X {
   abstract public function method( $param );
}

在实施中我做了:

class Y extends X {
   public function method( ClassName1 $param )
   {
       ...
   }
}

class W extends X {
   public function method( ClassName2 $param )
   {
       ...
   }
}

我需要在这两种方法中加上ClassName1ClassName2,但我收到此错误:

Y::method()声明必须与...... {/ p>中的X::method($param)兼容

我需要在X类中声明抽象方法来解决问题吗? 真正的问题可能是:X::method( _____ $param )中的类名是什么来解决问题?

感谢。

3 个答案:

答案 0 :(得分:6)

您可以创建一个界面。 ClassName1ClassName2实现该接口。现在,您可以将接口用作方法参数中的类型提示。根据您的标记polymorphism,您可能知道如何使用界面,它们是什么以及它们带来的好处。这种方法称为 按合同设计 ,被认为是最佳做法。

答案 1 :(得分:2)

我不认为你会这样做是因为你打算暗示两个不同的类别。当您使用abstractinterface时,它基本上是承诺以与之前定义的方法相同的方式实施方法。添加类型提示会使它们显然不兼容。

我能建议的最好的事情就是在方法本身内进行检查

class Y extends X {
   public function method( $param )
   {
       if(get_class($param) != 'ClassName1') throw new Exception('Expected class ClassName1');
   }
}

答案 2 :(得分:1)

我相信这种独特的方式是这样的吗?     

class A {}

class B extends A {}
class C extends A {}

abstract class X {
      public abstract function method( A $param );
}

class Y {
      public function method(B $param ) {}
}


class Z {
      public function method(C $param ) {}
}

$y = new Y();
$z = new Z();

?>