与__construct相似,但是在类中的每个新调用的函数上调用

时间:2019-06-07 07:55:40

标签: php function class

我下面有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 个答案:

答案 0 :(得分:2)

如果您想在不修改类的情况下向其添加新功能,则可以使用装饰器模式。

<?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 

答案 1 :(得分:0)

您应该考虑是否真的需要这个。这可以通过重载并使方法私有/受保护来实现。

示例:

<?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();