복붙노트

PHP 5의 호출자 함수?

PHP

PHP 5의 호출자 함수?

주어진 함수에서 호출자 함수의 이름을 찾는 PHP 함수가 있습니까?

해결법

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

    1.debug_backtrace를보십시오 - 이것은 당신의 호출 스택을 맨 위로 추적 할 수 있습니다.

    debug_backtrace를보십시오 - 이것은 당신의 호출 스택을 맨 위로 추적 할 수 있습니다.

    발신자를 얻는 방법은 다음과 같습니다.

    $trace = debug_backtrace();
    $caller = $trace[1];
    
    echo "Called by {$caller['function']}";
    if (isset($caller['class']))
        echo " in {$caller['class']}";
    
  2. ==============================

    2.Xdebug는 좋은 기능을 제공합니다.

    Xdebug는 좋은 기능을 제공합니다.

    <?php
      Class MyClass
      {
        function __construct(){
            $this->callee();
        }
        function callee() {
            echo sprintf("callee() called @ %s: %s from %s::%s",
                xdebug_call_file(),
                xdebug_call_line(),
                xdebug_call_class(),
                xdebug_call_function()
            );
        }
      }
      $rollDebug = new MyClass();
    ?>
    

    추적을 되돌릴 것이다.

    callee() called @ /var/www/xd.php: 16 from MyClass::__construct
    

    우분투에 Xdebug를 설치하는 가장 좋은 방법은

    sudo aptitude install php5-xdebug
    

    먼저 php5-dev를 설치해야 할 수도 있습니다.

    sudo aptitude install php5-dev
    

    더 많은 정보

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

    3.이것은 매우 늦었지만 현재 함수가 호출되는 함수의 이름을 제공하는 함수를 공유하려고합니다.

    이것은 매우 늦었지만 현재 함수가 호출되는 함수의 이름을 제공하는 함수를 공유하려고합니다.

    public function getCallingFunctionName($completeTrace=false)
        {
            $trace=debug_backtrace();
            if($completeTrace)
            {
                $str = '';
                foreach($trace as $caller)
                {
                    $str .= " -- Called by {$caller['function']}";
                    if (isset($caller['class']))
                        $str .= " From Class {$caller['class']}";
                }
            }
            else
            {
                $caller=$trace[2];
                $str = "Called by {$caller['function']}";
                if (isset($caller['class']))
                    $str .= " From Class {$caller['class']}";
            }
            return $str;
        }
    

    이것이 유용하게되기를 바랍니다.

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

    4.debug_backtrace ()는 현재 호출 스택의 매개 변수, 함수 / 메소드 호출에 대한 세부 정보를 제공합니다.

    debug_backtrace ()는 현재 호출 스택의 매개 변수, 함수 / 메소드 호출에 대한 세부 정보를 제공합니다.

  5. ==============================

    5.이것을 만들고 이것을 직접 사용

    이것을 만들고 이것을 직접 사용

    /**
     * Gets the caller of the function where this function is called from
     * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
     */
    function getCaller($what = NULL)
    {
        $trace = debug_backtrace();
        $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function
    
        if(isset($what))
        {
            return $previousCall[$what];
        }
        else
        {
            return $previousCall;
        }   
    }
    
  6. ==============================

    6.

    echo debug_backtrace()[1]['function'];
    

    PHP 5.4부터 작동합니다.

    또는 최적화 (예 : 비 디버그 사용) :

    echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
    

    첫 번째 인수는 사용되지 않는 함수 인수를 채우지 못하도록하고, 두 번째 인수는 추적을 두 수준으로 제한합니다 (두 번째가 필요합니다).

  7. ==============================

    7.나는 호출자 대신 호출 된 함수 이름을 항상 반환하기 때문에 flori의 방법은 함수로 작동하지 않는다고 말하고 싶지만 주석에 대한 평판은 없습니다. 내 사건에 잘 작동하는 플로리의 대답을 기반으로 매우 간단한 기능을 만들었습니다.

    나는 호출자 대신 호출 된 함수 이름을 항상 반환하기 때문에 flori의 방법은 함수로 작동하지 않는다고 말하고 싶지만 주석에 대한 평판은 없습니다. 내 사건에 잘 작동하는 플로리의 대답을 기반으로 매우 간단한 기능을 만들었습니다.

    class basicFunctions{
    
        public function getCallerFunction(){
            return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
        }
    
    }
    
    function a($authorisedFunctionsList = array("b")){
        $ref = new basicFunctions;
        $caller = $ref->getCallerFunction();
    
        if(in_array($caller,$authorisedFunctionsList)):
            echo "Welcome!";
            return true;
        else:
            echo "Unauthorised caller!";
            return false; 
        endif;
    }
    
    function b(){
        $executionContinues = $this->a();
        $executionContinues or exit;
    
        //Do something else..
    }
    
  8. ==============================

    8.debug_backtrace가 반환 한 배열에서이 정보를 추출 할 수 있습니다.

    debug_backtrace가 반환 한 배열에서이 정보를 추출 할 수 있습니다.

  9. ==============================

    9.저는 Zend_Log를위한 작은 확장을 만들었습니다. 이제는 logger가 호출 된 클래스 / 메소드 / 라인을 보여줍니다. 여기를 참조하십시오 http://mikebevz.com/2010/08/logger-with-caller-class-based-on-zend_log/

    저는 Zend_Log를위한 작은 확장을 만들었습니다. 이제는 logger가 호출 된 클래스 / 메소드 / 라인을 보여줍니다. 여기를 참조하십시오 http://mikebevz.com/2010/08/logger-with-caller-class-based-on-zend_log/

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

    10.이것은 나를 위해 가장 잘 작동했습니다 : var_dump (debug_backtrace ());

    이것은 나를 위해 가장 잘 작동했습니다 : var_dump (debug_backtrace ());

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

    11.사실 나는 debug_print_backtrace ()가 필요한 것을 수행한다고 생각한다. http://php.net/manual/en/function.debug-print-backtrace.php

    사실 나는 debug_print_backtrace ()가 필요한 것을 수행한다고 생각한다. http://php.net/manual/en/function.debug-print-backtrace.php

  12. ==============================

    12.이 작동합니다.

    이 작동합니다.

    $caller = next(debug_backtrace())['function'];
    
  13. from https://stackoverflow.com/questions/190421/caller-function-in-php-5 by cc-by-sa and MIT license