接口别名似乎不像我期望的那样在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
答案 0 :(得分:3)
public static function SomeOtherFunc(ChildNamespace\ISomeInterface $i)
此类型是指\RootNamespace\ChildNamespace\ISomeInterface
,而不是\Childnamespace\ISomeInterface
。