当匿名类作为参数传递给普通类的类方法时,如何调用匿名类的方法?

时间:2017-12-02 06:06:10

标签: php oop fatal-error php-7 anonymous-class

我正在使用 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

2 个答案:

答案 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)

我发现您的代码有两个问题。

  1. 您没有在$ util
  2. 上使用正确的方法 而不是 $util->setLogger()->log('Phil runs very fast'); 您的代码应为$util->getLogger()->log('Phil runs very fast');。 您希望获取 Logger,因为它已经设置过。

    1. 您的getLogger()实现可能存在缺陷
    2. 在我看来,这种方法不应该有任何参数,它应该返回某些东西,这在你的代码中实际上是缺失的。 而不是

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

      你应该有像

      这样的东西
      public function getLogger() {    
          return $this->logger;
      }
      

      解决了这两点后,您的代码按预期工作。请亲自查看https://ideone.com/V2slho