如果设置了类变量,PHP会强制类具有特定方法

时间:2018-10-11 14:30:38

标签: php laravel oop laravel-5

我有一个简单的要求,我想允许一个类(Laravel模型)来定义一个控制器是否应该基于像这样的类变量来检查是否允许删除它

public $verify_delete = true;

当前,如果设置了此变量,则必须添加以下方法;

public function deletable()
{
    $deletable = true;

    if ($this->has_children()) {
        $deletable = false;
    }

    // ...

    return $deletable;
}

第一个变量仅表示运行此类的代码也应运行deletable()方法。

所以我想要的是一种方法,如果开发人员将deletable()设置为true,则可以强制开发人员实施$verify_delete方法,如果他们没有这样做,则抛出错误做到了。在这个阶段,我对traitsimplements知之甚少,所以我不确定它们是否是正确的选择。

如果这不是实现全力以赴的目标的最佳方法。

2 个答案:

答案 0 :(得分:1)

您应该按照以下方式创建一个称为DeletableRemoveable或其他特征的特性,然后在其中实现此delete方法,然后每个可以删除的模型都将use该特性。不完全是您想要的,但这是正确的方法。

您可以创建一个接口,该接口中将包含此方法,然后实现该接口的每个类(model)都必须实现该方法,唯一的区别是,实现方式可能会因模型的不同而有所不同

答案 1 :(得分:1)

您的问题是这样的:当设置了特定的属性时,是否可以检测类中的方法是否可调用...

其他(非常明智的)解决方案也暗示了界面和特征……一个完美的主意和一种看待事物的好方法。

但是您也可以想到这样的东西:

public function __construct() {
    if (true === $this->verify_delete && !method_exists($this, 'deletable')) {
        throw new \Exception('Hi developer! You forgot something...');
    }
}

说明:

  • 在构造函数上,检查属性是否为true。
  • 如果该方法不存在,让我们抛出一个异常

我认为这完全符合您的要求:设置属性后,强制开发人员实现可删除的方法。

但是说实话,我也非常喜欢这些特征...我只是想给您一个替代方案,如果您对接口,特征等技术不太熟悉,那么也可以解决问题。