В 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.
Кроме того, возможно ли выполнить какое-либо действие по умолчанию в родительском и остальные функции в дочернем?
с уважением.
Любой класс, который расширяет родительский элемент, нуждается в своих функциях для явного вызова родительского класса. 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';
}
Не уверен, что это именно то, что вам нужно. Но вы можете попробовать использовать механизм цепочки:
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.
Я собираюсь ответить на вторую часть вашего вопроса: «Можно ли выполнить какое-либо действие по умолчанию в родительском и остальные функции в дочернем?» Ответ — да, и один из способов сделать это — использовать «шаблон проектирования», известный как шаблонный метод:
Шаблон шаблонного метода является шаблоном поведенческого проектирования, который определяет программный каркас алгоритма в операции, отложив некоторые шаги до подклассов.
Я специально сделал это с ~ 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
— см. комментарии выше источника. Также см. Статью, которую я сделал на вдохновение для рамок