gpt4 book ai didi

php - 通知接口(interface)方法是通过__call实现的?

转载 作者:可可西里 更新时间:2023-11-01 12:33:36 25 4
gpt4 key购买 nike

我有一个接口(interface)声明实现需要方法,例如 find、findOrFail 等,基本上是 Laravel Eloquent 方法。

我在接口(interface)中声明这些方法,因为并非所有实现该接口(interface)的东西都会扩展,所以我在接口(interface)中声明它们,以便我的应用程序始终知道这些方法将在那里。

我想知道的是,除了在模型中有一堆 public function find($id){return parent::find($id)} 类型的方法 扩展 Eloquent 模型是否有一种简单的方法让界面知道该方法是通过 __call 处理的?

最佳答案

虽然对于这种设计的简洁性可能存在更大的问题,但您可以通过使用实现接口(interface)方法的特征来完成类似的事情:

interface FindableContract {
public function find($id);
}

trait MagicFindableTrait {
public function find($id) {
return static::__call(__FUNCTION__, func_get_args());
}
}

class MagicalParent {
public function __call($method, $args) {
if ($method == 'find') {
return "User " . $args[0] . " is a witch! May we burn her?!";
}
}
}

class User extends MagicalParent implements FindableContract {
use MagicFindableTrait;
}

class NonmagicalUser implements FindableContract {
public function find($id) {
return "User $id was found to be non-magical. Let's burn him anyway.";
}
}

print (new User)->find(123);
print (new NonmagicalUser)->find(321);

关于php - 通知接口(interface)方法是通过__call实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17267064/

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