是否有机会在PHP中创建一个接口函数,其中参数需要是一个对象,但未指定,它必须是什么对象?
现在我的代码看起来像这样:
interface Container {
public static function add(\Employee $element);
}
现在我可以使用参数实现该函数,该参数需要来自" Employee"的实例。当我现在在类中实现它时,它看起来像这样:
class EmployeeContainer implements Container {
public static function add(\Employee $element) {
$pnr = $element->getPNR();
}
}
当我创建另一个类,它实现Container并将所需的对象设置为例如Trainee时,PHP编译器会抛出错误:
class TraineeContainer implements Container {
public static function add(\Trainee $element) {
$pnr = $element->getPNR();
}
}
致命错误:必须声明TraineeContainer :: add($ element) 与Container :: add(Employee $ element)兼容
有没有办法在界面中设置自定义对象所需的对象?
为什么我要这个?
许多IDE支持这种形式的实例描述来建议基于对象的方法。
答案 0 :(得分:2)
不幸的是没有。唯一的方法是检查方法中的参数类型:
public static function add($element) {
if(!$element instanceof \Trainee) {
throw new \InvalidArgumentException("your exception message");
}
$pnr = $element->getPNR();
}
答案 1 :(得分:1)
在界面中无法使用Custome对象参数,但您可以通过其他方式实现它。
创建一个公共基类
class SomeBaseClass{
}
扩展你的课程
class Employee extends SomeBaseClass{
}
class Trainee extends SomeBaseClass{
}
然后在您的界面中使用SomeBaseClass
作为参数
interface Container {
public static function add(SomeBaseClass $element);
}
class EmployeeContainer implements Container {
public static function add(SomeBaseClass $element) {
$pnr = $element->getPNR();
}
}
class TraineeContainer implements Container {
public static function add(SomeBaseClass $element) {
$pnr = $element->getPNR();
}
}
您似乎拥有getPNR
常用功能,因此您可以创建一个抽象类或接口,并在子类中使用它。