2017-12-02 19 views
0

나는 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']. 여기

$util->setLogger([new class { 
    public function log($msg) { 
     echo $msg; 
    } 
}, 'log']); 

당신이보고에 대한 stand-alone runnable example있어 : 다음은 object은 익명 클래스 정의입니다

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

아 잡았다. 그러나 그는 "setLogger() 메소드는 익명의 클래스의 객체를 돌려 주어야한다."... 그렇지 않다. 아무것도 반환하지 않습니다. 당신의 코드를보십시오. 어쨌든. * getLogger' 메소드가 그것을 리턴합니다. 'setLogger'가 아니라 두 번째 호출에서 호출 코드에서 사용해야합니다. @ Badshah 지적한대로 : yer 그냥 잘못된 메서드를 호출합니다. –

0

내가 코드 2 문제를 참조하십시오. 코드가 $util->getLogger()->log('Phil runs very fast');를해야

  1. 당신은

대신 $util->setLogger()->log('Phil runs very fast'); util을 $에 적절한 방법을 사용하고 있지 않습니다. 로커가 이미 설정 되었기 때문에 로거를 받으십시오.

제 생각에는

을 결함이 될 수 getLogger (귀하의 구현),이 방법은 어떤 매개 변수가 안

  • 과해야 반환 뭔가,
      하는 실제로 코드에 없습니다. 그래서 대신

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

      예상대로, 코드가 작동 주소가 지정된 그 2 점으로

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

      같은 것을해야한다. 너 자신을 위해 여기에서보십시오 https://ideone.com/V2slho.