2013-02-14 79 views
2

我正在創建一個簡單的數組包裝類,並希望它的__toString()方法被格式化爲一個Python列表,例如:["foo", "bar", 6, 21.00002351]。將每個元素轉換爲字符串是不夠的,因爲字符串對象實際上在列表表示中被引用。PHP等效於Python的repr()

在PHP中是否有repr()等效,如果不是,PHP實現將是什麼樣子?

+0

http://php.net/manual/en/function.print-r.php – 2013-02-14 12:53:43

+0

@DietrichEpp:這需要封裝在'ob_start()'和'ob_end_clean()'中,但我會用現在。 – 2013-02-14 12:55:38

+0

無論如何,您應該使用調試器。 – KingCrunch 2013-02-14 12:56:45

回答

6

Python's repr()返回一個輸出,其中

eval(repr(object)) == object 

由再版調用()內置函數和字符串轉換(反向引號)來計算對象的「官方」字符串表示形式。如果可能的話,這應該看起來像一個有效的Python表達式,可用於重新創建具有相同值的對象(給定適當的環境)。

所以在PHP中最接近的事情將是

這裏的關鍵詞是解析的。雖然函數print_rvar_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,因爲我已經在給出的​​答案中回答了這個問題。

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