我正在创建一个简单的数组包装类,并希望它的__toString()
方法被格式化为一个Python列表,例如:["foo", "bar", 6, 21.00002351]
。将每个元素转换为字符串是不够的,因为字符串对象实际上在列表表示中被引用。PHP等效于Python的repr()
在PHP中是否有repr()
等效,如果不是,PHP实现将是什么样子?
我正在创建一个简单的数组包装类,并希望它的__toString()
方法被格式化为一个Python列表,例如:["foo", "bar", 6, 21.00002351]
。将每个元素转换为字符串是不够的,因为字符串对象实际上在列表表示中被引用。PHP等效于Python的repr()
在PHP中是否有repr()
等效,如果不是,PHP实现将是什么样子?
Python's repr()返回一个输出,其中
eval(repr(object)) == object
由再版调用()内置函数和字符串转换(反向引号)来计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。
所以在PHP中最接近的事情将是
这里的关键词是解析的。虽然函数print_r
和var_dump
将给出传递给它们的数据的某种表示形式,但它们不容易解析,也不像PHP表达式那样可以被评估。
例子:
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,因为我已经在给出的答案中回答了这个问题。
我不知道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
http://php.net/manual/en/function.print-r.php – 2013-02-14 12:53:43
@DietrichEpp:这需要封装在'ob_start()'和'ob_end_clean()'中,但我会用现在。 – 2013-02-14 12:55:38
无论如何,您应该使用调试器。 – KingCrunch 2013-02-14 12:56:45