Я занимаюсь разработкой приложения 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
, мы можем выбросить некоторый дочерний элемент 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 и стану известным и богатым?:))