2014-03-27 1 views
0

메서드 이름을 원합니다. 예를 들어, A url이 method1으로 전화를 걸어 method2으로 전화하면 method2은 누가이 방법을 호출하는지 알고 싶어합니다. 내가 어떻게 할 수 있니?codeigniter 부모 메서드에서 메서드 이름을 얻습니다.

나는 method1에서 __FUNCTION__ 또는 $this->router->method을 사용할 수 있으며 method2 매개 변수로 지정할 수 있습니다. 하지만 나는이 방법을 얻으려고 에 method1에서 전화를 할 수 있는지 알고 싶습니까? 대단히 감사합니다.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class ControllerName extends CI_Controller { 

    public function __construct() 
    { 
    parent::__construct(); 
    } 

    public function method1() 
    { 
     $this->_method2() 
    } 

    private function _method2() 
    { 
    // How to get call method name method1, 
    // Don't use parameter 
    // $who_call_me = 'method1'; 
    } 

} 

답변

1

debug_backtrace() 함수를 사용할 수 있습니다. 나는 그것이 당신이 매개 변수를 사용할 수없는 경우를 알 수있는 유일한 방법이라고 생각합니다.

$callers=debug_backtrace(); 
echo $callers[1]['function']; 

이전 호출 방법을 알고 싶다면 array_shift를 사용하십시오. 그것은 당신의 URL에 따라 달라집니다

$caller=array_shift($callers); 
echo "Called by {$caller['function']}"; 
+0

'$ callers' 배열은 스택과 비슷합니까? 예를 들어,'method1-> method2-> method3' 일 경우, array는 $ caller [1] [ 'function'] = method2, $ caller [2] [ 'function'] = method3이어야합니다. – lighter

+0

yes. 그것은 배열을 만든다. 또는 이전 메서드 호출을 알고 싶다면 array_shift를 사용할 수 있습니다. 나는 내 대답을 편집 할 것이다. – sunny

+0

감사합니다. – lighter

0

이를 같은 - 결과를 보여줍니다하지만 u는 같은 것을 할 수 있습니다 ..

function getNameOfOriginatingClass{ 
    $this->load->library('user_agent'); 
    $previous_url = $this->agent->referrer(); 
    $url_segments = explode('/',$previous_url); 
    echo '<pre>';print_r($url_segments);  
} 

를 u는 당신의 연결이 배열 부분으로 나누어 볼 수있다이 결과를 인쇄 한 후 일반적으로 $ url_segments [3] 또는 $ url_segments [4]에는 이전 함수 이름이 포함되며 이전 url_segments [4]에는 URL에 따라 이전 클래스 이름이 포함됩니다.

+0

누군가가 자신의 URL을 다시 작성하면 어떻게 될까요? 나는 당신의 코드에 대한 URL에 의존하는 것이 좋은 생각이라고 생각하지 않습니다. – sunny

관련 문제