全局覆盖 var_dump 是什么?

3
我不喜欢var_dump打印对象的方式。我想用以下函数覆盖它:
function var_dump($object, $die = true) {
    print '<pre>';
    print_r($object);
    if ($die) die();
}

我知道如何在我的应用程序中覆盖它,但是否有一种方法可以在PHP配置级别上全局覆盖所有站点的设置?


你可以将它放到PHP的默认包含路径中,并始终将文件自动加载吗? - Smar
这是最优雅的解决方案吗?我的直觉告诉我还有更好的方法。 - rockstardev
对我来说,最优雅的解决方案是始终在应用程序级别上覆盖它;这样当您移动到另一个服务器时,它就不会出现问题。 - Smar
我喜欢使用一个标准的include/require文件,其中包含了我经常需要但php默认没有实现的基本函数。由于这几乎总是第一个执行的语句,这将是放置伪全局覆盖的好地方。每当项目迁移或我创建新项目时,这个标准的include文件都是其中的一部分。 - scenia
在继续之前,请仔细查看var_dump(null)print_r(null)之间的区别。 - Marty
2个回答

5

目前在PHP中无法以“正确的方式”实现这一点。而且更重要的是,你不应该这样做。

var_dump() 的作用是正确地输出内容,仅此而已。如果你想改变它,那么根据定义,你需要一些用户定义的行为。因此:

  • Create your own function. That is what you have now. User-defined functions are for user-defined behavior.
  • Or else, if you want to do it with var_dump() name by some reason, use namespace like:

    namespace Utils;
    function var_dump($var, $exit=true, $return=true)
    {
       $result = sprintf('<pre>%s</pre>', print_r($var, true));
       if($exit)
       {
          echo $result;
          exit;
       }
       if($return)
       {
          return $result;
       }
       echo $result;
    }
    

    so usage will look like:

    $obj = new StdClass();
    $str = \Utils\var_dump($obj, false);
    //do domething with $str
    echo $str; //or use second false
    
  • Worst case: runkit_function_redefine() Remember, this is evil. You should not do that because redefining goes against what is function and why it was defined. It is a global side-effect and you should avoid such behavior.


是的,谢谢你的建议。此外,可以在静态中进行改进,并称之为Utils::var_dump($obj, false);。我更喜欢这样做。 - undefined

1
你可以使用override_function函数:http://www.php.net/manual/en/function.override-function.php来替换var_dump函数的行为。如果你想在所有网站中包含这段代码,可以将其放入php.ini文件中。
php_value auto_prepend_file /path/to/file_where_you_override_function.php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接