将子实例传递给函数'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的函数。