2013-02-14 3 views
2

Я создаю простой класс обертки массива и хочу, чтобы его метод __toString() был отформатирован как список Python, например: ["foo", "bar", 6, 21.00002351]. Преобразование каждого элемента в строку недостаточно, так как строковые объекты фактически перечислены в списке-представлении.PHP-эквивалент для python's repr()

В PHP есть эквивалент repr(), а если нет, то как выглядит реализация PHP?

+0

http://php.net/manual/en/function.print-r.php –

+0

@DietrichEpp: Это должно быть инкапсулировано в 'ob_start()' и 'ob_end_clean()', но я буду использовать что на данный момент. –

+0

В любом случае вы должны использовать отладчик. – KingCrunch

ответ

6

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, полученного представления не является выражение РНР, но уплотненная строка, указывающая тип и его свойства/значение (сериализация).

Но вы, скорее всего, просто ищете 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 

 Смежные вопросы

  • Нет связанных вопросов^_^