我在文件info.php
中创建了以下函数来调试变量&页面加载期间的数据
class Info {
static function watch($what,$msg='',$more=FALSE)
{
echo "<hr/>";
echo "<br/>".$msg.":";
if( is_array($what) || is_object($what) )
{
echo "<pre>";
print_r($what);
echo "</pre>";
}
else{
echo $what;
}
if($more)
{
echo "<br/>METHOD:".__METHOD__;
echo "<br/>LINE:".__LINE__;
}
}
}
现在我从另一个页面index.php
调用此方法,其中包含info.php
在这个文件中我想调试POST数组,所以我写下面的代码
class Testpost {
__construct() { // some basic intializtion }
function getPostdata($postarray) {
$postarray=$_POST;
Info::watch($postarray,'POST ARRAY', TRUE);
}
一切正常,但方法和LINE出现在
之下METHOD:Info::watch();
LINE:17 // ( where this code is written in Info class)
但我想要显示
METHOD: Testpost::gtPostdata()
LINE:5( where this function is called in Testpost class)
所以,如果我将$more=TRUE
放在watch()
中,那么我怎么做呢?方法和行号应该是从调用它的类中透明的。
我可以在监听方法中使用self::
或parent::
吗?或者是其他东西
请建议我如何从其他类调用魔术常量或是否有任何其他方法来调试varaibale? (请不要建议使用Xdebug
或任何其他工具)
答案 0 :(得分:2)
你必须使用debug_backtrace()
php函数。
您也有解决问题的方法。请享用! :)
<?php
class Info {
static function watch($what,$msg='',$more=FALSE)
{
echo "<hr/>";
echo "<br/>".$msg.":";
if( is_array($what) || is_object($what) )
{
echo "<pre>";
print_r($what);
echo "</pre>";
}
else{
echo $what;
}
if($more)
{
$backtrace = debug_backtrace();
if (isset($backtrace[1]))
{
echo "<br/>METHOD:".$backtrace[1]['function'];
echo "<br/>LINE:".$backtrace[1]['line'];
}
}
}
}
答案 1 :(得分:1)
您无法使用该范围内的常量。请查看函数 debug_backtrace()。如果它给你太多信息,请尝试解析它。
答案 2 :(得分:1)
debug_bactrace是你完全自动化的唯一方法,但它是一个“重型”函数......执行速度很慢,需要解析才能提取所需的信息。这可能看起来很麻烦,但更好的解决方案是将必要的信息传递给Info :: watch方法:
class Info {
static function watch($whereClass,$whereLine,$what,$msg='',$more=FALSE)
{
echo "<hr/>";
echo "<br/>".$msg.":";
if( is_array($what) || is_object($what) )
{
echo "<pre>";
print_r($what);
echo "</pre>";
}
else{
echo $what;
}
if($more)
{
echo "<br/>METHOD:".$whereClass;
echo "<br/>LINE:".$whereLine;
}
}
}
now i call this method from another page index.php, where i inculded info.php
class Testpost {
__construct() { // some basic intializtion }
function getPostdata($postarray) {
$postarray=$_POST;
Info::watch(__METHOD__,__LINE__,$postarray,'POST ARRAY', TRUE);
}