ООП — Как заставить родительскую функцию выполнять некоторые функции по умолчанию?

В PHP у меня есть абстрактный класс (родительский), который расширяется дочерним классом. Я хочу, чтобы дочерний класс реализовал функцию parent. И когда я вызываю реализованную функцию child, функциональность parent по умолчанию должна вызываться автоматически.
Является ли это возможным?

Например, я хочу создавать функцию журнала родителя каждый раз, когда вызывается функция отправки потомка.

abstract class CommunicationService {
// child classes must implement this
abstract function send();
abstract function receive();

public function log($action) {
echo 'Creating nice Log on = ' . $action;
}
}

class ServiceA extends CommunicationService {
public function send() {
// Is it possible that the parent's logging functionality be invoked automatically by default?
echo 'Send Message using Service A';
}
public function receive() {
echo 'Receive Message using Service A';
}
}

$serviceA = new ServiceA();
$serviceA->send(); // It should send message as well as create logs.
$serviceA->receive(); // It should just receive message and not log it.

Кроме того, возможно ли выполнить какое-либо действие по умолчанию в родительском и остальные функции в дочернем?

с уважением.

-1

Решение

Любой класс, который расширяет родительский элемент, нуждается в своих функциях для явного вызова родительского класса. log() функционировать так:

public function send() {
// Is it possible that the parent's logging functionality be invoked automatically by default?
parent::log( 'some text' ); // Tell the parent to log
echo 'Send Message using Service A';
}
1

Другие решения

Не уверен, что это именно то, что вам нужно. Но вы можете попробовать использовать механизм цепочки:

abstract class CommunicationService {
// child classes must implement this
abstract function send();
abstract function receive();

public function log($action) {
echo 'Creating nice Log on = ' . $action;
return $this;
}

}

class ServiceA extends CommunicationService {
public function send() {
// Is it possible that the parent's logging functionality be invoked automatically by default?
echo 'Send Message using Service A';
}
public function receive() {
echo 'Receive Message using Service A';
}

}

$serviceA = new ServiceA();
$serviceA->log('send')->send(); // It should send message as well as create logs.
$serviceA->receive(); // It should just receive message and not log it.
1

Я собираюсь ответить на вторую часть вашего вопроса: «Можно ли выполнить какое-либо действие по умолчанию в родительском и остальные функции в дочернем?» Ответ — да, и один из способов сделать это — использовать «шаблон проектирования», известный как шаблонный метод:

Шаблон шаблонного метода является шаблоном поведенческого проектирования, который определяет программный каркас алгоритма в операции, отложив некоторые шаги до подклассов.

Я специально сделал это с ~ 60 строк (не считая комментариев) PHP MVC микро-фреймворк источник здесь: https://github.com/dexygen/jackrabbitmvc/blob/master/barebones.lib.php

Шаблонный метод выглядит следующим образом:

static function sendResponse(IBareBonesController $controller) {
$controller->setMto($controller->applyInputToModel());
$controller->mto->applyModelToView();
}

Методы $controller->setMto а также mto->applyModelToView реализовать в другом месте в исходном коде, но дочерний класс должен реализовать $controller->applyInputToModel — см. комментарии выше источника. Также см. Статью, которую я сделал на вдохновение для рамок

1
По вопросам рекламы [email protected]