私はYiiアプリケーションを開発してきました。そして、モデルの振る舞いで、ある種の「抽象的な」メソッドを宣言することが可能かどうか疑問に思っています。宣言の直後に使用することは不可能であることを私は知っています:
abstract class FantasticBehavior extends CActiveRecordBehavior
{
public abstract function doSomethingFantastic();
}
このクラスのインスタンスが必要だからです。しかし、Yiiが完全な魔法であることも知っています:)
必須の順序で動作からメソッドを再宣言する所有者クラスを作成したいだけです。もちろん、動作に加えてインターフェースを使用することもできますが...
伝えたいことがなかったり、はっきりしないことがあったらごめんなさい。ただ聞いてください、そして私は私が何を意味するかを説明しようとします。
誰かがこれについて何か知っていますか?
前もって感謝します。
UPD
Yiiは単なるPHPであることを私は理解しています。PHPを拡張しません。それはその上の上部構造です。また、PHPには多重継承がないため、多重継承はありません。
動作メソッドはabstractキーワードを使用して宣言できないことを理解しています。そのため、私は「abstract」という単語を引用符で囲んで書いています。しかし、何でも。私は行動がどのように機能するかを知っています。
私の質問は、モデル(CActiveRecordの子など)に何らかのメソッドを宣言するように強制できるかどうかでした。
たとえば、私の目的のために、私は次のようなことをすることができます:
class FantasticBehavior extends CActiveRecordBehavior
{
public function doFantasticThings()
{
$this->owner->prepareForFantastic();
// some code
}
}
したがって、この動作をモデルにアタッチしてメソッドdoFantasticThingsを呼び出すと、このメソッドはmodel(owner)からメソッドprepareForFantasticを呼び出そうとします。また、モデルにメソッドprepareForFantasticがない場合、宣言されていないメソッドが呼び出されるため、宣言された新しい例外がスローされます。
私は自分の質問に自分で答えたようです:)これについてどう思いますか?
UPD2
はい、「abstract」メソッドを呼び出さないと、宣言されていないことがわかりません。これは、解釈可能な言語の「魅力」です:)コードが実行されるまで、エラーがあるかどうかはわかりません。ただし、これについてできるだけ早く知ることができれば素晴らしいと思います。たとえば、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
、「abstract」メソッドが宣言されているかどうかを確認する必要があります。メソッドabstractMethods
は、リストの「抽象」メソッドを取得するために使用されます。
attachBehavior
イベントがあるかどうかわかりません。もしそうなら、attach
メソッドをオーバーライドする代わりにそれを使用することができます。
このアイデアを使用する「abstract」メソッドを使用した動作の基本クラス。
あなたはこのことについてどう思いますか?
たぶん将来、私はYiiを拡張して、有名で金持ちになるのでしょうか?:))