2009-04-13 42 views
5

các bạn có biết làm thế nào tôi có thể xác định từ tệp nào được gọi là hàm bên trong hàm đó?Xác định một hàm đã được gọi với PHP

Tôi đã nghĩ đến việc sử dụng debug_backtrace .. nhưng điều đó không giống như một cách thanh lịch để làm điều đó, và họ cũng enumarate lý do khác trong một câu hỏi khác here

Vậy lựa chọn thay thế nào nữa?

thanks a lot

+0

Tại sao bạn cần phải biết từ đâu chức năng hiện nay đã được gọi là? Khi câu hỏi được liên kết tuyên bố, bạn nên suy nghĩ lại về thiết kế của mình nếu các chức năng của bạn thực sự cần phải biết ai đã gọi chúng. – Gumbo

+0

tôi có một lớp xem và không muốn chỉ định toàn bộ đường dẫn của chế độ xem ... nhưng chỉ có tên và kết quả trong chế độ xem nằm trong cùng thư mục với chế độ xem được gọi là lớp. –

+0

Có vẻ như bạn chuẩn bị bắn chân. Đừng làm thế. – troelskn

Trả lời

2

Từ trong hàm debug_backtrace() là cách duy nhất để xác định người gọi, trừ khi tất nhiên bạn chuyển thông tin đó làm tham số.

Lưu ý rằng bạn không thể sử dụng giá trị mặc định để thực hiện việc này. Ví dụ:

function f($param1, $param2, $caller=__FUNCTION__) ... 

__FUNCTION__ sẽ được đánh giá vào thời gian phân tích cú pháp, vì vậy sẽ luôn có cùng giá trị. Chức năng trong phạm vi f được khai báo.

3

tôi mượn mã này một số thời gian trước đây từ một nơi nào và nó hoạt động như một say mê sử dụng debug_backtrace(). Hy vọng bạn thấy hữu ích:

function backtrace(){ 
    $backtrace = debug_backtrace(); 

    $output = ''; 
    foreach ($backtrace as $bt) { 
     $args = ''; 
     foreach ($bt['args'] as $a) { 
      if (!empty($args)) { 
       $args .= ', '; 
      } 
      switch (gettype($a)) { 
       case 'integer': 
       case 'double': 
        $args .= $a; 
        break; 
       case 'string': 
        //$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : ''); 
        $args .= "\"$a\""; 
        break; 
       case 'array': 
        $args .= 'Array('.count($a).')'; 
        break; 
       case 'object': 
        $args .= 'Object('.get_class($a).')'; 
        break; 
       case 'resource': 
        $args .= 'Resource('.strstr($a, '#').')'; 
        break; 
       case 'boolean': 
        $args .= $a ? 'TRUE' : 'FALSE'; 
        break; 
       case 'NULL': 
        $args .= 'Null'; 
        break; 
       default: 
        $args .= 'Unknown'; 
      } 
     } 
     $output .= '<br />'; 
     $output .= '<b>file:</b> '[email protected]$bt['file'].' - line '[email protected]$bt['line'].'<br />'; 
     $output .= '<b>call:</b> '[email protected]$bt['class'][email protected]$bt['type'][email protected]$bt['function'].'('.$args.')<br />'; 
    } 
    return $output; 
} 
+0

Tôi đang tìm một giải pháp thay thế cho việc sử dụng chức năng debug_backtrace. –

+1

Sau đó, tôi tin rằng bạn nên rephrase câu hỏi của bạn, như tôi hiểu vấn đề của bạn là debug_backtrace đã trình bày sản lượng của nó xấu xí. Dù sao, tôi không nghĩ rằng có một thay thế đơn giản để debug_backtrace ... – Seb

1

Bạn sẽ không có nhiều tùy chọn ở đó. Các tùy chọn khác (mà đã được đăng trong câu hỏi khác) để buộc người gọi để provde đó là thông tin với các cuộc gọi chức năng (sử dụng PHP hằng ma thuật):

callFunction(1, 2, 3, __FUNCTION__) 
callFunction(1, 2, 3, __CLASS__, __METHOD__) 
callFunction(1, 2, 3, $this, __METHOD__) 

    or 

$class = new ReflectionClass(__CLASS__); 
$method = $class->getMethod(__METHOD__); 
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj 

sẽ là một lựa chọn tốt. Nhưng nó

  • Obfuscating mã của bạn
  • có thể được "chế tác", mà có thể gây ra các quy tắc ứng callFunction thất bại và nó sẽ là khá khó khăn để theo dõi những lỗi xuống.

Nếu tôi ở vị trí của bạn, tôi sẽ cố gắng tránh nó trong một chức năng được sử dụng trong suốt mã của bạn. sử dụng debug_backtrace (ngay cả khi nó có thể là 'chậm'). Mã có thể đọc được thắng trên mã nhanh.

0

Nếu đây là mục đích gỡ lỗi, bạn có thể ném ngoại lệ và in ngăn xếp cuộc gọi chức năng ở nơi bạn bắt được.

3

Câu trả lời ở đây bởi nhóm chuột mickey là điển hình của cộng đồng PHP trực tuyến! Thay vì chia sẻ câu trả lời, họ hỏi bạn tại sao bạn có thể cần nó. Không bao giờ để ý đến thực tế là solomongaby hỏi một câu hỏi hợp lệ và nó là một tính năng khá bình thường trong các ngôn ngữ tiêu chuẩn của IDE và chuyên nghiệp hơn như Java và Objective-C.

Solomongaby, đây là cách đơn giản nhất để giúp bạn có được những gì bạn cần:

$bt = debug_backtrace(); 
$end = end($bt); 
var_dump($end['class']); //or var_dump($end['file']); 
Các vấn đề liên quan