2010-05-28 3 views
1

PHP에서 마술 __call 메서드를 사용하고 있습니다. 때로는 내가 부르는 기능이 숫자입니다. 예를 들어 클래스 이름이 예제이고, 다음 예제를 호출하려고합니다. 32PHP에서 __call 메서드를 사용할 때 '메서드 이름은 문자열이어야합니다'

이 방법이 가능합니까 아니면 다른 대안을 찾아야합니까?

+2

I 돈을 '32'는 함수의 유효한 이름이라고 생각하지 않습니다. – SilentGhost

+0

'32'는 함수의 정상적인 이름이라고 생각하지 않습니다. – Notinlist

답변

1

물론 가능합니다. 호출 구문을 변경하기 만하면됩니다. $foo->32()은 유효하지 않으므로 치명적인 오류가 발생합니다. 그러나 $foo->{'32'}()은 유효한 구문입니다. 이제 ...

class Foo { 
    public function __call($f, $args) { 
     echo $f; 
    } 
} 

$foo = new Foo; 

$foo->32(); //Fatal Error 

$foo->{32}(); //Fatal Error 

$foo->{'32'}(); // "32" is printed 

$x = 32; 
$foo->$x(); //Fatal Error 

$x = '32'; 
$foo->$x(); // "32" is printed 

$x = 32; 
$foo->{(string)$x}(); // "32" is printed 

call_user_func(array($foo, '32')); // "32" is printed 

또는 정적 방법과 5.3을 사용하면 함수 (32)를 정의 할 수 없습니다,하지만 당신은 __call 그것을 실행하는 데 사용할 수있는, 그것은 조금 더 열심히 가져옵니다

class Foo { 
    public static function __callStatic($f, $args) { 
     echo $f; 
    } 
} 

Foo::32(); //Fatal Error 
Foo::{32}(); //Fatal Error 
Foo::{'32'}(); //Fatal Error 

$x = 32; 
Foo::$x(); //Fatal Error 

$x = '32'; 
Foo::$x(); // "32" is printed 

$x = 32; 
Foo::{(string)$x}(); //Fatal Error 

call_user_func(array('foo', '32')); //Fatal Error 
+0

이 기능이 method_exists와 함께 작동하는지 알고 있습니까? 이 작동하지 않습니다 : method_exists ('Foo', '32'); –

+0

'method_exists()'는 정의 된 함수에서만 작동합니다. 따라서'__call()'이 실행될 때 호출이 false를 반환하면 ... – ircmaxell

+0

함수가 전달되는지 어떻게 확인할 수 있는지 알 수 있습니까? 함수가 다른 methodes를 통과하는지 확인해야하기 때문에 모든 것이 마법이되는 것은 아닙니다. –

0

아니요, 32은 (는) 유효한 속성 이름이 아니므로 불가능합니다. 당신은 같은 구문 분석 오류 얻을 것이다 :

Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '$' in …

는 또한 example::32 정적 속성과하지 않도록하는 방법을 참조 할 것을 (example::32()32가 유효한 이름이됩니다한다면,하지만 당신이 전화를 가져 __callStatic를 사용해야합니다).

존재하지 않는 속성에 액세스하려면 magic methods __get and __set을 대신 사용하십시오.

+0

죄송합니다. 예 -> 32() –

+0

@Saif Bechan : 그런데 왜 그런 방법을 부르겠습니까? 목적은 무엇입니까? – Gumbo

+0

예를 들어, 'questions'클래스가 'list'메소드와 함께 있습니다. 여기에 모든 질문이 나열됩니다. questions-> list(). 이제 저는 __call이라는 마법 함수를 만들고 싶습니다. 질문 -> 32()를 호출하면 ID 32로 질문을 표시하고 싶습니다. –

관련 문제