我一直在开发 Yii 应用程序。而且我想知道是否可以在模型行为中声明某种“抽象”方法。我知道不可能直接使用以下声明:
abstract class FantasticBehavior extends CActiveRecordBehavior
{
public abstract function doSomethingFantastic();
}
因为我们需要这个类的实例。但我也知道 Yii 很神奇:)
我只想让所有者类以强制顺序从行为中重新声明方法。当然,除了行为之外,我还可以使用界面,但是......
抱歉,如果我错过了要说的或不清楚的地方。只要问,我会尽力解释我的意思。
有人知道吗?
提前致谢。
UPD
我明白 Yii 只是 PHP。它不扩展 PHP。它是上层建筑。而且它没有多重继承,因为 PHP 没有。
我确实理解不能使用抽象关键字声明行为方法。这就是为什么我在引号中写了“抽象”这个词。但是无所谓。我知道行为是如何运作的。
我的问题是我是否可以以某种方式强制模型(例如 CActiveRecord 的子代)声明某种方法。
例如,出于我的目的,我可以这样做:
class FantasticBehavior extends CActiveRecordBehavior
{
public function doFantasticThings()
{
$this->owner->prepareForFantastic();
// some code
}
}
因此,如果我将此行为附加到我的模型并调用方法 doFantasticThings,此方法将尝试从模型(所有者)调用方法 prepareForFantastic。如果模型没有方法 prepareForFantastic 声明的新异常将被抛出,因为未声明的方法被调用。
看起来我自己已经回答了我的问题:) 你对此有何看法?
UPD2
是的,我知道如果我们不调用“抽象”方法,我们就不会知道它没有被声明。这是可解释语言的“魅力” :) 在代码运行之前,我们不知道是否有任何错误。虽然,如果我们能尽早知道这一点,那就太棒了。例如,一旦FantasticBehavior
-class 的实例附加到模型,我们可以抛出一些子对象CException
来显示必须在模型中声明哪些所需的方法。为了实现这一点,我们可以使用如下所列的东西:
class FantasticBehavior extends CActiveRecordBehavior
{
public function attach($owner)
{
if(!/*$owner has declared methods list this->abstractMethods*/)
{
throw new CAbstractMethodNotDecalared('....');
}
parent::attach($owner);
}
public function abstractMethods()
{
return array('prepareForFantastic');
}
}
我们需要覆盖attach
类中的方法CBehavior
并检查是否声明了“抽象”方法。方法abstractMethods
用于获取列表“抽象”方法。
我不知道是否有attachBehavior
事件存在。如果是这样,我们可以使用它而不是覆盖attach
方法。
将这个想法基类用于具有“抽象”方法的行为。
你怎么看待这件事?
说不定以后我会为Yii做扩展名利双收?:))