8791 sujets

Développement web côté serveur, CMS

Bonjour à vous, et merci par avance pour l'intérêt que vous portez à mon message.

Mon problème : Lorsque ma classe fille (Post_manage), instanciée par la classe mère (Post), appelle la fonction add() de la classe mère, je ne parviens pas à récupérer la classe bdd instanciée par le constructeur de la classe mère. Je pense bien que quelque chose m'échappe, pourriez-vous m'éclairer sur ce point ?

Merci par avance.


<?php

class Bdd
{
	public function toto(){
		return 'toto';
	}
}

class Post {
	
	protected $bdd;

	public function __construct()
	{
		$this->bdd = new Bdd();
		$this->manage = new Post_manage;

		echo $this->bdd->toto();
		// Affiche : toto
	}

	public function add() {

		echo $this->bdd->toto();
		// ici $this->bdd n'existe plus quand il est appelé par la classe fille ?
	}
}

class Post_manage extends Post {

	public function __construct() {
		$this->actions();
	}

	public function actions() {
		
		// appelle de la fonction de la classe "mère".
		$this->add();
	}
}


$post = new Post();

?>
Je ne suis pas sûr que le constructeur de la classe mère soit automatiquement appelé dans la classe fille en php, contrairement à Java et la plupart des autres langages OO. Essaie d'ajouter parent::__construct(); au début du constructeur de la classe fille pour voir.
Je confirme les dires de QuentinC, le problème vient bien de là. En PHP tu dois explicitement appeler le constructeur de la classe mère dans le constructeur de la classe fille.

Je me permet juste un petit conseil de conception indépendant de ton problème. Tu devrais faire usage de l'injection de dépendance pour la gestion des dépendances de ta classe mère (Bdd et Post_manage).
Plutôt que d'instancier ces deux objets dans le constructeur de ta classe Post il est préférable de les instancier indépendamment et de les passer ensuite en paramètre au constructeur de ta classe Post. Cela permet de réutiliser une même instance de ta base de donnée dans d'autres classes par exemple.

Tu as une bonne explication du concept sur le site du zéro : http://fr.openclassrooms.com/informatique/cours/introduction-a-l-injection-de-dependances-en-php/qu-est-ce-que-l-injection-de-dependances

Ce qui donne quelque chose comme ça :
$bdd = new Bdd();
$manage = new Post_manage();
$post = new Post($bdd, $manage);

class Post {
	
	protected $bdd;

	protected $manage;

	public function __construct(Bdd $bdd, Post_manage $manage)
	{
		$this->bdd = $bdd;
		$this->manage = $manage;
	}
}