2016-02-29 57 views
2

我一直在PHP中编码很长一段时间(现在超过15年),而且我通常在Windows操作系统上这样做,尽管大部分时间都是为了执行在Linux服务器上。多年来,我遇到了一个烦恼,虽然不重要,但事实证明这有点令人烦恼,而且我已经到了想看看我能否以某种方式解决它的地步。这里的问题是:是否有可能改变PHP的print_r函数的行为

编码时,我经常发现将数组的内容输出到文本文件以便我可以查看它的内容是有用的。例如:

$fileArray = file('path/to/file'); 
$faString = print_r($fileArray, true); 
$save = file_put_contents('fileArray.txt', $faString); 

现在,当我用记事本打开该文件fileArray.txt,如果该文件是在写字板打开该文件的内容都显示在一个单一的线,而不是看到了漂亮迷人的结构。这是因为,无论操作系统如何,PHP的print_r函数都使用\ n代替换行符,而不是\ r \ n。我当然可以通过简单地添加一行代码来进行必要的替换,从而解决问题。这一行,额外的代码可以翻译成我几年来的数百个额外的步骤,而这些步骤不应该是必需的。我是一个懒惰的编码器,这已经变得不可接受了。

目前,在我的开发机器上,我已经有了一种不同的解决方法(如下所示),但这有它自己的一套问题,所以我想找到一种方法来“强制“PHP在没有所有额外代码的情况下放入”正确的“换行符。我怀疑这可能是可能的,但我永远不会知道我是否从未问过,所以...

无论如何,我目前的解决方法是这样的。我有,在我的PHP包括路径,文件(print_w.php),其中包括下面的代码:

<?php 

    function print_w($in, $saveToString = false) { 
    $out = print_r($in, true); 
    $out = str_replace("\n", "\r\n", $out); 
    switch ($saveToString) { 
     case true: return $out; 
     default: echo $out; 
    } 
    } 
?> 

我还的auto_prepend_file设置在php.ini此相同的文件,因此它会自动包括它的每一个时间PHP在我的开发机器上执行脚本。然后在测试脚本时使用print_w函数代替print_r。这很好,只要当我将脚本上传到远程服务器时,我确保所有对函数print_w的引用都被删除或注释掉。如果我错过了一个,我(当然)会得到一个致命的错误,这可能比原始问题更令人沮丧,但我在上传之前仔细校对了我的代码,因此它通常不是问题。

因此,在所有这些散乱之后,我的问题是,有没有办法改变print_r(或类似PHP函数)的行为来使用Windows换行符,而不是Windows机器上的Linux换行符?

谢谢你的时间。

+0

不!我只是试了一下,它和print_r有同样的问题,但是谢谢你的建议。 –

+0

我也做过:P没有任何变化。这就是为什么我删除了我最后的评论。我个人使用这样的东西:http://stackoverflow.com/a/4282183/1437261(我使用Yii框架,它有内置)。 – Gogol

+1

感谢您的建议。我想过只是深入研究PHP的代码库,并对那里的行为做出改变,但我不是那种编码器,所以我可能会破坏一些东西。至于使用Yii(或任何其他类型的框架),这并不总是一种选择,因为我是一个自由开发人员,并不是所有客户都愿意使用“新技术”的想法,所以这不是一个普遍的选择我。 –

回答

2

好的,经过进一步的研究,我找到了一个更好的解决方案,满足了我的需求,并且不需要调用自定义函数而不是print_r。这个新的解决方法是这样的:

我仍然必须有一个包含的文件(我保持相同的名称,以免惹php.ini),并且php.ini仍然有auto_prepend_file在地方设置,但在print_w.php代码修改了一下:

<?php 

    rename_function('print_r', 'print_rw'); 

    function print_r($in, $saveToString = false) { 
    $out = print_rw($in, true); 
    $out = str_replace("\n", "\r\n", $out); 
    switch ($saveToString) { 
     case true: return $out; 
     default: echo $out; 
    } 
    } 

?> 

这有效地改变了我的本地机器上的print_r函数的行为,没有我不必调用自定义函数,并且必须确保所有对该自定义函数的引用都被中和。通过使用PHP的rename_function,我能够有效地重写print_r的行为方式,从而可以解决我的问题。

+0

我不知道这样的功能存在!感谢rename_function thingy。 +1。 – Gogol

+1

该函数实际上是称为apd的PECL库的一部分。安装时很痛苦,但是一旦安装就会很有帮助。 –

相关问题