PHP接口接受接口参数?

use*_*841 5 php oop

我想在PHP中创建一个接口,但我不希望它对其在一个公共方法中接受的参数类型过于严格.我不想这样做

interface myInterface {
    public function a( myClass $a);
}
Run Code Online (Sandbox Code Playgroud)

因为我可能不想传递它的实例myClass.但是,我确实希望确保传递的对象符合某些参数,我可以通过定义一个接口来完成.所以我想指定使用接口的类,如下所示:

<?php

interface iA {}
interface iB {}

interface iC {
    public function takes_a( iA $a );
    public function takes_b( iB $b );
}

class apple implements iA {}
class bananna implements iB {}

class obj implements iC {
    public function takes_a( apple $a ) {}
    public function takes_b( bananna $b ) {}
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到了错误 PHP Fatal error: Declaration of obj::takes_a() must be compatible with iC::takes_a(iA $a) on line 15

有没有办法确保参数只接受某个接口的类?或许我是否过度思考/过度设计这个?

Rap*_*ler 3

你的观念是完全正确的。只有一点点错误。您的类方法必须具有与接口中指定的相同的签名。

\n\n

正如沃尔克所说:

\n\n
\n

参见维基百科。通过缩小 take_a() 的范围,只允许“apple”,您就不允许其他“iA”,但接口 iC 要求接受任何 iA 作为参数。\xe2\x80\x93 沃尔克K

\n
\n\n

考虑到这一点,请查看更正后的代码:

\n\n
<?php\n\ninterface iA {\n    function printtest();\n}\ninterface iB {\n    function play();\n}\n\n//since an interface only have public methods you shouldn\'t use the verb public\ninterface iC {\n    function takes_a( iA $a );\n    function takes_b( iB $b );\n}\n\nclass apple implements iA {\n    public function printtest()\n    {\n        echo "print apple";\n    }\n}\nclass bananna implements iB {\n    public function play()\n    {\n        echo "play banana";\n    }\n}\n\n//the signatures of the functions which implement your interface must be the same as specified in your interface\nclass obj implements iC {\n    public function takes_a( iA $a ) {\n        $a->printtest();\n    }\n    public function takes_b( iB $b ) {\n        $b->play();\n    }\n}\n\n$o = new obj();\n\n$o->takes_a(new apple());\n$o->takes_b(new bananna());\n
Run Code Online (Sandbox Code Playgroud)\n