如何递归调用test()
?我尝试了两种方法,但没有用。
namespace app\controllers;
use Yii;
use yii\web\Controller;
class SiteController extends Controller {
public function actionIndex() {
$test= $this->test(5);
}
return $this->render('index');
}
private function test($res) {
$test1 = parent::test(1);
$test2 = $this->test(1);
}
}
我尝试使用$test1 = parent::test(1);
和$test2 = $this->test(1);
。
答案 0 :(得分:-1)
语法错误
public function actionIndex() {
$test= $this->test(5);
} //<--- this should not be here as it closes the actionIndex method
return $this->render('index');
}
这将引发类似unexpected T_RETURN
的解析错误。
是
<b>Parse error</b>: syntax error, unexpected 'return' (T_RETURN), expecting function (T_FUNCTION) or const (T_CONST) in
您也可能无法从子级调用父级测试方法,因为它是私有的,并且只能从声明该子级的类中访问私有方法。即使使用parent
,您也无法解决其范围。我可以想到的唯一方法是使用反射(特别是ReflectionMethod),然后将其设置为可访问性。但是,那将被认为是非常丑陋的入侵。
class foo{
private function test($var){
echo $var;
}
}
class bar extends foo{
public function actionIndex($var){
$this->test($var);
}
private function test($var){
$R = new ReflectionMethod(parent::class, 'test');
$R->setAccessible(true);
$R->invoke(new parent, $var);
//$this->test($var); //recursive
}
}
(new bar)->actionIndex('Hello from parent');
输出
Hello from parent
您将遇到的问题是,您需要一个 parent 实例来调用您没有的方法,并调用new
将会丢失任何状态子对象。因此,即使在父级中定义了属性,子级中设置的任何属性也不会转移(除非它们是在构造函数中设置的。)这可以接受也可以不接受。
要使其递归非常容易,只需在反射部分后面的孩子的方法中添加$this->test()
。当然,这会产生无限循环,但无论如何。