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

如果设置了类变量,PHP将强制类具有特定的方法,php,laravel,oop,laravel-5,Php,Laravel,Oop,Laravel 5,我有一个简单的需求,我想允许一个类(Laravel模型)来定义控制器是否应该基于类变量检查是否允许删除它 public $verify_delete = true; 当前,如果设置了此变量,我必须添加以下方法 public function deletable() { $deletable = true; if ($this->has_children()) { $deletable = false; } // ... ret

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

public $verify_delete = true;
当前,如果设置了此变量,我必须添加以下方法

public function deletable()
{
    $deletable = true;

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

    // ...

    return $deletable;
}
第一个变量只是指示运行此类的代码也应该运行
deletable()
方法

因此,我想要的是一种方法,如果开发人员将
$verify\u delete
设置为true,则强制开发人员实现
deletable()
方法,如果他们没有这样做,则抛出错误。我对
特征
实现
了解不多,所以我不确定它们是否是正确的选择


如果这不是实现我所追求的目标的最佳方法,我洗耳恭听。

你应该创建一个名为
Deletable
Removeable
的特征,或者类似的东西,并在那里实现这个删除方法,然后每个可以删除的模型将
使用这个特征。这不是你想要的,但这是正确的方法


您可以创建一个内部包含此方法的接口,然后实现此接口的每个类
(model)
都必须实现该方法,唯一的区别是实现可能会因模型的不同而有所不同。您的问题是:我是否可以检测某个类中是否可以调用某个方法,设置特定属性时

其他(非常明智的)解决方案是建议接口和特性。。。这是一个非常好的想法,也是看待事物的一个非常好的方式

但你也可以这样想:

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

  • 在构造函数上检查属性是否为true
  • 如果该方法不存在,让我们抛出一个异常
我认为这完全符合您的要求:在设置属性时,强制开发人员实现deletable方法


但老实说,我也很喜欢这些特质。。。我只是想给你一个替代方案,如果你对界面、特征等技术不太熟悉的话,它也能起到同样的作用。

你不能动态设置界面。正确的做法是使用两种类型的对象。例如,
Object
ObjectDeletable
其中
ObjectDeletable
实现了一个
Deletable
接口。这当然是有意义的,我会仔细研究一下,谢谢。与@Xatenev的评论类似,这也是有意义的,所以我一定会考虑做这个更改,谢谢。谢谢你的建议,这当然也是一种选择。虽然没有界面或特性看起来那么严格,但肯定能起作用。