我下面有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()时,它都会产生“我问好我说世界”。我该怎么做?
答案 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();