PHP에서 마술 __call 메서드를 사용하고 있습니다. 때로는 내가 부르는 기능이 숫자입니다. 예를 들어 클래스 이름이 예제이고, 다음 예제를 호출하려고합니다. 32PHP에서 __call 메서드를 사용할 때 '메서드 이름은 문자열이어야합니다'
이 방법이 가능합니까 아니면 다른 대안을 찾아야합니까?
PHP에서 마술 __call 메서드를 사용하고 있습니다. 때로는 내가 부르는 기능이 숫자입니다. 예를 들어 클래스 이름이 예제이고, 다음 예제를 호출하려고합니다. 32PHP에서 __call 메서드를 사용할 때 '메서드 이름은 문자열이어야합니다'
이 방법이 가능합니까 아니면 다른 대안을 찾아야합니까?
물론 가능합니다. 호출 구문을 변경하기 만하면됩니다. $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
이 기능이 method_exists와 함께 작동하는지 알고 있습니까? 이 작동하지 않습니다 : method_exists ('Foo', '32'); –
'method_exists()'는 정의 된 함수에서만 작동합니다. 따라서'__call()'이 실행될 때 호출이 false를 반환하면 ... – ircmaxell
함수가 전달되는지 어떻게 확인할 수 있는지 알 수 있습니까? 함수가 다른 methodes를 통과하는지 확인해야하기 때문에 모든 것이 마법이되는 것은 아닙니다. –
아니요, 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
을 대신 사용하십시오.
죄송합니다. 예 -> 32() –
@Saif Bechan : 그런데 왜 그런 방법을 부르겠습니까? 목적은 무엇입니까? – Gumbo
예를 들어, 'questions'클래스가 'list'메소드와 함께 있습니다. 여기에 모든 질문이 나열됩니다. questions-> list(). 이제 저는 __call이라는 마법 함수를 만들고 싶습니다. 질문 -> 32()를 호출하면 ID 32로 질문을 표시하고 싶습니다. –
I 돈을 '32'는 함수의 유효한 이름이라고 생각하지 않습니다. – SilentGhost
'32'는 함수의 정상적인 이름이라고 생각하지 않습니다. – Notinlist