2009-10-03 5 views
1

가능한 중복은 :
Caller function in PHP 5?PHP에서 피 호출자를 얻으려면 어떻게해야합니까?

나는 전역 함수 또는 공용 메서드가 호출되는 위치에서 알고 싶습니다. 내가 debug_backtrace를 검사하여 그것을 할 수있을 것 같아요하지만 경량급 메커니즘을 사용하는 것이 하나 있다면. 어떤 제안?

그래서, 당신은 get_callee 상상 경우() 함수와 상수 기존과 같은 예를 들어 뭔가 :

function doSomething() { 
    if(get_callee() == 'PHP_GLOBAL') { throw new IllegalAccessException(); } 
    ... 
} 
+0

아니, 그것을 할 내장 된 여관 방법이 있다고 생각하지 마십시오. – Marius

+1

@ 마리우스 : 반사? 'debug_backtrace()'? 방법이 있습니다. –

답변

3

편집 : 죄송합니다,() 지금 debug_backtrace에 대한 메모를 보았다.

어색하지만 어이,이 일을해야 할 일이 잘못되었습니다.

마법은 get_callee() 함수 및 debug_backtrace()에 있습니다. 그리고 네, 이것을 사용해야한다면 몇 가지 오류 검사를 추가하십시오.

<?php 

init(); 

function foo() 
{ 
echo 'bar called from ' . get_callee() . '<br />'; 
bar(); 
} 

function bar() 
{ 
echo 'foo called from ' . get_callee() . '<br />'; 
} 

function init() 
{ 
echo 'init.. <br />'; 
foo(); 
} 

function get_callee() 
{ 
$backtrace = debug_backtrace(); 
return $backtrace[1]['function']; 
} 

출력 :

초기화 ..

foo는 왜 당신은 단순히 OO를 사용하여 선언하지 말아 줄

+0

고마워요, 그게 내가 가진 것도 ...하지만 각 메서드 호출에 대한 오버 헤드를 원하지 않습니다. 내가 성취하고자하는 것은 친구들의 개념과 비슷합니다. 복합체가 공용 멤버 만 복합체 내에서 액세스 할 수 있도록하는 방법입니다. 따라서 모든 호출에 대한 확인이 이루어집니다. 아무리 신경 쓰지 마라. 누군가가 줄을 서면 나는 스페이드로 죽일 것이다. –

+0

@Chocky 예,이 혼란을하는 대신에 훨씬 선호되는 해결책입니다 :) –

2

에서 호출 foo를 호출

바 귀하의 방법/기능 개인?

코드 전체에 get_callee()를 뿌리면 끔찍한 괴물이 생깁니다.

+0

@Anti Veeranna 왜냐하면 무관 한 클래스에 공통의 조상이 필요하기 때문입니다.UserHelper와 같은 User를 가지고 있다고 가정 해 봅시다. 그들은 공통 Superclass를 가져서는 안되지만,이를 달성하기 위해 멤버 액세스를 사용해야합니다. –

+0

알았어. 그리고 당신은 그 기능을 원한 최초의 사람이 아닙니다. 슬프게도 PHP로 할 수있는 명확한 방법은 없습니다 : (debug_backtrace는 악의적 인 해킹입니다.) 내가 찾은 모든 것은 http의 끝에있는 추천입니다. : //bugs.php.net/bug.php? id = 37814 –

1

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 

이 가장 좋은 방법은

sudo aptitude install php5-xdebug 

당신은 설치해야 할 수도 있습니다 우분투에 Xdebug는를 설치하려면 추적 돌아갑니다 PHP5-dev에 첫

sudo aptitude install php5-dev 

more info

관련 문제