使用PHP的OOP新手

时间:2011-05-04 22:58:23

标签: php oop

我一直在尝试使用PHP5学习OOP,但我无法绕过一些事情。

首先;我在OOP中理解继承,但我在PHP中不理解的是为什么我只能使用一次扩展来扩展父类。我一直在网上做一些阅读,有几次我已经看到使用延伸不止一次不好的做法,这就是为什么它不可用,这是真的吗?

二;抽象与接口,我读了一种方法来多次继承一个类是使用接口和/或抽象。这是对的吗?

第三;我正在使用继承编写一个非常简单的类,我在理解如何正确构造它时遇到了问题。我已经通过php.net和操作系统看了很多课程以及它们是如何编写的,但是任何人都可以花时间在PHP中编写一个简单的例子....让我们说哺乳动物类作为父类并且有狗,猫和熊以及儿童班。

我知道我可以在网上找到已经写好的内容,但这样我就可以和编写课程的人交谈。

3 个答案:

答案 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)

  1. 是的,这是真的PHP官方只支持一次扩展一个类,它对所有OOP都是一个bug,因为没有好的OOP理由不能用于语言。你也可以规避它,但不建议这样做,因为语言不支持它(我现在忘了)。
  2. 不确定你的意思是什么,抽象类是在使用之前应该抽象的类。将它们视为80%完整的类,有一些功能缺失,必须在每个应用程序级别实现。

    接口是类的骨骼,没有功能,但定义了所有功能。它们不被扩展或使用它们被引用。如果一个类实现并且接口它提交实现接口中声明的所有函数(可能更多)并且PHP抛出一个错误如果不是这样的话。
  3. 一个非常简单的例子

    
    
    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)

  1. 我认为你在谈论Multiple Inheritance?从技术上讲,这是PHP开发人员的设计决策。还有其他语言允许它。

    多重继承有一些技术问题(Diamond Problem),但有一个很好的理论论据反对它:一个类应该有一个责任(Single Responsibility Principle,它说“对象”因为有无类别但面向对象的语言)。两个不同的类通常具有不同的职责,因此如果一个类继承了它们,那么它将有两个职责,违反了SRP。

  2. 请参阅Search for "abstract class interface" - 使用interface定义类必须实现的方法以满足合同,如果要部分实现某些东西(通常是接口),请使用抽象类。

  3. 不可能,因为你没有说明应该对哺乳动物的哪些方面进行建模。在不知情的情况下,甚至不可能知道是否需要不同的哺乳动物类别或共同基类。