gpt4 book ai didi

php - PHP中是否有类似特性的接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 12:20:16 24 4
gpt4 key购买 nike

我经常发现自己希望能够让 trait 实现一个接口(interface),这样当我将 trait 添加到类中时,我可以知道满足了 trait 的要求。例如,在 Laravel 中,我将为我的许多关系创建特征,如下所示:

trait HasOwner
{
public function owner()
{
return $this->belongsTo(User::class);
}
}
在 Laravel 的情况下,我可以非常确定我添加它的每个模型都将有一个 ownsTo 方法,但是我仍然觉得我应该能够强制执行这个。
我知道强制执行此操作的唯一方法是使用 HasOwnerInterface 或 HasRelationshipsInterface 来支持它,但事实上,当我添加特性时未能添加它会防止它发出吱吱声,感觉就像在汽车中安装了安全气囊,但您需要这样做每次启动发动机时打开。
这是我认为将是完美的:
trait HasOwner expects RelationshipInterface
{
public function owner()
{
return $this->belongsTo(User::class);
}
}

interface RelationshipInterface
{
public function belongsTo(Model $model): Relationship;
}

class Property implements RelationshipInterface
{
use HasOwner;
}
我应该为此使用另一种设计模式,还是我应该鼓起勇气,开始与 PHP 核心团队为此而战以添加它?

最佳答案

请记住,trait 本质上只是“自动复制粘贴”上的语法糖,因此您不能直接将典型的 OOP 技术应用于它们。就目前情况而言(2021 年 6 月),通过对使用 trait 的类施加至少一些要求,您可能会越接近 with abstract methods :

Traits support the use of abstract methods in order to imposerequirements upon the exhibiting class. Public, protected, and privatemethods are supported. Prior to PHP 8.0.0, only public and protectedabstract methods were supported.

<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
}

class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>

作为旁注,有一个 existing RFC for traits implementing interfaces ,于 2016 年提交(!)。这是关键引述:

This first proposal is that a trait be permitted to declare that itimplements an interface. Having the trait declare that it implementsan interface makes the relationship between the interface(specification) and trait (implementation) explicit.

The trait must implement each of the methods from all the interfacesit implements. Failure to do so will be a fatal error. The methoddeclarations must be compatible with the interface. Some or all of thetrait’s implementing methods may be abstract, with the class includingthe trait providing the method implementation (similar to an abstractclass that implements an interface).


不过,到目前为止,该 RFC 的进展甚微。不清楚为什么;虽然提案 2 有一个悬而未决的问题(这是关于将接口(interface)从特征传播到类),但提案 1 似乎零问题。预计该提案也不会发生重大变化。

关于php - PHP中是否有类似特性的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68044743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com