PHP类型提示:支持数组,对象不是?

Mar*_*urz 23 php oop

我错过了什么,或者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的实例

che*_*rtz 7

由于类型提示应该使客户端代码适应您的API,因此您接受接口的解决方案似乎恰到好处.

以这种方式看待它:yourMethod(array $input)给出yourMethod()一个要使用的数组,从而确切地知道适用和可以使用的本机函数yourMethod().

如果您指定的方法如下:yourSecondMethod(yourInterface $input)您还知道可以应用哪些方法,$input因为您知道/可以查找接口附带的哪组规则yourInterface.

在您的情况下,接受任何对象似乎是错误的,因为您无法知道在输入上使用哪些方法.例:

function foo(Object $o) {
    return $o->thisMethodMayOrMayNotExist();
}
Run Code Online (Sandbox Code Playgroud)

(并不意味着语法有效)

  • 对于一个对象集合类来说情况并非如此,它将作为一个(伪)容器,不会在其子节点上调用任何方法,也不会使用它们的任何属性/属性.知道变量是一个对象也可以在其上使用大量的本机函数,所以我真的没有看到你的观点. (2认同)
  • 如何使用类型提示,如SplObjectStorage或ArrayObject? (2认同)

Mar*_*urz 6

不,它无法完成.我没有遗漏任何东西.


Rik*_*kki 6

我感觉到你的痛苦,但我也找不到办法.

尽管许多其他海报都说过,但想要"对象"类型暗示是完全合理的.他们只是没有考虑需要它的场景.

我正在尝试使用反射API进行一些工作,因此我不关心将哪个类传递给我的函数.我只关心它是一个对象.我不想要int,float,字符串或数组.我想要一个物体.鉴于反射现在是PHP的一部分,拥有对象类型提示肯定是有意义的.