PHP类、接口、继承

PHP类、接口、继承,php,Php,我试图理解php中的继承。我有两个类ShopProduct和CdProduct。ShopProduct类有一个方法getName。CdProduct类继承扩展ShopProduct类并具有方法DoWork。在index.php文件中,我创建了一个one-CdProduct对象,并将其传递给采用一个参数的方法,如函数WorkShopProduct$item{…}。现在,我可以理解我可以使用$item参数调用getName方法,我知道我可以使用$item调用DoWork方法,但我不明白这是怎么可能的

我试图理解php中的继承。我有两个类ShopProduct和CdProduct。ShopProduct类有一个方法getName。CdProduct类继承扩展ShopProduct类并具有方法DoWork。在index.php文件中,我创建了一个one-CdProduct对象,并将其传递给采用一个参数的方法,如函数WorkShopProduct$item{…}。现在,我可以理解我可以使用$item参数调用getName方法,我知道我可以使用$item调用DoWork方法,但我不明白这是怎么可能的。。。我希望我是清楚的…:-

这是可能的,因为作为参数传递的对象恰好包含DoWork方法。在不进行类型检查的情况下调用属于继承类的此类方法是有风险的

当提到的是ShopProduct时,为什么它允许您提供CdProduct参数?从ShopProduct派生的任何类都将包含其所有属性和方法,因此不会影响方法体中的功能

通过这种方法可以实现的是一种工作方法,它可以接收从ShopProductCdProduct、BookProduct、CandyProduct派生的任何类型作为参数,而不需要为实际执行相同操作的每种类型[WorkCdCdProduct$item或WorkBookBookProduct$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...
 }

它之所以有效是因为PHP5引入了类型暗示:。 因此CdProduct确实继承了ShopProduct中声明的所有公共和受保护的方法以及属性,因此您可以调用getName方法。当您将CdProduct实例传递给Work函数,该函数将第一个参数声明为ShopProduct而不是CdProduct时,您将强制将参数强制转换为ShopProduct。 因此,如果您将与CdProduct实例不同的内容作为参数传递,例如字符串作为示例,则会出现错误,但由于继承性,这不会失败,但应该打印一个通知

您可以从上面发布的链接中的评论中看到:


p、 注意:当在继承类中使用时,会出现一个严格的注意事项,因为继承类的函数定义与父类的定义不匹配-不同类型提示-但它工作得很好

不是所有的属性:只有受保护和公开声明的属性。我假设是最简单的场景,希望Knight在理解步骤0后有兴趣和动机发现所有细节和晦涩之处。谢谢大家…我了解继承以及它如何与私有、公开和受保护方法一起工作,属性等,但因为我以前学过C,perent类不能调用Childrent类,所以我有点困惑。齐鲁·康斯坦丁-亚历山德罗·你的第一句话是我想澄清的主题。perent class ShopProduct如何调用childern的方法DoWork,甚至通过对children class产品的引用。。。