2014-07-19 2 views
0

저는 익명의 함수를 사용하여 방금 시작했고, 더 큰 프로젝트에서 실제 사용하려고했습니다. 로드 블록을 치고 난 후에, 나는 작은 연습 스크립트를 설치하려고했지만 같은 문제가 계속 발생합니다. 다음과 같은 작업을 수행으로,Strange Object/Class Issue (stdClass)

class Foo { 

    public $cmd; 

    public function __construct() { 

     $this->cmd = new stdClass(); 
     $this->cmd->a = 'b4ng'; 
    } 
} 

$bar = new Foo(); 
echo $bar->cmd->a; 

그 다음은 을하지 않습니다, 분명하게되고,

$a = function($in) { 
    echo $in; 
}; 
$a('b4ng'); 

위의 작품 잘, 나는 확실히 무슨 일이 일어나고 있는지 이해하지 않지만, 여기에 몇 가지 코드는 일, 위의 코드 조각을 사용하려고 할 때

class Foo { 

    public $cmd; 

    public function __construct() { 

     $this->cmd = new stdClass(); 
     $this->cmd->message = function($in) { 

      echo $in; 
     }; 
    } 
} 

$bar = new Foo(); 
$bar->cmd->message('b4ng'); 

, 나는 다음과 같은 오류와 충돌하고있어,

Fatal error: Call to undefined method stdClass::message() 

오류가 무엇을 말하는지 이해합니다. 이유를 이해하지 못합니다. 'message'는 분명히 stdClass의 네이티브 함수/메소드는 아니지만 'cmd'에 선언되었습니다.

+2

[개체 속성에 직접 할당 된 콜링 호출] 가능한 중복 (http://stackoverflow.com/questions/4535330/calling-closure-assigned-to-object-property-directly) -'$ bar-> cmd- > 메시지 -> __ invoke ('b4ng'); ' – FuzzyTree

+0

@FuzzyTree,이 질문을 게시하기 전에 주위를 둘러 보지 않아서 고맙습니다. 어쨌든 내 문제가 해결됩니다. – user1117742456

답변

0

PHP에서는 클래스 외부에서 클래스 메서드를 정의 할 수 없습니다. 따라서 stdClass의 인스턴스를 만든 다음 동적으로 메서드를 만들 수는 없습니다.

$o = new SomeClass(); 
$m = $o->someMethod; 
$m(); 

여기서 문제는 PHP가 $o->foo() 일치 무엇 멤버 함수 호출을위한 특별한 구문을 가지고 있다는 것입니다 :

1

당신이 할 수있는 또 다른 것이있다. 그러나 귀하의 경우 foo은 오류가 발생하는 폐쇄 (즉, 데이터 멤버가 아니라 메소드)가됩니다.

// use brackets to force evaluation order 
($o->foo)(args..); 
// use dedicated function 
call_user_func($o->foo, args..); 
// use two steps 
$foo = $o->foo; 
$foo(args..); 

내가 먼저 첫 번째 변종을 시도 싶지만, PHP는 그것을 할 수 있는지 확실하지 않습니다 :이 문제를 해결하려면 먼저 개체에서 foo를 검색 한 후 호출해야합니다. 마지막 변형은 가장 힘든 일이지만 확실하게 작동합니다.