PHP类,接口,继承

时间:2015-04-01 11:02:50

标签: php

我试图理解php中的继承。我有两个课程ShopProductCdProductShopProduct类有一个方法getNameCdProduct类继承(extends)ShopProduct类并拥有方法DoWork。在index.php文件中,我创建了一个CdProduct对象,并将其传递给带有一个参数的方法,如function Work(ShopProduct $item){...}。现在,我可以理解我可以使用getName参数调用$item方法,并且我知道我可以使用DoWork调用$item方法,但我不能明白这是怎么可能的......我希望我很清楚...... :-)

2 个答案:

答案 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通知,因为继承类的函数定义与父的定义(不同的类型提示)不匹配 - 但它很有效!