【问题标题】:New to OOP using PHP使用 PHP 的 OOP 新手
【发布时间】:2011-08-18 22:46:55
【问题描述】:

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

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

第二; Abstract vs. Interface,我读过很多次继承一个类的方法是使用Interface和/或Abstract。这是正确的吗?

第三;我正在使用继承编写一个非常简单的类,但在理解如何正确构造它时遇到了问题。我已经查看了 php.net 和 OS,并且已经看到了许多类以及它们是如何编写的,但是任何人都可以花时间用 PHP 编写一个简单的示例,使用 .... 假设一个哺乳动物类作为父类并养狗、cat、bear 和子类。

我知道我可以在网上找到一些已经写好的东西,但是这样我可以和写这门课的人交流。

【问题讨论】:

  • 这样的stackoverflow有很多问题,你不先搜索一下吗?
  • @Robert,我知道 OS 有很多关于这个话题的话题,但就像我在上一句中所说的那样,我想直接与某人交谈,而不是劫持别人的话题。

标签: php oop


【解决方案1】:

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

简而言之:它只是 PHP 核心开发人员的设计决定。多重继承带来了很多问题,例如,当两个父类实现相同的方法时会发生什么?为了避免这种冲突,一些语言决定不支持它(例如 Java 也;))。它没有真正的缺点。

第二; Abstract vs. Interface,我读过很多次继承一个类的方法是使用Interface和/或Abstract。这是正确的吗?

您可以随心所欲地扩展每个类。对类、抽象类和接口都没有限制。但是,可以在一个类中实现多个接口(@98​​7654321@ 关键字)。

第三;我正在使用继承编写一个非常简单的类,但在理解如何正确构造它时遇到了问题。我已经查看了 php.net 和 OS,并且已经看到了许多类以及它们是如何编写的,但是任何人都可以花时间用 PHP 编写一个简单的示例,使用 .... 假设一个哺乳动物类作为父类并养狗、cat、bear 和子类。

abstract class Mammal {}
class Dog extends Mammal {}
class Cat extends Mammal {}
class Bear extends Mammal {}

【讨论】:

  • 根据您对第 2 段的回答,我将解释在这种情况下 abstract classinterface 之间的区别,特别是因为 interface 可以 extend 多个 interface (这显然会创建extendimplements 之间的混淆。
【解决方案2】:
  1. 是的,这是真的,PHP 仅官方支持一次扩展一个类,它对所有 OOP 来说都是一个错误,因为没有好的 OOP 理由不能这样做,但语言是有的。你也可以绕过它,但不推荐,因为它不被语言支持是有原因的(我现在忘记了)。
  2. 不知道你的意思是什么,抽象类是在使用它们之前应该抽象的类。将它们视为 80% 完整的类,缺少一些功能,必须在每个应用程序级别上实现。

    接口是类的骨骼,那里没有功能,但所有功能都已定义。它们不会被扩展或使用,它们将被引用。如果一个类 implements 和接口它承诺实现接口中声明的所有功能(可能更多)并且 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
    
    

【讨论】:

  • 谢谢你的例子,希望这不是一个愚蠢的问题,但这个例子能行吗?我问的原因是因为你不止一次地扩展 Mammal。我很欣赏这个例子,对我来说,实例化有时会有点混乱,所以谢谢你把它包括在内。
  • 刚刚回答了我自己的问题,是的,上面的方法会起作用。只是试了一下,就像你说的那样。再次感谢:-)
  • 是的,你可以随意扩展对象,你甚至可以扩展 Cat 来获得哺乳动物的功能。
【解决方案3】:
  1. 我想你说的是Multiple Inheritance?从技术上讲,这是 PHP 开发人员的设计决定。还有其他语言允许它。

    多重继承有一些技术问题(Diamond Problem),但是有一个很好的理论论据反对它:一个类应该有一个责任(Single Responsibility Principle,它谈到“对象”,因为有无类但面向对象语言)。两个不同的类通常有不同的职责,所以如果一个类继承自这两个类,它就会有两个职责,违反了 SRP。

  2. 参见Search for "abstract class interface" – 使用接口来定义类必须实现以满足契约的方法,如果您想部分实现某些东西(通常是接口),请使用抽象类。

  3. 不可能,因为您没有说明应该对哺乳动物的哪些方面进行建模。如果不知道这一点,甚至无法知道是否需要不同的哺乳动物类或共同的基类。

【讨论】:

  • 感谢您提出钻石问题,我从未听说过此内容,并将继续阅读。我正在阅读一本很好地解释 OOP 的书,但我对此很陌生,因此非常感谢大家的意见。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2016-11-15
  • 1970-01-01
  • 2012-12-20
  • 2013-11-16
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
相关资源
最近更新 更多