2017-04-24 1 views
0

J'ai 2 classes qui étendent toutes deux une classe abstraite. Les deux classes ont une méthode privée appelée "content" qui est un tableau d'éléments de l'autre classe. Une fois que j'ajouter un objet B dans le tableau de la classe IA besoin d'obtenir l'objet parent A de l'objet élément « contenu » B. Voici l'exemple, il est plus facile de le regarder:Obtient un objet de niveau supérieur à partir de la matrice d'objets Elément

<?php 
 

 
abstract class heroes { 
 
    private $tag; 
 
    private $content = array(); 
 
    
 
    function __construct($tag) { 
 
     $this->tag = $tag; 
 
    } 
 
    
 
    public function getContents() { 
 
     return $this->content; 
 
    } 
 
    
 
    protected function addContent($obj) { 
 
     $this->content[] = $obj; 
 
     return $obj; 
 
    } 
 

 
} 
 

 
final class batman extends heroes { 
 

 
    public function addPartner() { 
 
     return $this->addContent(new robin()); 
 
    } 
 
} 
 

 
final class robin extends heroes { 
 

 
    private $capes; 
 
    
 
    public function dieAtFirstFight() { 
 
     return BATMAN OBJ??? 
 
    } 
 
    
 
} 
 

 
$batman = new batman(); 
 
$batman = $batman->addPartner()->dieAtFirstFight(); 
 

 
?>
J'ai essayé dans la classe abstraite d'ajouter une méthode privée appelée $ father dans laquelle chaque fois que j'ajoute un partenaire, je mets $ self (qui est l'objet Batman) mais dans le journal des erreurs php, j'obtiens l'erreur "Object of class Batman n'a pas pu être converti en chaîne "

+0

Que diriez-vous d'ajouter un champ « partenaire » à Heros après tout, il est commun à tous les heros non? – Vini

Répondre

1

Vous devez utiliser" $ t son "pour ajouter le père. Il n'y a pas $ self en php.

<?php 
 

 
abstract class heroes { 
 
    private $tag; 
 
    private $content = array(); 
 
    protected $father; 
 
    
 
    function __construct($tag) { 
 
     $this->tag = $tag; 
 
    } 
 
    
 
    public function getContents() { 
 
     return $this->content; 
 
    } 
 
    
 
    protected function addContent($obj) { 
 
     $this->content[] = $obj; 
 
     $obj->setFather($this); 
 
     return $obj; 
 
    } 
 
    
 
    protected function setFather($father) { 
 
     $this->father = $father; 
 
    } 
 

 
} 
 

 
final class batman extends heroes { 
 

 
    public function addPartner() { 
 
     return $this->addContent(new robin('tag')); 
 
    } 
 
} 
 

 
final class robin extends heroes { 
 

 
    private $capes; 
 
    
 
    public function dieAtFirstFight() { 
 
     return $this->father; 
 
    } 
 
    
 
} 
 

 
$batman = new batman('tag'); 
 
$batman = $batman->addPartner()->dieAtFirstFight(); 
 

 
?>

+0

Merci Meffen, j'ai fait une erreur dans ma réponse, en fait j'ai utilisé $ this au lieu de $ self mais l'erreur n'était pas celle-là mais le "protected" dans la déclaration $ father. Si le père était privé a généré l'erreur, avec protégé tout s'est bien passé. Est-ce que tu sais pourquoi? – prelite