json_encode($object) qui ne fonctionne pas

VaN
Mammouth du PHP | 1107 Messages

23 mai 2011, 18:11

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 ?

ViPHP
xTG
ViPHP | 7331 Messages

23 mai 2011, 19:36

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 ?

VaN
Mammouth du PHP | 1107 Messages

24 mai 2011, 09:53

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 ?

Eléphant du PHP | 275 Messages

24 mai 2011, 10:06

Non mais, reflechis, toutes tes propriétés sont en private !

VaN
Mammouth du PHP | 1107 Messages

24 mai 2011, 10:41

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 ?

ViPHP
ViPHP | 5462 Messages

24 mai 2011, 10:54

non puisque c'est en private, met en public
http://php.net/manual/fr/language.oop5.visibility.php

Mammouth du PHP | 661 Messages

25 mai 2011, 00:13

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

@+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 mai 2011, 09:37

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))
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer