首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP高级OOP特性的实例

问PHP高级OOP特性的实例
EN

Stack Overflow用户
提问于 2011-01-13 10:14:22
回答 5查看 6.8K关注 0票数 5

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

我学到了什么

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

我认为这包括了基本知识。如果你认为我错过了什么,请再加一句。

我想知道的是,是否有实现这些类的真实示例,特别是接口类。有谁知道有什么开源应用程序使用它们,我可以浏览,以更好地理解它们,看看它们何时何地被有效使用?我遇到过一些使用动物的书籍例子,它们未能证明这些课程的重要性。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-13 10:19:55

这不是一个真实的例子,而是一个设计模式,您通常会遇到接口和抽象类,这就是指挥模式。例如,请参阅链接代码。

一般来说,“针对接口的编程”被认为是很好的OO实践,因为它解耦了具体的实现,并且让您更容易地将它们更改为其他实现,例如,而不是请求一个特定的类。

代码语言:javascript
复制
public function fn(ConcreteClass $obj)
{
    $obj->doSomething()
}

您只需问它提供了一组特定的方法

代码语言:javascript
复制
public function fn(MyInterface $obj)
{
    $obj->doSomething()
}

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

代码语言:javascript
复制
BaseClass -> Logger -> Auth -> User

其中每一个都包含在这些类中使用的特定方面。有了接口,你就可以

代码语言:javascript
复制
User implements Loggable, Authenticable

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

有关PHP中预定义接口的列表,请参阅我对以下内容的答复:

票数 1
EN

Stack Overflow用户

发布于 2011-01-13 10:18:20

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

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

也是使用这些概念的一个很好的例子。http://framework.zend.com/

票数 2
EN

Stack Overflow用户

发布于 2011-01-13 10:25:48

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

代码语言:javascript
复制
class Parent
{
}

class Mother extends Parent
{
}

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

class Pet extends Brother
{
}

宠物类将抛出一个错误,声明:Fatal error: Class Pet may not inherit from final class (Brother)

这也适用于方法,因此,如果不希望继承方法,则导致子类具有相同的方法作为覆盖。

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

Yo用过,你想要一些真实的例子来说明接口可以用来做什么,一个数据库抽象层。

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

示例

代码语言:javascript
复制
interface IDatabaseLayer
{
    public function connect();
    public function query();
    public function sanitize();
    //...
}

因此,基类知道MySql和MsSql具有上述方法,从而减少了错误,并且更有组织。

当将对象传递给类时,您希望确保对象是特定类型的,PHP5允许您定义应该以params形式传递给方法的对象类型。

假设你有3门课

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

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

代码语言:javascript
复制
class DatabaseConnection implements Connectable
{
    public function __construct(DatabaseCredentials $ConnectionDetails)
    {
        $this->Connect($ConnectionDetails->BuildDSN());
    }
}

一个真正开始的好方法是在这里阅读:

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

小例子:

代码语言:javascript
复制
namespace Database\MySql
{
    class Database{}
}

namespace Database\MsSql
{
    class Database{}
}

你可以用这样的方法:

代码语言:javascript
复制
use Database;
$Database = new MySql\Database();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4678889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档