【问题标题】:PHP equivalent for Python's repr() [duplicate]Python的repr()的PHP等效项[重复]
【发布时间】:2013-01-30 06:45:10
【问题描述】:

我正在创建一个简单的数组包装类,并希望将它的 __toString() 方法格式化为 Python 列表,例如:["foo", "bar", 6, 21.00002351]。将每个元素转换为字符串是不够的,因为字符串对象实际上是在列表表示中引用的。

PHP 中是否有 repr() 等价物,如果没有,PHP 实现会是什么样子?

【问题讨论】:

  • @DietrichEpp:这需要封装在ob_start()ob_end_clean() 中,但我现在将使用它。
  • 无论如何你都应该使用调试器。
  • @NiklasR - 呃,不,print_r 不需要 ob_start 等 - 只需指定第二个参数,它将输出到变量。这个特性是在 PHP 4.3 中添加的,所以如果你认为它需要ob_start,那你已经落后了大约十年。但无论如何,如果它只是要输出的字符串和数字数组,我会选择json_encode 答案;它更适合您问题中的输出。
  • 我为 PHP 字符串制作了一个,因为 var_export 不适用于字符串。here

标签: php python repr


【解决方案1】:

Python's 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,正如其他地方指出的那样。

将此作为社区 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2010-11-23
      • 2014-09-13
      • 2016-11-22
      • 2013-10-20
      • 2010-12-13
      相关资源
      最近更新 更多