A partir do PHP 5.4, existe uma interface chamada JsonSerializable que facilita na hora de exportarmos nossos objetos para JSON.
Para isto, devemos declarar nossa classe implementando a interface JsonSerializable, e depois definir um método público jsonSerialize().
Tomando como exemplo um objeto do tipo casa, como no exemplo abaixo:
Class Casa implements JsonSerializable {
private $qtdeQuartos;
pritave $qtdeBanheiros;
public class __constructor($qtdeQuartos, $qtdeBanheiros) {
$this->qtdeQuartos = $qtdeQuartos;
$this->qtdeBanheiros = $qtdeBanheiros;
}
public function getQtdeQuartos()
{
return $this->qtdeQuartos;
}
public function getQtdeQuartos()
{
return $this->qtdeBanheiros;
}
/**
Aqui você dirá como o seu objeto exportará as informações em JSON
*/
public function jsonSerialize()
{
return
[
'quartos' => $this->qtdeQuartos(),
'banheiros' => $this->qtdeBanheiros()
];
}
}
Algo que facilita a exportaçao das propriedades sem precisar ficar setando uma a uma, é alterar o método jsonSerialize para o código abaixo:
public function jsonSerialize()
{
$arrReturn = array();
# varre todas as propriedades do objeto
foreach($this as $key => $value) {
$arrReturn[$key] = $value;
}
return $arrReturn;
}
Assim, todas as propriedades serão exportadas.
Agora é só usar
$minhaCasa = new Casa(1, 3);
$saida_json = json_encode($minhaCasa);
print($saida_json);
Caso você esteja utilizando algum tipo específico, que não possui forma de conversão, como o ArrayCollection do Doctrine, você poderá utilizar o método próprio de convesão de arrays, alterando o método jsonSerialize como no exemplo abaixo:
public function jsonSerialize()
{
$arrReturn = array();
# varre todas as propriedades do objeto
foreach($this as $key =>; $value) {
$arrReturn[$key] = $value;
# se for ArrayColletion, chama método próprio de conversão de array
if($value instanceof \Doctrine\Common\Collections\ArrayCollection) {
$arrReturn[$key] = $value->toArray();
}
}
return $arrReturn;
}
Espero que este post seja útil à alguém.