propriétés privées d'un objet contenu dans un tableau

Petit nouveau ! | 3 Messages

28 janv. 2014, 20:10

Bonjour,

Je débute en POO, et je bute sur la récupération des propriétés privées d'un objet contenu dans un tableau.
Voici un extrait du var_dump du tableau ($last_visas) en question :

Code : Tout sélectionner

4331 => array 0 => object(CdtVisa)[9] private 'id_visa' => string '1' (length=1) private 'type' => string 'DIR' (length=3) private 'id_pers' => string '1' (length=1) private 'date' => string '2006-01-02 12:12:12' (length=19) private 'id_prof' => string '4331' (length=4) private 'code_structure' => string '3 1' (length=3) private 'id_groupe' => string '0' (length=1) private 'last_id_ctexte' => string '3' (length=1) private 'activation' => string '1' (length=1)
J'ai besoin d'afficher la propriété 'date'.
Si je mets le code suivant :
echo $last_visas[4331][0]->date;
J'obtiens le message d'erreur suivant : Cannot access private property CdtVisa::$date

Si je change la visibilité de la propriété $date dans la classe CdtVisa de private à public, j'ai un affichage correct de la valeur de l'attribut ('2006-01-02 12:12:12'). Mais je veux conserver la visibilité private

Dans la classe CdtVisa, j'ai un getter défini ainsi :
public function date()
	{
		return $this->date;
	}
Donc je pensais pouvoir faire un
echo $last_visas[4331][0]->date();
J'obtiens le message d'erreur suivant : Call to a member function date() on a non-object
Je ne comprends pas... $last_visas[4331][0] est bien un objet d'après le var_dump..., mais on ne peut pas accéder à ses propriétés privées, même en passant par le getter...

Qu'est-ce qui ne va pas ?

ViPHP
xTG
ViPHP | 7331 Messages

28 janv. 2014, 20:43

Et ainsi ?
$objet = $last_visas[4331][0];
echo $objet->date();

Petit nouveau ! | 3 Messages

28 janv. 2014, 22:09

En fait, j'ai voulu simplifier mon explication, mais la clé '4331' n'est pas en dur dans le code qui pose problème :

si je fais :
echo $last_visas[4331][0]->date();
C'est OK, pas d'erreur.

Le problème est que la clé "4331" n'est pas utilisée en dur, mais récupérée à partir d'un tableau $prof dont la var_dump est :

Code : Tout sélectionner

array 'id_individu' => string '4331' (length=4) 'civilite' => string 'M.' (length=2) 'prenom' => string 'Sylvain' (length=7) 'nom' => string 'GOD' (length=5)
et le code qui produit une erreur (Call to a member function date() on a non-object) est le suivant :
foreach ($liste_profs as $prof) {
echo $last_visas[$prof['id_individu']][0]->date();
}
le tableau $liste_profs est un tableau ayant pour éléments des tableaux $profs comme présenté plus haut.
Je pense donc que la clé ne référence pas bien l'objet.
Que faut-il faire pour que
$last_visas[$prof['id_individu']][0]->date();
ait le même effet que
$last_visas[4331][0]->date(); 
(lorsque $prof['id_individu'] vaut 4331 dans la boucle évidemment) ?

ViPHP
xTG
ViPHP | 7331 Messages

29 janv. 2014, 08:32

Déjà tentes nous cela :
foreach ($liste_profs as $prof) {
echo $prof['id_individu'];
var_dump($last_visas[$prof['id_individu']]);
echo $last_visas[$prof['id_individu']][0]->date();
}
Car moi je pressent la mauvaise valeur arriver. ;)

Petit nouveau ! | 3 Messages

29 janv. 2014, 16:31

Merci pour l'indication !

Avec :
foreach ($liste_profs as $prof) {
echo $prof['id_individu'];
var_dump($last_visas[$prof['id_individu']]);
echo $last_visas[$prof['id_individu']][0]->date();
}
J'obtiens l’affichage suivant :

Pour le 1er echo :
35760 (c'est la valeur de $prof['id_individu'])

Pour le var_dump :
array
empty => C'est un tableau vide !

Puis pour le 2ème echo : Fatal error: Call to a member function date() on a non-object...... avec la référence de la ligne echo $last_visas[$prof['id_individu']][0]->date();

Logique ! Je n'avais pas réalisé que mon tableau d'objets $last_visas contenait des éléments vides, alors la première boucle qui tombe sur élément vide (= pas d'objet !) me donne un Fatal error: Call to a member function date() on a non-object et le script s'arrête.

Si je code ainsi :
foreach ($liste_profs as $prof) {
	echo $prof['id_individu'];
	var_dump($last_visas[$prof['id_individu']]);
	if (!empty($last_visas[$prof['id_individu']])) {
		echo $last_visas[$prof['id_individu']][0]->date();
	}
}
ça fonctionne bien (pas d'erreur), il m'affiche "2006-01-02 12:12:12" comme prévu lorsque la boucle tombe sur un élément non vide (lorsque $prof['id_individu'] vaut 4331), et rien pour les éléments vides.

Par contre, pour améliorer mon test, je voudrais vérifier que non seulement l'élément n'est pas vide, mais aussi que c'est bien un objet (je remplace le test !empty par is_object) :
if (is_object($last_visas[$prof['id_individu']][0])) {
		echo $last_visas[$prof['id_individu']][0]->date();
	}
Et là aussi, ça fonctionne bien comme prévu.

Merci pour ton aide xTG !