afficher une propriété d'un objet dans un objet

Petit nouveau ! | 3 Messages

15 mai 2012, 11:46

Bon c'est encore une fois cette *%$£&! d'erreur "Object of class xyz could not be converted to string". Si quelqu'un peut me donner une explication clair sur mon problème :
j'ai une classe A dont l'une des propriétés disons "personne" est un objet de classe B qui contient deux proriété "nom" et "prenom":

Code : Tout sélectionner

class A { function __contruct($n='',$p='') { $this->personne = new B($n,$p); } } class B { function __construct($n='',$p=''){ $this->nom = "$n"; $this->prenom = "$p"; } }
Et donc, Je veux afficher le nom et le prenom avec un code qui ressemble à ça (qui provoque l'erreur)

Code : Tout sélectionner

$a = new A('moi','remoi') echo "nom: $a->personne->nom , prenom: $a->personne->prenom";
Et bien sûr (????) ça ne fonctionne pas:
Catchable fatal error: Object of class B could not be converted to string

Je n'arrive même pas à comprendre dans cette phrase ce qui ne peut pas être converti !!!

ViPHP
xTG
ViPHP | 7331 Messages

15 mai 2012, 11:51

Bah déjà quand tu ne définis pas les propriétés manuellement dans la définition de la class il te les créés en private. Donc inaccessible de l'extérieur.
Donc jamais tu ne pourras afficher le nom et le prénom ainsi.

Ensuite je serai tenté de sortir tout ça de la chaîne de caractère pour être sûr que PHP interprète bien comme on le veut la succession de propriétés.
echo 'nom: ' . $a->personne->nom . ' , prenom: ' . $a->personne->prenom;

Eléphant du PHP | 127 Messages

15 mai 2012, 12:17

En complément de la réponse d'xTG, tu as également la méthode __toString() qui permet de renvoyer la représentation textuelle d'un objet :
class A {
  public $personne;
  function __contruct($n='',$p='') {
    $this->personne = new B($n,$p);
  }
}

class B {
  function __construct($n='',$p=''){
    $this->nom = $n;
    $this->prenom = $p;
  }
  public function __toString() {
     return 'nom : ' . $this -> nom . ', prenom : ' . $this -> prenom;
  }
}
Appel :
$a = new A('moi','remoi')
echo $a -> personne;

kny
Eléphanteau du PHP | 47 Messages

30 mai 2012, 15:38

Je rajouterai également qu'il peux être prudent d'utiliser des getters...
class A {
  private $personne = null;
  function __contruct($n='',$p='') {
    $this->personne = new B($n,$p);
  }
}

class B {
  private $nom = null;
  private $prenom = null;
  function __construct($n='',$p=''){
    $this->nom = $n;
    $this->prenom = $p;
  }
  public function get_Name () {
    return $this->$prenom;
  }
  public function get_Surname () {
    return $this->$nom;
  }
  public function get_Identity () {
    return $this->prenom . ' ' . $this->nom ;
  }
  public function __toString() {
     return 'nom : ' . $this -> nom . ', prenom : ' . $this -> prenom;

Eléphant du PHP | 127 Messages

30 mai 2012, 15:52

Oui tu peux bien sûr utiliser des getters/setters, c'était surtout pour condenser le code. Si tu les utilises, il faut les utiliser partout :
class A {
  private $personne = null;
  function __contruct($n='',$p='') {
    $this->personne = new B($n,$p);
  }
}

class B {
  private $nom = null;
  private $prenom = null;
  function __construct($n='',$p=''){
    $this->nom = $n;
    $this->prenom = $p;
  }
  public function get_Name () {
    return $this->$prenom;
  }
  public function get_Surname () {
    return $this->$nom;
  }
  public function get_Identity () {
    return $this -> get_Surname() . ' ' . $this -> get_Name();
  }
  public function __toString() {
     return 'nom : ' . $this -> get_Surname() . ', prenom : ' . $this -> get_Name();

kny
Eléphanteau du PHP | 47 Messages

30 mai 2012, 15:54

De la même manière je condensais le code, ou tout du moins donnait des idées de getters, effectivement, autant les réutiliser ensuite :)