Print_R класса как массив
У меня есть класс, который на самом деле работает над сложным массивом, чтобы сделать манипуляцию более простой. Формат исходного массива выглядит так:
array(
array(
"name" =>"foo",
"type" =>8, //The array is NBT format and 8 stands for string
"value" =>"somevalue"
)
}
Класс принимает массив, как указано выше, в качестве конструктора:
class NBT_traverser implements ArrayAccess {
function __construct(&$array) {
$this->array = $array;
}
}
Затем, вот как осуществляется доступ к членам:
$parser = new NBT_traverser($somearray);
echo $parser["foo"]; //"somevalue"
Когда я print_R
класс, я получаю список его значений и оригинальный сложный массив. Как это:
object(NBT_traverser)#2 (1) {
["nbt":"NBT_traverser":private]=> &array(1) {
/*Tons of ugly array contents*/
}
Вместо этого я хотел бы получить это как вывод print_r
:
array(
"foo" => "somevalue"
)
Можно ли обмануть print_r
сделать это? Текущее поведение затрудняет отладку с классом, чем без него.
Конечно, я могу написать свой собственный метод для его распечатки, но я хочу сделать его использование более простым для пользователей класса. Вместо этого я хотел дать print_R
что-то, что он будет печатать как массив.
2 ответа
У вас не должно быть проблем, если вы расширяете ArrayAccess
просто напишите метод, чтобы получить ваши значения
пример
$random = range("A", "F");
$array = array_combine($random, $random);
$parser = new NBT_traverser($array);
echo $parser->getPrint();
Выход
Array
(
[A] => A
[B] => B
[C] => C
[D] => D
[E] => E
[F] => F
)
Используемый класс
class NBT_traverser implements ArrayAccess {
private $used; // you don't want this
protected $ugly = array(); // you don't want this
public $error = 0202; // you don't want this
private $array = array(); // you want this
function __construct(&$array) {
$this->array = $array;
}
function getPrint() {
return print_r($this->array, true);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->array[] = $value;
} else {
$this->array[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->array[$offset]);
}
public function offsetUnset($offset) {
unset($this->array[$offset]);
}
public function offsetGet($offset) {
return isset($this->array[$offset]) ? $this->array[$offset] : null;
}
}
Вы можете использовать функцию __toString в вашем классе
class Test
{
private $_array = array();
public function __toString()
{
return print_r($this->_array, true);
}
}
А затем просто повторить свой класс
$test = new Test();
echo $test;
Я думаю, что это будет распечатывать ваш массив, как вы хотите?
Array
(
)