扩展了php接口的实现

时间:2016-05-12 07:16:27

标签: php oop interface

PHP Object Interfaces上的手册说:

  

实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做会导致致命的错误。

不考虑以下情况:我有一个界面

interface Foo
{
    public function foo(SpecialClass $object);
}

其中只包含一个方法foo,它以SpecialClass为参数,具体类

class Bar
{
    public function foo(BaseClass $object)
    {
        // do something with $object
    }
}

Foo具有foo相同的签名,但BaseClass占用SpecialClass implements BaseClassFoo

理论上,只要在我的代码中我需要一些东西来满足Bar接口,我就可以使用Bar的实例,一切都应该工作(因为SpecialClass是一个BaseClass)。换句话说,Foo满足foo声明的合同,因为它有一个能够处理任何SpecialClass对象的方法Bar implements Foo

为了使它明确,并且能够在我的代码中实际使用它,我希望能够编写question1 type1 question2 type2 ... ,但是,正如文档中所述,这会引发致命的错误。

这个致命错误的原因是什么?是因为目前事情是这样完成的还是有特定的理由以这种方式做事?

2 个答案:

答案 0 :(得分:1)

DateTime不是StdClass,它们实际上是两个不同的类。

这不是Java,每个人都从Object

扩展

答案 1 :(得分:0)

正如@dynamic DataTime所述,stdClass不是class A { public function foo(); } class B extends A { public function foo(); public function bar(); } interface C { public function baz(B $obj) } class D implements C { public function baz(A $obj); } 。看一下下面的例子。

C

您可以看到baz接口的函数B接受参数A。然而,实现需要参数B。问题是A具有更多扩展接口,C不满足它。换句话说,foo()界面需要访问bar()A。但foo()只有B。如果情况正好相反,那么事情会起作用 - A满足 Process.Start("C:\Program Files\7-Zip\7z.exe", "a -tzip" + (ChosenFile & "\" & "SavedFiles") + NewFileName1) 的界面。

所以这不是暂时的行为,而且是正确的行为。