PHP的高级OOP功能的真实世界示例

时间:2011-01-13 10:14:23

标签: php oop

我正在努力提高我在PHP中的OOP知识,并一直在研究抽象类和接口。

我学到了什么

  • 它们都是不能自己实例化的类,但可以扩展(在接口的情况下实现)
  • 抽象类为扩展它们的其他类提供方法和属性。
  • 如果一个类使用抽象方法,那么该类本身也必须是抽象的。
  • 如果在抽象类中定义了抽象方法,则所有子类都必须定义该方法的详细信息。未定义为抽象的方法可以与普通方法一样使用。
  • 接口定义实现它的类必须具有的方法。接口中未定义方法的功能,接口仅提供必须包含在子类中的方法列表。
  • 界面未定义任何属性。
  • 类可以实现任意数量的接口,但是它们必须为它们实现的每个接口定义一个方法

我认为这涵盖了基础知识。如果您认为我遗漏了任何内容,请随意添加。

我想知道的是,是否有任何实际的这些类的实现示例,尤其是接口类。有没有人知道任何使用它们的开源应用程序我可以浏览以更好地理解它们并查看它们在何时何地被有效使用?我遇到过使用动物的书籍例子,但没有证明这些课程的重要性。

5 个答案:

答案 0 :(得分:2)

PHP附带了一些默认预定义的接口:http://www.php.net/manual/en/reserved.interfaces.php

PHP还包含标准PHP库(SPL),它定义了更多:

Zend Framework也是使用此类概念的非常好的示例。 http://framework.zend.com/

答案 1 :(得分:1)

这不是一个真实世界的例子,但是你经常遇到接口和抽象类的一个设计模式是Command Pattern。请参阅链接以获取示例代码。

通常,“针对接口编程”被认为是良好的OO实践,因为它将具体实现分离,并允许您更轻松地将其更改为其他实现,例如:而不是要求特定的课程

public function fn(ConcreteClass $obj)
{
    $obj->doSomething()
}

你只是要求它提供一套特定的方法

public function fn(MyInterface $obj)
{
    $obj->doSomething()
}

接口还有助于区分大型继承结构。因为PHP仅支持单一继承,所以您经常会看到如下的层次结构:

BaseClass -> Logger -> Auth -> User

其中每个都包含这些类中使用的特定方面。使用界面,您只需

User implements Loggable, Authenticable

然后通过策略模式或组合/聚合包含该特定代码,这最终更易于维护。

有关PHP中预定义接口的列表,请参阅我的回答:

答案 2 :(得分:1)

final关键字阻止类被其他类扩展,例如:

class Parent
{
}

class Mother extends Parent
{
}

final class Brother extends Mother /* - This class cannot be extended - */
{
}

class Pet extends Brother
{
}

Pet类会抛出错误说明:Fatal error: Class Pet may not inherit from final class (Brother)

这也适用于方法,因此如果您不想允许继承方法,导致子类具有与覆盖相同的方法。

http://php.net/manual/en/language.oop5.final.php

Yo使用了你想要的一些真实世界的例子,可以使用哪些接口,以及数据库抽象层

您有一个基类,它提供了迭代数据库数据的基本方法,但是会使用子类作为数据库类型,例如MySqlMsSql等,每个数据库类型将拥有自己的类,但是对于基类来确保它具有这些方法,它们都将实现相同的接口。

实施例

interface IDatabaseLayer
{
    public function connect();
    public function query();
    public function sanitize();
    //...
}

因此基类知道MySql和MsSql具有上述方法,从而减少错误并使其更有条理。

当您将对象传递给类时,您希望确保Object属于某种类型,PHP5允许您定义应将哪些类型的对象作为参数传递给方法。

假设您有3个班级

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

您可以在DatabaseConnection的构造中明确定义您需要DatabaseCredentials类,如下所示:

class DatabaseConnection implements Connectable
{
    public function __construct(DatabaseCredentials $ConnectionDetails)
    {
        $this->Connect($ConnectionDetails->BuildDSN());
    }
}

真正开始的好方法是阅读:


您可能希望查看的PHP5的另一个功能是名称空间,这将允许您保持代码有序,具有相同名称的多个对象,使自动加载更有效

小例子:

namespace Database\MySql
{
    class Database{}
}

namespace Database\MsSql
{
    class Database{}
}

你可以使用:

use Database;
$Database = new MySql\Database();

答案 3 :(得分:1)

您可以在dzone或直接在"PHP patterns" series中关注Giorgio Sironi的his blog,如果您对模式和OOP感兴趣,那么非常有趣。

如果您需要一本好的PHP书籍,也可以查看stackoverflow中的Best PHP programming book

答案 4 :(得分:0)

我们可以说接口纯粹是100%抽象类,而抽象不是。因为很多时候我们在抽象类中定义函数。但是在接口类中我们总是声明函数。