任何对象的类型提示

2022-08-30 09:56:50

我一直在研究旨在与对象一起使用的代码,而并不真正关心对象的类型。我想键入提示,即正在编写的方法需要任何类型的对象,但遇到了一些困难。

我试过了,但是当我尝试传入对象时,这两个都产生了错误:function myFunc (object $obj)function myFunc (stdClass $obj)

可捕获的致命错误:传递给 MyClass::MyFunc() 的参数 1 必须是对象的实例,给定对象ActualClass 的实例

同样的事情也发生在stdClass

我错过了什么?我认为所有没有显式从另一个类继承的类都继承自 ,这意味着PHP中每个类的基类都是。难道不是这样吗?stdClassstdClass


答案 1

stdClass 不是基类!PHP 类不会自动从任何类继承。所有类都是独立的,除非它们显式扩展另一个类.PHP在这方面与许多面向对象的语言不同。


答案 2

强制执行的最佳方法是创建一个名为 的退化接口。退化接口意味着它没有定义的方法。Object

interface Object {

   // leave blank

}

然后在基类中,可以实现 。Object

class SomeBase implements Object {

   // your implementation

}

现在,您可以根据需要调用函数

function myFunc (Object $obj);

myFunc($someBase);

如果传递从接口继承的任何对象,则此类型提示将通过。如果传入数组、整数、字符串等,则类型提示将失败。Object


推荐