PHP接口(interface)和抽象类继承的最佳实践?

标签 php inheritance abstract-class implementation

在定义结构和继承接口(interface)和/或抽象类时,哪个是最佳实践?为什么?这里有两个例子:

这里是 [Interface] -> [Abstract Class] -> [Class] 的例子

Interface DataInterface
{
    public function __construct($connection);
    public function connected();
    public function get();
}

Abstract class BaseData implements DataInterface
{
    protected $connection;

    public function __construct($connection)
    {
        $this->connection = $connection;
    }
}


class UserData extends BaseData
{
    public function exists()
    {
        return is_connected($this->connection);
    }

    public function get()
    {
        return get_data($this->connection);
    }
}

$oUserData = new UserData(new Connection());

这里是 [Abstract Class] -> [Class] without the Interface 的示例

Abstract class BaseData
{
    protected $connection;

    public function __construct($connection)
    {
        $this->connection = $connection;
    }

    abstract public function connected();
    abstract public function get();
}

class UserData extends BaseData
{
    public function exists()
    {
        return is_connected($this->connection);
    }

    public function get()
    {
        return get_data($this->connection);
    }
}

$oUserData = new UserData(new Connection());

我目前正在创建一个小型应用程序(可能会变得更大)并且对如何在开始时正确实现感到困惑。

顺便问一下,这个带参数的 __construct() 声明在接口(interface)中有意义吗?

public function __construct($connection);

最佳答案

抽象类定义了一个必须为抽象类的继承者实现的接口(interface)。 Interface-Construct 定义了一个接口(interface),该接口(interface)必须由实现接口(interface)构造的类实现,接口(interface)的实现不限于单个接口(interface),而类继承耦合到单个(抽象)类。

PHP 中的接口(interface)有意用于允许对整个类接口(interface)的有限子集进行类型提示。没有理由在抽象类上使用接口(interface),只要它们的继承者实例的接收者没有使用它们(通过 instanceof/is_a 进行类型提示或逻辑识别)。接口(interface)构造的更有值(value)的好处是可以用替代实现替换接口(interface)的通用实现。

对于您的 BaseData-Example,我建议放弃抽象概念并改用特征和单独的接口(interface)。

trait connectionBrokerConstructor {
    protected $connection;

    public function isConnected()
    {
        return $this->connection instanceof Connection;
    }

    public function setConnection(Connection $connection)
    {
        $this->connection = $connection;
    }
}

interface connectable
{
    public function setConnection(Connection $connection);
    public function isConnected();
}

interface userDataRepositoryInterface
{
    public function get();
}

class UserData implements connectable, userDataRepositoryInterface
{
    use connectionBrokerConstructor;

    public function __construct(Connection $connect = null)
    {
        $this->setConnection($connection);
    }

    public function get()
    {
        return array('something');
    }
}

关于PHP接口(interface)和抽象类继承的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435666/

相关文章:

java 子类 : multiple constructors inherited from abstract superclass

c++ - 什么是对象切片?

子类中空重写方法的 Java 替代方案

java - 抽象方法中的参数 (Java 7)

javascript - 将单个 mysql 值存储到 javascript 变量中

Python 理解 OOP、继承

c++ - 使用 protected C++ 防止派生类的继承

php - 使用存储过程将值从 Controller 传递到模型 CodeIgniter

php - Ubuntu 11.04 中的 MongoDB 和 php

php - In_array 不起作用