使用自定义对象创建接口函数

Create interface function with custom object

是否有机会在PHP中创建一个接口函数,其中参数要求是一个对象,但没有指定,它必须是什么对象?

现在我的代码如下所示:

interface Container {
    public static function add(\Employee $element);
}

现在我可以用一个参数来实现这个函数,这需要一个来自"Employee"的实例。当我现在在 class 中实现它时,它看起来像这样:

class EmployeeContainer implements Container {
    public static function add(\Employee $element) {
        $pnr = $element->getPNR();
    }
}

当我创建另一个 class,实现 Container 并将所需的对象设置为 Trainee 时,PHP 编译器抛出错误:

class TraineeContainer implements Container {
    public static function add(\Trainee $element) {
        $pnr = $element->getPNR();
    }
}

Fatal error: Declaration of TraineeContainer::add($element) must be compatible with Container::add(Employee $element)

有没有办法在界面中将所需对象设置为自定义对象?

我为什么要这个?

许多 IDE 支持这种形式的实例描述以建议基于对象的方法。

不幸的是没有。唯一的方法是检查方法中的参数类型:

public static function add($element) {
    if(!$element instanceof \Trainee) {
        throw new \InvalidArgumentException("your exception message");
    }

    $pnr = $element->getPNR();
}

自定义 object 参数在接口中是不可能的,但你可以通过其他方式实现它。

建立共同基础class

class SomeBaseClass{

}

扩展你的 classes

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 通用函数,因此您可以创建一个抽象 class 或接口并在您的 child classes 中使用它。