为什么界面别名在函数参数中表现不同?

时间:2015-08-11 16:53:59

标签: php oop

接口别名似乎不像我期望的那样在PHP中工作。

这是否是我在生产代码中应该避免的无证功能?或者PHP中的别名接口是否有最佳实践?

所有PHP文档似乎都说你可以创建别名,并且没有指定任何关于接口的唯一内容:

  

“支持命名空间的所有PHP版本都支持三种   别名或导入:别名类名,别名接口   name和别名命名空间名称。“   php.net

<?php namespace RootNamespace;

use ChildNamespace\ISomeInterface as ISomeInterface;
use ChildNamespace\ImplementationOfSomeInterface as ImplementationOfSomeInterface;

class App {

    public static function SomeFunc(ISomeInterface $i) {
        return $i;
    }

    public static function SomeOtherFunc(ChildNamespace\ISomeInterface $i) {
        return $i;
    }
}

$i = new ImplementationOfSomeInterface();

// Throws Catchable fatal saying that ImplementationOfSomeInterface != ISomeInterface
App::SomeFunc($i); 

// Works as 'expected'
App:SomeOtherFunc($i);

[附加假码]

<?php namespace RootNamespace\ChildNamespace;

interface ISomeInterface {
    public function RequiredFunc($param);
}

class ImplementationOfSomeInterface implements ISomeInterface {
    public function RequiredFunc($param) {
        return $param;
    }
}

为了记录,我注意到PHP版本上的这种行为:PHP 5.5.9-1ubuntu4.11

1 个答案:

答案 0 :(得分:3)

public static function SomeOtherFunc(ChildNamespace\ISomeInterface $i)

此类型是指\RootNamespace\ChildNamespace\ISomeInterface,而不是\Childnamespace\ISomeInterface