使用自定义对象创建界面功能

时间:2017-03-28 08:59:38

标签: php class interface theory

是否有机会在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支持这种形式的实例描述来建议基于对象的方法。

2 个答案:

答案 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常用功能,因此您可以创建一个抽象类或接口,并在子类中使用它。