PHP中与Python的repr()等效的函数是什么?

4 投票
2 回答
4227 浏览
提问于 2025-04-17 15:52

我正在创建一个简单的数组包装类,想让它的 __toString() 方法的输出格式像 Python 列表那样,比如 ["foo", "bar", 6, 21.00002351]。单单把每个元素转换成字符串是不够的,因为在列表表示中,字符串对象实际上是被引号包围的。

在 PHP 中有没有类似于 repr() 的功能?如果没有,那在 PHP 中该怎么实现呢?

2 个回答

2

我不太懂Python,但我知道PHP的数组可以包含任何数据类型,还可以有多层嵌套。我不太清楚这和你的格式有什么关系。

有很多函数可以用来打印数组:

  • print_r():这个函数可以把数组的内容打印出来,比较容易看。
  • var_dump():这个函数会显示数组的详细信息,包括数据类型和长度。
  • var_export():这个函数会把数组以可用的PHP代码格式输出,方便复制。

... 不过你的格式让我想到了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
11

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

eval(repr(object)) == object

这个函数是通过内置的repr()函数和字符串转换(反引号)来调用的,用于计算一个对象的“官方”字符串表示。如果可能的话,这个表示应该看起来像一个有效的Python表达式,可以用来在合适的环境中重建一个具有相同值的对象。

在PHP中,最接近的东西就是

这里的关键词是可解析。虽然函数print_rvar_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,正如其他地方提到的那样。

将此内容设为社区维基,因为我已经在给定的重复问题中回答过这个。

撰写回答