Объектно-ориентированный PHP — см. родительский класс, вызывающий методы подкласса
В большинстве объектно-ориентированных языков программирования родительский класс не может вызывать метод подкласса, но в PHP вы можете
1. Пример родительского класса, вызывающего метод подкласса
class A
{
public function testa()
{
$this->testb();
}
}
class B extends A
{
//仅对public方法可以进行父类调用子类
public function testb()
{
echo 'bbbbb';
}
}
$b = new B();
$b->a();
//输出bbbbb
скопировать код
2. Недостатки
Старайтесь не писать так, такой дизайн очень плох. Если вам нужно написать такой код, должны быть другие шаблоны проектирования, которые могут его заменить.
3. Хороший метод проектирования
Во-первых, обнаружено, что способ вызова подкласса родительским классом — это метод сохранения в Yii2.0, этот метод находится в \yii\db\BaseActiveRecord, метод вставки или обновления вызывается в методе сохранения, но этот метод не найден в текущем классе.Два метода, т.к. реализует
Два очка знаний:
- Родительский класс может вызывать метод дочернего класса
- Если абстрактный класс реализует интерфейс, он не может реализовать методы интерфейса, но может быть реализован подклассами.
Преимущество этого в том, что если в интерфейс добавляется новый метод и всем подклассам нужно делать одинаковую реализацию, то реализацию можно сразу поместить в этот абстрактный класс, иначе соответствующие подклассы будут реализовывать свои собственные
//yii2.0
interface ActiveRecordInterface
{
public function update($runValidation = true, $attributeNames = null);
public function insert($runValidation = true, $attributes = null);
}
//BaseActiveRecord实现了ActiveRecordInterface接口
abstract class BaseActiveRecord extends Model implements ActiveRecordInterface
{
public function save($runValidation = true, $attributeNames = null)
{
if ($this->getIsNewRecord()) {
return $this->insert($runValidation, $attributeNames);
} else {
return $this->update($runValidation, $attributeNames) !== false;
}
}
}
//ActiveRecord
class ActiveRecord extends BaseActiveRecord
{
public function insert($runValidation = true, $attributes = null)
{
//具体实现
}
public function update($runValidation = true, $attributeNames = null)
{
//具体实现
}
}
скопировать код
4. Применение
Например, недавнее требование: была создана новая таблица базы данных неправильных вопросов для китайского языка, математики и английского языка.В настоящее время структура таблицы структуры в основном одинакова, но могут быть разные различия в разных неправильных вопросах в будущее, поэтому три таблицы строятся в трех отдельных базах данных.
В настоящее время всем трем испытуемым необходимо запросить статистику количества неправильных вопросов.В настоящее время одним из способов является реализация этого метода отдельно в трех классах, а другим способом является определение интерфейса, в котором статистический метод Разницы нет, поэтому для трех классов неправильных вопросов устанавливается абстрактный базовый класс, а в абстрактном базовом классе реализуется метод подсчета неправильных вопросов. Если в будущем появятся разные статистические методы, подклассы могут напрямую переписываться этот статистический метод.
Если таблица изменена, статистический метод изменен, а запрос зависит от разных полей в соответствующей таблице счетов, то есть переменных, констант или методов в конкретной математике|языке|английских неправильных вопросах, вы можете напрямую определить в интерфейсе этот метод реализован в подклассе и вызывается в абстрактном базовом классе подклассом
//实例 定义一个接口 里面包含计算错题统计的方法
interface WrongNoteInterface
{
public function statistics();
//public function select();
//public function where();
}
//抽象基类
abstract class WrongNoteBase implements WrongNoteInterface
{
public function statistics()
{
$select = 'xx';// $select = $this->select();
$where = 'xx';// $where = $this->where();
return $this->find()->select($select)->where($where)->asArray()->all();
}
}
//语数外继承基类
class ChineseWrongNote extends WrongNoteBase
{
const IS_RIGHT_0 = 0;
const IS_RIGHT_1 = 1;
}
скопировать код
В приведенном выше случае, если поле для проверки изменено, выбор может быть структурой SUM(xxx), а условия для вычисления SUM могут быть другими.В настоящее время вы можете добавить его в интерфейс:
- public function select();
- public function where();
Затем в модифицированной статистике метод получения $select становится прямым вызовом метода select подкласса, а код меняется на содержимое в комментарии.
Резюме: После этой модификации исключается избыточность кода (один статистический код копируется в трех экземплярах), а класс легко расширяется.
posted on 2018-04-18 23:17 BigNerdЧитать(28) Комментарии(0)редактировать собирать
обновить комментарийобновить страницуBack to topПытаюсь загрузить поле для комментариев...[Рекомендуется] Более 500 000 исходных кодов VC++: крупномасштабное промышленное управление конфигурацией, моделирование мощности САПР и библиотека исходного кода ГИС![Событие] Конференция 2050 – Воссоединение молодежи с помощью технологий (5.26–27 Ханчжоу · город Юньци)
[Событие] Новое поколение облачных серверов HUAWEI CLOUD · Специальное временное предложение со скидкой 54%
[Подбор персонала] Мы серьезно относимся к тому, чтобы потратить много денег на поиск технических специалистов!
[Событие] Награда за продвижение Tencent Cloud cps, высокая конверсия + комиссия 20% ждет вас
Последние ИТ-новости:
· Microsoft Translator добавляет функцию автономного перевода AI: эффект поддержки упрощенного китайского перевода увеличен на 23%
· Минторг Китая в очередной раз отреагировал на санкции США в отношении ZTE: США не следует умничать
· Президент Douyin Чжан Нан: теперь у Douyin есть группа проверки из тысяч человек
· Python запускает новый веб-сайт PyPI, старый PyPI закрывается 30 апреля
· Изменение и изменение Microvision
» больше новостей... Последние статьи базы знаний:
· Как определить технические способности и уровень людей?
· Руководство для начинающих для самостоятельных студентов
· влюбиться в программиста
· учиться учиться
· Управленческие ловушки превосходных техников
» Другие статьи базы знаний...
|
||||||
день | один | два | три | Четыре | пять | шесть |
---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 1 | 2 | 3 | 4 | 5 |
навигация
статистика
- Эссе - 32
- Статьи - 0
- Комментарии - 42
- Цитаты - 0