Page 1 sur 1

json_encode($object) qui ne fonctionne pas

Posté : 23 mai 2011, 18:11
par VaN
Bonsoir,

J'ai une classe Photo, dont voici un extrait :
class Photo Extends Object_Model {
	
	private $id;
	private $galerie_id;
	private $date;
	private $titre;
	private $fichier;
	private $position;
	private $statut;
	
	private $extension;
	private $tmp_file;
	private $upload_folder;
	
	public function __construct($object_or_array_or_id = '') {
		
		global $lang;

		if(is_object($object_or_array_or_id)) {
			$item = $object_or_array_or_id;
		}
		if(is_array($object_or_array_or_id)) {
			$item = $object_or_array_or_id;
		}
		elseif(is_numeric($object_or_array_or_id)) {
			$item = Sql::get_row_from_query(sprintf("SELECT PHOTOS.*
			FROM " . TABLES__GALERIES_PHOTOS . " PHOTOS 
			WHERE id = '%d'", mysql_real_escape_string($object_or_array_or_id)));
		}
		
		if(!empty($item)) {
			$this->hydrate($item);
			$this->extension = Object_Model::file_get_extension($this->fichier);
		}
		
	}
	
	public function hydrate($array) {
		foreach($array as $key => $value) {
			$this->$key = $value;
		}
	}
	
	public function __get($property) {
		if(isset($this->$property)) {
			return $this->$property;
		}
	}
	public function __set($property, $value) {
		$this->$property = $value;
	}
}
J'essaye désespérément de renvoyer une représentation JSON de mon objet instancié, sans succès :
$photo = new Photo();
$photo->galerie_id = $clean['parent_id'];
$photo->fichier = $photo->galerie_id . '-' . $_FILES['Filedata']['name'];
$photo->position = $max_position + 1;
$photo->statut 	= 1;
		
echo json_encode($photo);
me renvoie
{}
alors qu'un print_r($photo) m renvoie bien :
Photo Object
(
[id:Photo:private] =>
[galerie_id:Photo:private] => 1
[date:Photo:private] =>
[titre:Photo:private] =>
[fichier:Photo:private] => 1-fotolia_4582794.jpg
[position:Photo:private] => 9
[statut:Photo:private] => 1
[extension:Photo:private] =>
[tmp_file:Photo:private] =>
[upload_folder:Photo:private] =>
)
Je suis pourtant en PHP 5.3

Une idée ?

Re: json_encode($object) qui ne fonctionne pas

Posté : 23 mai 2011, 19:36
par xTG
json_encode ne fonctionne qu'avec l'encodage utf-8, ton fichier est-il enregistré en utf-8, le serveur est-il en utf-8 ?

Re: json_encode($object) qui ne fonctionne pas

Posté : 24 mai 2011, 09:53
par VaN
Je suis en localhost actuellement, qui est bien en UTF-8. j'ai vérifié mon fichier php, qui était en ANSI, et que je viens de convertir en UTF-8 (without BOM). Mais toujours pareil, le fichier me renvoie un string JSON vide. J'utilise en fait le plugin Uploadify de jQuery, qui utilise un SWF et un fichier PHP pour l'upload PHP. Est-ce que l'encodage du fichier .swf peut jouer un rôle la dedans ?

Re: json_encode($object) qui ne fonctionne pas

Posté : 24 mai 2011, 10:06
par popy
Non mais, reflechis, toutes tes propriétés sont en private !

Re: json_encode($object) qui ne fonctionne pas

Posté : 24 mai 2011, 10:41
par VaN
Je ne comprend pas où est le problème. si je print_r() mon objet, il m'affiche bien ses propriétés. Comment se fait-il que json_encode() n'y ai pas accès ? Et dans le pire des cas, je devrai tout de même récupérer les noms des propriétés, mais avec des valeurs vides, non ?

Re: json_encode($object) qui ne fonctionne pas

Posté : 24 mai 2011, 10:54
par stealth35
non puisque c'est en private, met en public
http://php.net/manual/fr/language.oop5.visibility.php

Re: json_encode($object) qui ne fonctionne pas

Posté : 25 mai 2011, 00:13
par Nours312
t'as regardé du coté des methodes magique ? __invoke() || __sleep() qui pourraient te permettre retourner un tableau que tu construit depuis l’intérieur en lui passant les propriétées "private" que tu souhaites rendre "json_able"

je sais que __sleep() est la methode utilisée lors de l'emploi de serialise($maClass), il faudrait vérifier pour json_encode

@+

Re: json_encode($object) qui ne fonctionne pas

Posté : 25 mai 2011, 09:37
par zeus
t'as regardé du coté des methodes magique ? __invoke() || __sleep() qui pourraient te permettre retourner un tableau que tu construit depuis l’intérieur en lui passant les propriétées "private" que tu souhaites rendre "json_able"

je sais que __sleep() est la methode utilisée lors de l'emploi de serialise($maClass), il faudrait vérifier pour json_encode

@+
Je pensais aussi à ça.
print_r() doit sérialiser automatiquement l'objet, alors que json_encode(), non.
il faudrait alors faire un json_encode(serialize($monObjet))