我试图理解php中的继承。我有两个班级ShopProduct
和CdProduct
。 ShopProduct
类有一个方法getName
. CdProduct
类继承(扩展(ShopProduct
类并具有方法DoWork
。index.php
文件中,我创建了一个CdProduct
对象并将其传递给采用一个参数的方法,如下所示function Work(ShopProduct $item){...}
。现在,我可以理解我可以使用$item
参数调用getName
方法,我知道我可以使用$item
调用DoWork
方法,但我无法理解这怎么可能......我希望我很清楚... :-(
这是可能的,因为作为参数传递的对象恰好包含 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...
}
它之所以有效,是因为 PHP 5 引入了类型提示:http://php.net/manual/en/language.oop5.typehinting.php 。因此,CdProduct 确实继承了 ShopProduct 中声明的所有公共和受保护的方法和属性,因此您可以调用 getName(( 方法。当您将 CdProduct 实例传递给 Work 函数时,该函数将第一个参数声明为 ShopProduct(而不是 CdProduct(,您将强制将参数强制转换为 ShopProduct。因此,如果您将不同于 CdProduct 实例的内容作为参数传递,例如字符串作为示例,则会出现错误,但由于继承,这不会失败(但是它应该打印通知(。
正如您可以从上面发布的链接中的评论中读到的那样:
p.s. 请注意:在继承类中使用时,会出现 STRICT 通知,因为继承类的函数定义与父类的定义不匹配(不同类型的提示( - 但它工作得很好!