我试图理解php中的继承。我有两个课程ShopProduct
和CdProduct
。 ShopProduct
类有一个方法getName
。 CdProduct
类继承(extends)ShopProduct
类并拥有方法DoWork
。在index.php
文件中,我创建了一个CdProduct
对象,并将其传递给带有一个参数的方法,如function Work(ShopProduct $item){...}
。现在,我可以理解我可以使用getName
参数调用$item
方法,并且我知道我可以使用DoWork
调用$item
方法,但我不能明白这是怎么可能的......我希望我很清楚...... :-)
答案 0 :(得分:0)
这是可能的,因为作为参数传递的对象恰好包含 DoWork 方法。在没有类型检查的情况下调用这种方法(属于继承类)是有风险的。
为什么在提到的 ShopProduct 时,它会让您提供 CdProduct 参数?那么从 ShopProduct 派生的任何类都将包含它的所有属性和方法,因此不会影响方法体中的功能。
通过这种方法可以实现的是使用一种工作方法,可以从 ShopProduct ( CdProduct , BookProduct )中获取任何类型的参数作为参数, CandyProduct ),不需要为每种类型[ WorkCd (CdProduct $ item)或 WorkBook (BookProduct $ item)]提供单独的函数同样的事情。
如果您真的需要访问派生类型的特定方法和属性,您可以执行类似于对象类名称的切换:
switch(get_class($item))
{
case "CdProduct":
//CdProduct object specific code here
break;
case "BookProduct":
//BookProduct object specific here
break;
//And so and so forth...
}
答案 1 :(得分:0)
它起作用的原因是因为PHP 5引入了类型提示:http://php.net/manual/en/language.oop5.typehinting.php。 所以 CdProduct 确实继承了 ShopProduct 中声明的所有公共和受保护方法和属性,因此您可以调用 getName()方法。当您将CdProduct实例传递给Work函数时,该函数将第一个参数声明为 ShopProduct (而不是 CdProduct ),您强制将参数转换为 ShopProduct 即可。 因此,如果您传递的参数不同于 CdProduct 实例,就像字符串作为示例一样,您有一个错误,但由于继承,这不会失败(但它应该打印一个通知)。
正如您可以阅读上面发布的链接中的评论:
P.S。请注意:当在继承的类中使用时会出现STRICT通知,因为继承类的函数定义与父的定义(不同的类型提示)不匹配 - 但它很有效!