PHP 类、接口、继承


PHP Class, Interface, Inheritance

我试图理解php中的继承。我有两个班级ShopProductCdProductShopProduct类有一个方法getName . CdProduct类继承(扩展(ShopProduct类并具有方法DoWorkindex.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 通知,因为继承类的函数定义与父类的定义不匹配(不同类型的提示( - 但它工作得很好!