PHP接口接受接口参数?

时间:2015-10-14 05:23:34

标签: php oop

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

interface myInterface {
    public function a( myClass $a);
}

因为我可能不想传递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 ) {}
}

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

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

1 个答案:

答案 0 :(得分:3)

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

正如VolkerK所说:

  

wikipedia。通过缩小take_a()只允许&#34; apple&#34; s你不允许其他&#34; iA&#34; s,但接口iC要求接受任何iA作为参数。 - VolkerK

考虑到这一点,请参阅更正后的代码:

<?php

interface iA {
    function printtest();
}
interface iB {
    function play();
}

//since an interface only have public methods you shouldn't use the verb public
interface iC {
    function takes_a( iA $a );
    function takes_b( iB $b );
}

class apple implements iA {
    public function printtest()
    {
        echo "print apple";
    }
}
class bananna implements iB {
    public function play()
    {
        echo "play banana";
    }
}

//the signatures of the functions which implement your interface must be the same as specified in your interface
class obj implements iC {
    public function takes_a( iA $a ) {
        $a->printtest();
    }
    public function takes_b( iB $b ) {
        $b->play();
    }
}

$o = new obj();

$o->takes_a(new apple());
$o->takes_b(new bananna());