在定义结构和继承接口(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/