当我们收到一个子对象的实例作为父对象的类型暗示参数时,为什么我们有一个子对象而不是父对象?



将子实例传递给函数'f',该函数在下面的代码中由父类进行类型暗示。我期望在函数中看到父对象(基于我们对c++中oop的了解),但在PHP中,我收到了子对象。有人能给我解释一下吗?

class ParentClass
{
}
class ChildClass extends ParentClass
{
}
function f(ParentClass $p)
{
var_dump($p); // output: object(ChildClass)#1 (0) { }
}
f(new ChildClass);

在这个例子中,因为ChildClass继承自ParentClass,所以它拥有ParentClass的所有功能,加上在ChildClass中实现的任何功能。

函数f(ParentClass $p)需要一个对象is_a($p, "ParentClass"),该对象可以由ParentClass类型的对象或扩展(如ChildClass)来满足。

特定函数f(ParentClass $p)中的任何代码都应该只依赖于$p中有来自ParentClass的函数,而不是来自ChildClass的函数。

相关内容

最新更新