Как вызвать метод анонимного класса, когда анонимный класс передается в качестве параметра методу класса нормального класса?

я использую 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

Решение

Вы запустите его так же, как любую динамическую ссылку на вызываемый объект, как массив из двух элементов: [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();
0

Другие решения

Я вижу 2 проблемы с вашим кодом.

  1. Вы не используете правильный метод на $ util

Вместо
$util->setLogger()->log('Phil runs very fast');
ваш код должен быть $util->getLogger()->log('Phil runs very fast');,
Вы хотите получитьРегистратор, так как он уже был установлен ранее.

  1. Ваша реализация getLogger () может быть ошибочной

На мой взгляд, этот метод не должен иметь каких-либо параметров, и он должен вернуть что-то, чего на самом деле не хватает в вашем коде.
Так что вместо

public function getLogger($logger) {
$this->logger = $logger;
}

у тебя должно быть что-то вроде

public function getLogger() {
return $this->logger;
}

С учетом этих 2 пунктов ваш код работает как положено. Смотрите здесь для себя https://ideone.com/V2slho.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector