함수를 호출 할 수 있어야하지만 함수 이름이 변수에 저장되어 있습니까? 예 :
함수 foo () { // 여기 코드 } 기능 표시 줄 () { // 여기 코드 } $ functionName = "foo"; // $ functionName이 무엇인지에 따라 함수를 호출해야합니다.
답변
답변
내가 좋아하는 버전은 인라인 버전입니다.
${"variableName"} = 12;
$className->{"propertyName"};
$className->{"methodName"}();
StaticClass::${"propertyName"};
StaticClass::{"methodName"}();
대괄호 안에 변수 나 표현식도 넣을 수 있습니다!
답변
예, 가능합니다 :
function foo($msg) {
echo $msg."<br />";
}
$var1 = "foo";
$var1("testing 1,2,3");
출처 : http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
답변
이미 언급했듯이 가장 안전한 방법을 사용 call_user_func()
하거나 경로를 따라 내려갈 수 있는 몇 가지 방법이 있습니다 $function_name()
. 이 두 가지 방법을 모두 사용하여 인수를 전달할 수 있습니다.
$function_name = 'foobar';
$function_name(arg1, arg2);
call_user_func_array($function_name, array(arg1, arg2));
호출하는 함수가 객체에 속하는 경우 여전히 다음 중 하나를 사용할 수 있습니다
$object->$function_name(arg1, arg2);
call_user_func_array(array($object, $function_name), array(arg1, arg2));
그러나 $function_name()
메소드 를 사용하려는 경우 이름이 동적 인 경우 함수의 존재를 테스트하는 것이 좋습니다.
if(method_exists($object, $function_name))
{
$object->$function_name(arg1, arg2);
}
답변
클래스 내의 메소드에 변수를 사용하려고했기 때문에 Google이 다른 사람을 여기로 데려온 경우 아래는 실제로 작동하는 코드 샘플입니다. 위의 어느 것도 내 상황에 효과가 없었습니다. 주요 차이점은의 &
선언 $c = & new...
및 &$c
전달에 call_user_func
있습니다.
내 구체적인 사례는 색상과 두 가지 멤버 메소드 lighten()
와 관련 darken()
이 있고 csscolor.php 클래스에서 누군가의 코드를 구현할 때 입니다. 어떤 이유로 든 나는 논리로 선택하지 않고 밝게 또는 어둡게 호출 할 수있는 동일한 코드를 원했습니다. 이것은 if-else를 사용하지 않거나이 메소드를 호출하는 코드를 변경하지 않은 완고한 결과 일 수 있습니다.
$lightdark="lighten"; // or optionally can be darken
$color="fcc"; // a hex color
$percent=0.15;
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);
아무것도 시도해도 효과가 $c->{...}
없었습니다. 의 php.net 페이지 하단에서 독자가 기고 한 내용을 숙독하면서 위 내용을 정리할 call_user_func
수있었습니다. 또한 $params
배열로 는 저에게 효과적이지 않았습니다 .
// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);
위의 시도는 두 번째 인수 (퍼센트)를 예상하는 메소드에 대한 경고를 제공합니다.
답변
몇 년 늦었지만 현재는 이것이 가장 좋은 방법입니다.
$x = (new ReflectionFunction("foo"))->getClosure();
$x();
답변
완전성을 위해 eval ()을 사용할 수도 있습니다 .
$functionName = "foo()";
eval($functionName);
그러나 call_user_func()
올바른 방법입니다.