Ben garip bir sorun haline çalıştırmak ve bunu düzeltmek için nasıl emin değilim. Ben JSON nesneleri tüm PHP uygulamaları birkaç sınıfları var. Sorunu burada 'bir illüstrasyon
class A
{
protected $a;
public function __construct()
{
$this->a = array( new B, new B );
}
public function __toString()
{
return json_encode( $this->a );
}
}
class B
{
protected $b = array( 'foo' => 'bar' );
public function __toString()
{
return json_encode( $this->b );
}
}
$a = new A();
echo $a;
Bu ikinci çıkışı
[{},{}]
desired çıkışı olduğunda
[{"foo":"bar"},{"foo":"bar"}]
Sorun benim için işi yapmak için __ toString () kanca dayanarak olmasıdır. Serialize ki json_encode () kullandığı __ toString () çağrı olmaz çünkü Ama yapamam. Bu iç içe geçmiş bir nesne ile karşılaştığında sadece ortak özelliklerini sadece serileştirir.
Yani soru o zaman bu hale: ben hem beni özellikleri belirleyiciler ve alıcılar kullanmanızı sağlar, ama aynı zamanda beni arzu JSON serileştirme davranışını almanızı sağlar json sınıflar için yönetilen arayüzü geliştirmek bir yolu var mı?
Açık değilse, burada __ set beri won't iş, () kanca sadece ilk atama için denir bir uygulama örneği
class a
{
public function __set( $prop, $value )
{
echo __METHOD__, PHP_EOL;
$this->$prop = $value;
}
public function __toString()
{
return json_encode( $this );
}
}
$a = new a;
$a->foo = 'bar';
$a->foo = 'baz';
echo $a;
Ben de böyle bir şey yapabileceğini varsayalım
class a
{
public $foo;
public function setFoo( $value )
{
$this->foo = $value;
}
public function __toString()
{
return json_encode( $this );
}
}
$a = new a;
$a->setFoo( 'bar' );
echo $a;
Ama sonra ayarlayıcıları kullanmak için, diğer geliştiricilerin titizlik güvenmek gerekir - bu çözüm ile programmtically bağlılığı zorlayamaz.
---> EDIT <---
Şimdi Rob Elsner tepkisinin bir testi ile
<?php
class a implements IteratorAggregate
{
public $foo = 'bar';
protected $bar = 'baz';
public function getIterator()
{
echo __METHOD__;
}
}
echo json_encode( new a );
Eğer bu idam zaman, getIterator () yöntemi çağrılır hiç olmadığını görebilirsiniz.