php - 使 print_r 使用 PHP_EOL

标签 php eol

我的 PHP_EOL 是“\r\n”,但是,当我在数组上执行 print_r 时,每个新行都有一个“\n” - 而不是“\r\n” - 放在后面

知道是否可以改变这种行为吗?

最佳答案

如果您查看 print_r 的源代码,您会发现:

PHP_FUNCTION(print_r)
{
    zval *var;
    zend_bool do_return = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) {
        RETURN_FALSE;
    }

    if (do_return) {
        php_output_start_default(TSRMLS_C);
    }

    zend_print_zval_r(var, 0 TSRMLS_CC);

    if (do_return) {
        php_output_get_contents(return_value TSRMLS_CC);
        php_output_discard(TSRMLS_C);
    } else {
        RETURN_TRUE;
    }
}

最终,您可以忽略围绕 zend_print_zval_r(var, 0 TSRMLS_CC); 的问题。

如果您跟踪堆栈跟踪,您会发现:

ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC) /* {{{ */
{
    zend_print_zval_r_ex(zend_write, expr, indent TSRMLS_CC);
}

导致

ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC) /* {{{ */
{
    switch (Z_TYPE_P(expr)) {
        case IS_ARRAY:
            ZEND_PUTS_EX("Array\n");
            if (++Z_ARRVAL_P(expr)->nApplyCount>1) {
                ZEND_PUTS_EX(" *RECURSION*");
                Z_ARRVAL_P(expr)->nApplyCount--;
                return;
            }
            print_hash(write_func, Z_ARRVAL_P(expr), indent, 0 TSRMLS_CC);
            Z_ARRVAL_P(expr)->nApplyCount--;
            break;

从现在开始,您可以继续找到相关行 - 但由于已经有一个硬编码的 "Array\n" - 我将假设 print_r< 的其余部分 实现使用相同的硬编码 \n 换行符。

因此,回答您的问题:您不能将其更改为使用 \r\n。 使用提供的解决方法之一。

Sidenode:由于 print_r 主要用于调试,这也可以完成这项工作:

echo "<pre>";
print_r($object);
echo "</pre>";

关于php - 使 print_r 使用 PHP_EOL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663586/

相关文章:

php - 正在尝试检索个人资料图片

php - 如何更好地组织所有命名空间?

powershell - 使用 powershell 替换 CRLF

vim - 如何在窗口结束前将文本换行 5 个字符?

git - 我如何避免像这样的 git-svn 和 svn CRLF 问题?

php - 死锁和超时破坏 ACID 事务

php - 更新查询以使用连接表

javascript - JS提示+PHP

linux - 使用 Perl Win7 为 Linux 编写文件并且只有 Linux 行结尾

java - 匹配行尾