PHP: __ toString () и json_encode () не играющий хорошо вместе

вы можете использовать что-то вроде "//div[@class!='extras']/div[@class='phrase']", он должен найти все div с классом 'фраза', где родительский класс не является 'дополнением'

11
задан Peter Bailey 31 December 2008 в 06:54
поделиться

3 ответа

Разве Ваш ответ в документах PHP для json_encode не?

Для любого, кто столкнулся с проблемой частных собственностей, не добавляемых, можно просто реализовать интерфейс IteratorAggregate с getIterator () метод. Добавьте свойства, Вы хотите быть включенными в вывод в массив в getIterator () метод и возвратить его.

2
ответ дан 3 December 2019 в 02:53
поделиться

Даже если Ваша защищенная переменная была общедоступна вместо защищенного, у Вас не будет желаемого входа, так как это произведет весь объект как это:

[{"b":{"foo":"bar"}},{"b":{"foo":"bar"}}]

Вместо:

[{"foo":"bar"},{"foo":"bar"}]

Это, скорее всего, победит Вашу цель, но я более склонен преобразовать в json в исходном классе с методом считывания по умолчанию и призывом к значениям непосредственно

class B
{
    protected $b = array( 'foo' => 'bar' );

    public function __get($name)
    {
        return json_encode( $this->$name );
    }
}

Затем Вы могли сделать с ними вообще, Вы требуете, даже вложение, которое значения в дополнительном массиве как Ваш класс A делают, но использующий json_decode.. это все еще чувствует себя несколько грязным, но работы.

class A
{
    protected $a;

    public function __construct()
    {
        $b1 = new B;
        $b2 = new B;
        $this->a = array( json_decode($b1->b), json_decode($b2->b) );
    }

    public function __toString()
    {
        return json_encode( $this->a );
    }
}

В документации существуют некоторые ответы на эту проблему (даже если мне не нравится большинство из них, сериализируя +, разделение свойств заставляет меня чувствовать себя грязным).

0
ответ дан 3 December 2019 в 02:53
поделиться

Вы правы __ toString () для класса B, не называется, потому что нет никакой причины для. Таким образом для вызова его можно использовать бросок

class A
{
    protected $a;

    public function __construct()
    {
        $this->a = array( (string)new B, (string)new B );
    }

    public function __toString()
    {
        return json_encode( $this->a );
    }
}

Примечание: (строка) бросок перед новым B... это назовет _toString () методом класса B, но это не получит Вас, что Вы хотите, потому что Вы столкнетесь с классиком "дважды кодирование" проблем, потому что массив кодируется в классе B _toString () метод, и это будет закодировано снова в класс _toString () метод.

Таким образом, существует выбор декодирования результата после броска, т.е.:

 $this->a = array( json_decode((string)new B), json_decode((string)new B) );

или Вы испытываете необходимость для получения массива путем создания toArray () метод в классе B, который возвращает прямой массив. Который добавит некоторый код к строке выше, потому что Вы не можете использовать конструктора PHP непосредственно (Вы не можете сделать нового B ()-> toArray ();), Таким образом, у Вас могло быть что-то как:

$b1 = new B;
$b2 = new B;
$this->a = array( $b1->toArray(), $b2->toArray() );
-1
ответ дан 3 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: