복붙노트

변수에 저장된 문자열에서 PHP 함수를 호출하는 방법

PHP

변수에 저장된 문자열에서 PHP 함수를 호출하는 방법

함수를 호출 할 수 있어야하지만 함수 이름은 변수에 저장됩니다. 가능한가요? 예 :

function foo ()
{
  //code here
}

function bar ()
{
  //code here
}

$functionName = "foo";
// i need to call the function based on what is $functionName

Anyhelp는 좋을 것입니다.

감사!

해결법

  1. ==============================

    1.$ functionName () 또는 call_user_func ($ functionName)

    $ functionName () 또는 call_user_func ($ functionName)

  2. ==============================

    2.내가 가장 좋아하는 버전은 인라인 버전입니다.

    내가 가장 좋아하는 버전은 인라인 버전입니다.

    ${"variableName"} = 12;
    
    $className->{"variableName"};
    $className->{"methodName"}();
    
    StaticClass::${"variableName"};
    StaticClass::{"methodName"}();
    

    괄호 안에 변수 또는 표현식을 배치 할 수도 있습니다!

  3. ==============================

    3.가능합니다.

    가능합니다.

    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

  4. ==============================

    4.이미 언급했듯이 가장 안전한 방법으로 call_user_func ()를 사용하거나 $ function_name ()의 경로를 내려야하는 경우이 방법을 사용할 수 있습니다. 이 두 가지 방법을 모두 사용하여 인수를 전달할 수 있습니다.

    이미 언급했듯이 가장 안전한 방법으로 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);
    }
    
  5. ==============================

    5.다른 누군가가 클래스 내의 메소드에 변수를 사용하려고했기 때문에 Google에서 여기로 가져온 경우 아래 코드는 실제로 작동 할 코드 샘플입니다. 위의 상황 중 어느 것도 내 상황에 맞지 않았습니다. 주요 차이점은 call_user_func에서 전달되는 $ c = & new ... 및 & $ c의 선언에 &가 있습니다.

    다른 누군가가 클래스 내의 메소드에 변수를 사용하려고했기 때문에 Google에서 여기로 가져온 경우 아래 코드는 실제로 작동 할 코드 샘플입니다. 위의 상황 중 어느 것도 내 상황에 맞지 않았습니다. 주요 차이점은 call_user_func에서 전달되는 $ c = & new ... 및 & $ c의 선언에 &가 있습니다.

    필자의 특별한 경우는 색상을 사용하는 코드와 csscolor.php 클래스의 lighten () 및 darken () 두 가지 멤버 메소드를 구현하는 경우입니다. 어떤 이유로 든 동일한 코드를 로직으로 선택하는 대신 밝게 또는 어둡게 호출 할 수있게하려고했습니다. 이것은 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 -> {...}로 아무 것도 시도하지 않았다는 것에주의하십시오. call_user_func에있는 php.net의 페이지 하단에있는 독자가 작성한 컨텐트를 자세히 살펴보면 위의 내용을 함께 처리 할 수있었습니다. 또한, 배열로서의 $ params가 나에게 효과가 없다는 것에주의하십시오 :

    // This doesn't work:
    $params=Array($color,$percent);
    $rtn=call_user_func( array(&$c,$lightdark),$params);
    

    이 위의 시도는 두 번째 인수 (%)를 예상하는 메서드에 대한 경고를 제공합니다.

  6. ==============================

    6.몇 년 늦었지만, 지금 이모가 가장 좋습니다.

    몇 년 늦었지만, 지금 이모가 가장 좋습니다.

    $x = (new ReflectionFunction("foo"))->getClosure();
    $x();
    
  7. ==============================

    7.완전을 기하기 위해 eval ()을 사용할 수도 있습니다 :

    완전을 기하기 위해 eval ()을 사용할 수도 있습니다 :

    $functionName = "foo()";
    eval($functionName);
    

    그러나 call_user_func ()은 적절한 방법입니다.

  8. ==============================

    8.네임 스페이스를 사용할 때 동적 함수 이름에 대한 요점을 추가하기 만하면됩니다.

    네임 스페이스를 사용할 때 동적 함수 이름에 대한 요점을 추가하기 만하면됩니다.

    네임 스페이스를 사용하는 경우 함수가 전역 네임 스페이스에있는 경우를 제외하고 다음은 작동하지 않습니다.

    namespace greetings;
    
    function hello()
    {
        // do something
    }
    
    $myvar = "hello";
    $myvar(); // interpreted as "\hello();"
    

    대신 call_user_func ()를 사용해야합니다 :

    // if hello() is in the current namespace
    call_user_func(__NAMESPACE__.'\\'.$myvar);
    
    // if hello() is in another namespace
    call_user_func('mynamespace\\'.$myvar);
    
  9. ==============================

    9.@Chris K의 답을 보완하면 객체의 메소드를 호출 할 수 있습니다. 클로저를 사용하여 단일 변수를 사용하여 호출 할 수 있습니다.

    @Chris K의 답을 보완하면 객체의 메소드를 호출 할 수 있습니다. 클로저를 사용하여 단일 변수를 사용하여 호출 할 수 있습니다.

    function get_method($object, $method){
        return function() use($object, $method){
            $args = func_get_args();
            return call_user_func_array(array($object, $method), $args);           
        };
    }
    
    class test{        
    
        function echo_this($text){
            echo $text;
        }
    }
    
    $test = new test();
    $echo = get_method($test, 'echo_this');
    $echo('Hello');  //Output is "Hello"
    

    다른 예제를 게시했습니다.

  10. ==============================

    10.call_user_func 함수를 사용하십시오.

    call_user_func 함수를 사용하십시오.

  11. ==============================

    11.다음 코드는 PHP에서 동적 함수를 작성하는 데 도움이 될 수 있습니다. 이제 함수 이름은 '$ current_page'변수에 의해 동적으로 변경 될 수 있습니다.

    다음 코드는 PHP에서 동적 함수를 작성하는 데 도움이 될 수 있습니다. 이제 함수 이름은 '$ current_page'변수에 의해 동적으로 변경 될 수 있습니다.

    $current_page = 'home_page';
    $function = @${$current_page . '_page_versions'};
    $function = function() {
        echo 'current page';
    };
    $function();
    
  12. ==============================

    12.하나의 비 전통적인 접근 방식은 내 마음에 온 것입니다. 코드를 작성하는 초소형 자율 인공 지능 AI를 통해 전체 코드를 생성하지 않으면 "동적으로"호출하려는 함수가 이미 코드에 정의되어있을 가능성이 큽니다. 베이스. 그럼 그냥 문자열을 확인하고 악명 높은 ifelse 춤을 불러 내서 ... 내 포인트를 얻으세요.

    하나의 비 전통적인 접근 방식은 내 마음에 온 것입니다. 코드를 작성하는 초소형 자율 인공 지능 AI를 통해 전체 코드를 생성하지 않으면 "동적으로"호출하려는 함수가 이미 코드에 정의되어있을 가능성이 큽니다. 베이스. 그럼 그냥 문자열을 확인하고 악명 높은 ifelse 춤을 불러 내서 ... 내 포인트를 얻으세요.

    예.

    if($functionName == 'foo'){
      foo();
    } else if($functionName == 'bar'){
      bar();
    }
    

    ifelse 사다리의 맛이 싫다면 스위치 케이스조차도 사용할 수 있습니다.

    나는 "동적으로 함수를 호출하는"절대적 필요성이있는 경우가 있음을 이해한다 (자체를 수정하는 재귀 적 논리처럼). 그러나 일상적인 사소한 사용 사례의 대부분은 그냥 피할 수 있습니다.

    문자열이 사용 가능한 함수의 정의와 일치하지 않으면 대체 기능을 실행할 수있는 기회를 제공하면서 응용 프로그램에서 많은 불확실성을 제거합니다. IMHO.

  13. ==============================

    13.내가 왜 그걸 사용해야하는지 모르겠다. 전혀 나에게 도움이되지 못한다.하지만 함수의 양이 적다면 if / elseif 구조체를 사용할 수있다. 직접 해결책이 가능한지 나는 모른다.

    내가 왜 그걸 사용해야하는지 모르겠다. 전혀 나에게 도움이되지 못한다.하지만 함수의 양이 적다면 if / elseif 구조체를 사용할 수있다. 직접 해결책이 가능한지 나는 모른다.

    ~ 같은 $ foo = "bar"; $ test = "foo"; echo $$ test;

    막대를 반환한다, 당신은 주위를 시도 할 수 있지만 나는이 기능에 대해 작동한다고 생각하지 않는다.

  14. from https://stackoverflow.com/questions/1005857/how-to-call-php-function-from-string-stored-in-a-variable by cc-by-sa and MIT license