我错过了什么,或者PHP 5.x中是否真的不支持通用对象类型提示?
我发现支持提示数组非常奇怪,而提示对象不是,至少不是开箱即用.
我想要这样的东西:
function foo(object $o)
Run Code Online (Sandbox Code Playgroud)
就像我们一样:
function foo(array $o)
Run Code Online (Sandbox Code Playgroud)
可能的使用示例:对象集合类的方法.
解决方法:使用由所有类实现的接口"Object"或从泛型类"Object"扩展所有类并编写如下内容:
function foo(Object $o)
Run Code Online (Sandbox Code Playgroud)
嗯,那不可爱.
使用stdClass
类型提示不起作用:
可捕获的致命错误:传递给c :: add()的参数1必须是stdClass的一个实例,给出的是b的实例
由于类型提示应该使客户端代码适应您的API,因此您接受接口的解决方案似乎恰到好处.
以这种方式看待它:yourMethod(array $input)
给出yourMethod()
一个要使用的数组,从而确切地知道适用和可以使用的本机函数yourMethod()
.
如果您指定的方法如下:yourSecondMethod(yourInterface $input)
您还知道可以应用哪些方法,$input
因为您知道/可以查找接口附带的哪组规则yourInterface
.
在您的情况下,接受任何对象似乎是错误的,因为您无法知道在输入上使用哪些方法.例:
function foo(Object $o) {
return $o->thisMethodMayOrMayNotExist();
}
Run Code Online (Sandbox Code Playgroud)
(并不意味着语法有效)
我感觉到你的痛苦,但我也找不到办法.
尽管许多其他海报都说过,但想要"对象"类型暗示是完全合理的.他们只是没有考虑需要它的场景.
我正在尝试使用反射API进行一些工作,因此我不关心将哪个类传递给我的函数.我只关心它是一个对象.我不想要int,float,字符串或数组.我想要一个物体.鉴于反射现在是PHP的一部分,拥有对象类型提示肯定是有意义的.