Аналогично __construct, но вызывается для каждой вновь вызываемой функции в классе - PullRequest
1 голос
/ 07 июня 2019

У меня есть 3 файла ниже:

controller.php

class inject{
    public function __construct(){
        echo 'I say';
    }
}

model.php

class say extends inject{
    public function init(){
        echo ' hello ';
        $this->otherFunction();
    }
    public function otherFunction(){
        //parent::__construct(); --> This should't be added manually
        echo ' world ';
    }
}

view.php

$output = new say();
$output->init(); //UPDATED

Без изменения функций внутри класса «say» (что я делал выше) я хочу, чтобы каждый раз, когда я вызывал функцию init (), она выдает «Я говорю привет, я говорю мир». Как мне это сделать?

DEMO

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Если вы хотите добавить новые функции в класс без его изменения, вы можете использовать шаблон декоратора.

<?php
class inject{
    public function __construct(){
        echo 'I say';
    }
}

class say extends inject{
    public function init(){
        echo ' hello ';
        $this->otherFunction();
    }
    public function otherFunction(){
        echo ' world ';
    }
}

class DecoratorSay extends say
{
    public function otherFunction() {
        parent::__construct();
        parent::otherFunction();
    }
}

$output = new DecoratorSay();
echo $output->init();

Вывод

I say hello I say world 
0 голосов
/ 07 июня 2019

Тебе стоит подумать, действительно ли тебе это нужно.Это можно сделать, перегрузив и сделав методы приватными / защищенными.

пример:

<?php

class Foo {
    public function __call($function, $arguments)
    {
        echo 'I chose ';
        $this->$function(...$arguments);
    }

    private function bar(): void
    {
        echo 'bar' . PHP_EOL;
    }

    private function baz(): void
    {
        echo 'baz' . PHP_EOL;
    }
}

$foo = new Foo();
$foo->bar();
$foo->baz();
...