我的 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/