我正在使用 PHP 7.1.11
我尝试使用匿名类的代码,该类被声明为类方法的参数。我想调用匿名类中的方法。但我得到一个致命的错误。我该如何成功调用匿名类方法?
<?php
class Util {
private $logger;
public function __construct(){}
public function getLogger($logger) {
$this->logger = $logger;
}
public function setLogger($logger) {
$this->logger = $logger;
}
}
$util = new Util();
$util->setLogger(new class {
public function log($msg) {
echo $msg;
}
});
$util->setLogger()->log('Phil runs very fast'); // Ioutput should be : Phil runs very fast
?>
我目前得到的输出:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function Util::setLogger(), 0 passed in anonymous_class_ex.php on line 27 and exactly 1 expected in anonymous_class_ex.php:13 Stack trace: #0 anonymous_class_ex.php(https://stackoverflow.com/posts/47605127/edit27): Util->setLogger() #1 {main} thrown in anonymous_class_ex.php on line 13
答案 0 :(得分:0)
你可以像对任何可调用的动态引用那样运行它,作为一个双元素数组:[object, 'methodName']
。这里object
是您的匿名类定义:
$util->setLogger([new class {
public function log($msg) {
echo $msg;
}
}, 'log']);
以下是stand-alone runnable example供您查看:
class Outer {
function runner(){
$this->runCallback([new class {
function anonymousClassMethod(){
echo "hi from anonymous class method";
}
}, 'anonymousClassMethod']);
}
function runCallback(callable $f){
$f();
}
}
$o = new Outer();
$o->runner();
答案 1 :(得分:0)
我发现您的代码有两个问题。
$util->setLogger()->log('Phil runs very fast');
您的代码应为$util->getLogger()->log('Phil runs very fast');
。
您希望获取 Logger,因为它已经设置过。
在我看来,这种方法不应该有任何参数,它应该返回某些东西,这在你的代码中实际上是缺失的。 而不是
public function getLogger($logger) {
$this->logger = $logger;
}
你应该有像
这样的东西public function getLogger() {
return $this->logger;
}
解决了这两点后,您的代码按预期工作。请亲自查看https://ideone.com/V2slho。