2010-10-12 17 views
8

Các tham số mà tôi đang nói đến là __FILE____LINE__ - các thông số của người gọi hàm, để chức năng có thể sử dụng chúng trong báo cáo lỗi.Tôi có thể tạo một macro "PHP" (như #define) để cung cấp các tham số cho các cuộc gọi hàm không?

Hãy nói rằng tôi có hai tập tin và dòng 100 của file_1.php gọi my_func() trong file_2.php

tôi muốn mang đến cú my_func(__FILE__, __LINE__) để nếu my_func gặp một lỗi nó có thể báo cáo chống lại file_1 .php tại dòng 100.

Tôi làm điều đó vì có hàng trăm cuộc gọi đến my_func và báo cáo lỗi trong chính my_func() có thể không mang tính thông tin (trừ khi tôi đổ ngăn xếp). Và tôi không muốn phải gõ hai tham số đó một cách thủ công vài trăm lần.

Trong C, tôi sẽ làm điều gì đó như #define MY_FUNC my_func(__FILE, __LINE) - tôi có thể làm điều gì đó tương tự trong PHP không?

Trả lời

10

Thật không may, PHP không có bất kỳ loại macro nào. Bạn có thể thực hiện các chính mình bằng cách chạy một công cụ dòng lệnh như sed trên một số đầu vào để chèn macro, nhưng đó là lỗi dễ bị và một chút cẩu thả.

Để làm những gì bạn muốn làm, bạn có thể xem xét hàm debug_backtrace.

+0

7 hoặc 8 năm sau, tôi tìm thấy câu hỏi này một lần nữa và nghĩ rằng tôi sẽ nói rằng tôi sử dụng kết hợp câu trả lời của Mojtab cho trường hợp ngoại lệ, adn backtrace như được đề xuất ở đây – Mawg

2

Không. Sử dụng dấu vết ngăn xếp: debug_backtrace(). Bạn có thể truy xuất tệp và dòng của người gọi, chỉ cần nhìn vào hàng thứ hai trong mảng được trả về.

2

Rất tiếc, không có C giống như Macros trong PHP.

đọc một debug_backtrace là khó khăn và tôi không thích điều đó.

Tôi muốn ném ngoại lệ vào các điểm lỗi thì đối tượng ngoại lệ nó chứa dấu vết ngăn xếp cũng như số dòng và tệp mà nó đến từ đó.

catch (Exception $e) 
{ 
    $errorMessage = $e->getMessage() . " LINE: " .$e->getLine(). " FILE: " . $e->getFile(); 
} 
+1

Thanh toán lib này https://www.sitepoint.com/ php-macros-for-fun-and-profit / –

2

Bạn có thể sao chép macro giống như C với sự trợ giúp của ghi lại tệp nguồn.

Viết tập tin macro.php:

<?php 

$name = $_SERVER['PHP_SELF']; 
$name = preg_replace('#\/#mui', '', $name); 

$file = file_get_contents($name); 

// get defined macros 
preg_match_all('#\#macro\h+(\w+)\h+(.*)$#mui', $file, $matches, PREG_SET_ORDER); 

foreach ($matches as $m) { 
    // delete macro definition 
    $file = str_replace($m[0], '', $file); 
    // substitute macro => value 
    $file = str_replace($m[1], $m[2], $file); 
} 

// save processed file 
$new_name = '/var/tmp/' . $name . '.pr'; 
file_put_contents($new_name, $file); 

include_once $new_name; 
exit; 

Bây giờ với công cụ như vậy, sử dụng rất đơn giản:

<?php 

include_once "macro.php"; 

#macro DEBUG_INFO ;echo('<b> DEBUG_INFO: __FILE__ : ' . __FILE__ . ';__LINE__ : ' . __LINE__ . '</b>') 

echo '<br>'.(1/2); DEBUG_INFO; 
echo '<br>'.(1/0); DEBUG_INFO; 
echo '<br>'.(0/0); DEBUG_INFO; 

Khi đầu ra thực hiện:

0,5 DEBUG_INFO: FILE:/var /tmp/test.php.pr; ĐƯỜNG DÂY: 7

INF DEBUG_INFO: FILE: /var/tmp/test.php.pr; ĐƯỜNG DÂY: 8

NAN DEBUG_INFO: FILE: /var/tmp/test.php.pr; LINE: 9

Tôi có nền C mạnh và luôn bỏ qua các macro kiểu C trong PHP. Nhưng hy vọng chúng ta có thể tiêm một số loại thay thế cho nó.

Các vấn đề liên quan