PHP中类似于Python的repr()函数的等效函数是什么?

4
我正在创建一个简单的数组包装类,并希望它的__toString()方法格式化为Python列表,例如:["foo", "bar", 6, 21.00002351]。仅将每个元素转换为字符串是不够的,因为字符串对象实际上被包含在列表表示中。在PHP中是否有repr()的等效函数?如果没有,PHP实现会是什么样子?

http://php.net/manual/en/function.print-r.php - Dietrich Epp
@DietrichEpp:这需要封装在 ob_start()ob_end_clean() 中,但我现在会使用它。 - Niklas R
无论如何,你应该使用调试器。 - KingCrunch
2
@NiklasR - 嗯,print_r不需要ob_start等等--只需指定第二个参数,它就会输出到一个变量。这个功能是在PHP 4.3中添加的,所以如果你认为它需要ob_start,那么你已经落后了十年。但无论如何,如果你只想输出字符串和数字的数组,我会选择json_encode的答案;它更接近你问题中的输出。 - SDC
我为 PHP 字符串创建了一个变量导出函数,因为 var_export 对字符串无效。这里 - igonejack
2个回答

10

Python的repr()返回一个输出结果,其中

eval(repr(object)) == object

被repr()内置函数和字符串转换(反引号)调用,以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以使用相同的值重新创建对象(在适当的环境下)。因此,在PHP中最接近的是var_export — 输出或返回可解析的变量字符串表示形式。关键字是“可解析”。虽然函数print_r和var_dump会给出传递给它们的数据的某些表示,但它们不容易解析,也不像PHP表达式,可以eval评估。例如:
var_export(['foo', 'bar', 1,2,3]);

将会给予

array (
  0 => 'foo',
  1 => 'bar',
  2 => 1,
  3 => 2,
  4 => 3,
)

这是完全有效的 PHP 代码:

$data = ['foo', 'bar', 1, 2, 3];
$repr = var_export($data, true);

// have to use it with return though to eval it back into a var
$evald = eval("return $repr;");

var_dump($evald == $data); // true

另一个选择是使用serialize来获取数据类型的规范且可解析的表示,例如:
$data = ['foo', 'bar', 1, 2, 3];
$repr = serialize($data); 
// -> a:5:{i:0;s:3:"foo";i:1;s:3:"bar";i:2;i:1;i:3;i:2;i:4;i:3;}
var_dump( unserialize($repr) == $data ); // true

var_export不同,其结果表示不是PHP表达式,而是指示类型及其属性/值(序列化)的压缩字符串。

但您可能只是在寻找其他地方指出的json_encode

将此设置为社区Wiki,因为我已经在给定的重复问题中回答过了。


2

我不懂Python,但PHP数组可以包含任何数据类型和嵌套级别。我不知道这如何转换成您的格式。

有许多函数可用于打印数组:

  • print_r()
  • var_dump()
  • var_export()

... 但是您的格式让我想起了JSON,因此您可以简单地执行以下操作:

<?php

$foo = array (
  'foo',
  'bar',
  6,
  21.00002351,
);
echo json_encode($foo); // ["foo","bar",6,21.00002351]

当然,这绝不是自动的,也就是说,这根本不会触发任何toString()方法:
echo $foo; // "Array" + PHP Notice:  Array to string conversion

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