я использую 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
Вы запустите его так же, как любую динамическую ссылку на вызываемый объект, как массив из двух элементов: [object, 'methodName']
, Здесь object
ваше анонимное определение класса:
$util->setLogger([new class {
public function log($msg) {
echo $msg;
}
}, 'log']);
Вот автономный управляемый пример для вас, чтобы посмотреть на:
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();
Я вижу 2 проблемы с вашим кодом.
Вместо
$util->setLogger()->log('Phil runs very fast');
ваш код должен быть $util->getLogger()->log('Phil runs very fast');
,
Вы хотите получитьРегистратор, так как он уже был установлен ранее.
На мой взгляд, этот метод не должен иметь каких-либо параметров, и он должен вернуть что-то, чего на самом деле не хватает в вашем коде.
Так что вместо
public function getLogger($logger) {
$this->logger = $logger;
}
у тебя должно быть что-то вроде
public function getLogger() {
return $this->logger;
}
С учетом этих 2 пунктов ваш код работает как положено. Смотрите здесь для себя https://ideone.com/V2slho.