我一直在尝试使用PHP5学习OOP,但我无法绕过一些事情。
首先;我在OOP中理解继承,但我在PHP中不理解的是为什么我只能使用一次扩展来扩展父类。我一直在网上做一些阅读,有几次我已经看到使用延伸不止一次不好的做法,这就是为什么它不可用,这是真的吗?
二;抽象与接口,我读了一种方法来多次继承一个类是使用接口和/或抽象。这是对的吗?
第三;我正在使用继承编写一个非常简单的类,我在理解如何正确构造它时遇到了问题。我已经通过php.net和操作系统看了很多课程以及它们是如何编写的,但是任何人都可以花时间在PHP中编写一个简单的例子....让我们说哺乳动物类作为父类并且有狗,猫和熊以及儿童班。
我知道我可以在网上找到已经写好的内容,但这样我就可以和编写课程的人交谈。
答案 0 :(得分:3)
首先;我在OOP中理解继承,但我在PHP中不理解的是为什么我只能使用一次扩展来扩展父类。我一直在网上做一些阅读,有几次我已经看到使用延伸多次不好的做法,这就是为什么它不可用,这是真的吗?
简而言之:它只是来自PHP核心开发人员的设计决策。当两个父类实现相同的方法时,多重继承会带来许多问题,例如应该发生什么?为了避免这种冲突,一些语言决定不支持它(例如Java也是如此;))。它没有真正的缺点。
二;抽象与接口,我读了一种方法来多次继承一个类是使用接口和/或抽象。这是对的吗?
您可以根据需要扩展每个班级。对类,抽象类和接口都没有限制。但是,可以在一个类中实现(implements
关键字)多个接口。
第三;我正在使用继承编写一个非常简单的类,我在理解如何正确构造它时遇到了问题。我已经通过php.net和操作系统看了很多课程以及它们是如何编写的,但是任何人都可以花时间在PHP中编写一个简单的例子....让我们说哺乳动物类作为父类并且有狗,猫和熊以及儿童班。
abstract class Mammal {}
class Dog extends Mammal {}
class Cat extends Mammal {}
class Bear extends Mammal {}
答案 1 :(得分:1)
class Mammal{
function getBones(){}
}
class Dog extends Mammal{
function bark(){}
}
class Cat extends Mammal{
function meow(){}
}
$d = new Dog()
$d->bark()
//Works
$d->getBones()
//works
$d->meow()
//does not work, is a cat function
答案 2 :(得分:0)
我认为你在谈论Multiple Inheritance?从技术上讲,这是PHP开发人员的设计决策。还有其他语言允许它。
多重继承有一些技术问题(Diamond Problem),但有一个很好的理论论据反对它:一个类应该有一个责任(Single Responsibility Principle,它说“对象”因为有无类别但面向对象的语言)。两个不同的类通常具有不同的职责,因此如果一个类继承了它们,那么它将有两个职责,违反了SRP。
请参阅Search for "abstract class interface" - 使用interface定义类必须实现的方法以满足合同,如果要部分实现某些东西(通常是接口),请使用抽象类。
不可能,因为你没有说明应该对哺乳动物的哪些方面进行建模。在不知情的情况下,甚至不可能知道是否需要不同的哺乳动物类别或共同基类。