IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

POO - Forcer l’implémentation d'une fonction d'une classe enfant


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de Wirbelwind
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 47
    Points : 109
    Points
    109
    Par défaut POO - Forcer l’implémentation d'une fonction d'une classe enfant
    Salut à tous !

    Alors voilà, je suis un peu bloqué sur mon code ...
    Ai-je oublié quelque-chose ? Ou mon cerveau est-il simplement en manque de café ? Mystère...

    En fait j’aimerais obliger l’implémentation d'une fonction dans une classe enfant, or ce n'est pas si simple.

    Voici mon code :
    il faut à tout prix que ces trois classes persistent, la suite plus bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    interface MainController
    {
    	public function __construct();
    }
     
     
    abstract class AppController implements MainController
    {
     
    	protected $variable;
     
     
    	public function __construct()
    	{
    		$this->variable = 'HelloWorld!';
     
    		/*
    		Du code ...
    		 */
     
    		echo 'AppController::__construct<br>';
    	}
     
     
    	abstract function index(); 
    }
     
     
    class Dashboard extends AppController
    {
     
    	public function uhuh__construct()
    	{
    		parent::__construct();
     
    		/*
    		Du code ...
    		 */
     
    		echo 'Dashboard::__construct<br>';
    	}
     
    	public function index()
    	{
    		echo 'index: ' . $this->variable . '<br>';
     
    	}
     
    }
     
     
    $dashboard = new Dashboard();
     
    $dashboard->index();

    J'aimerais donc forcer l’implémentation du constructeur de la classe "Dashboard", or vu que cette dernière
    hérite de "AppController" qui possède déjà un constructeur, cela n'a aucune effet.

    De plus, je ne peux déclarer "AppController" en interface vu qu'elle possède du code.


    Voilà, merci à tous pour votre aide si précieuse !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    bonjour,

    attention une interface ne comporte pas de constructeur et ne peut en aucun cas en déclarer.le constructeur est propre à une classe.

    si la redéfinition ou la réécriture du constructeur de Dashboard n'est jamais appelé c'est parce que tu ne le défini pas (mot clé __construct) .

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class Dashboard extends AppController
    {
     
    	public function __construct()
    	{
    		parent::__construct();
     
    		/*
    		Du code ...
    		 */
     
    		echo 'Dashboard::__construct<br>';
    	}
     
    	public function index()
    	{
    		echo 'index: ' . $this->variable . '<br>';
     
    	}
     
    }

  3. #3
    Membre régulier Avatar de Wirbelwind
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 47
    Points : 109
    Points
    109
    Par défaut
    D'accord, merci pour votre réponse.

    L'interface avec un constructeur à pourtant l'air de fonctionner
    Donc en clair , impossible de forcer l'implémentation d'un constructeur ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    L'interface avec un constructeur à pourtant l'air de fonctionner
    il ne faut pas perdre de vue que le constructeur est une méthode comme une autre. A la différence des autres méthodes dont l'appel s'effectue sur une instance , le constructeur par contre est implicitement appelé chaque fois qu'une instance est crée c-a-d en faisant new LaClasse() le construteur est appelé sans qu'on est besoin de l'appeler explicitement par son nom.son rôle est d'initialiser les données membres(attributs, méthodes).
    au final un constructeur déclaré dans une interface est perçue par le moteur de php comme une quelconque méthode mais ne joue pas le rôle qui lui est dévolue d'habitude celui d'initialiser les attributs et les méthodes.

    Donc en clair , impossible de forcer l'implémentation d'un constructeur ?
    par contre, tu peux redefinir le constructeur Dashboard c-a-d le réécrire tout simplement en définissant le constrcteur par le mot clé __construct() et non uhuh__construct() qui n'est pas un constructeur et php le considère comme une méthode qu'il faut appeler explicitement $instance->uhuh__construct() d'où ton erreur.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    interface MainController
    {
     
    }
     
     
    abstract class AppController implements MainController
    {
     
    	protected $variable;
     
     
    	public function __construct()
    	{
    		$this->variable = 'HelloWorld!';
     
    		/*
    		Du code ...
    		 */
     
    		echo 'AppController::__construct<br>';
    	}
     
     
    	abstract function index(); 
    }
     
     
    class Dashboard extends AppController
    {
     
    	public function __construct()
    	{
    		parent::__construct();
     
    		/*
    		Du code ...
    		 */
     
    		echo 'Dashboard::__construct<br>';
    	}
     
    	public function index()
    	{
    		echo 'index: ' . $this->variable . '<br>';
     
    	}
     
    }
     
     
    $dashboard = new Dashboard();
     
    $dashboard->index();

    dans le cas précis, l'usage de l'interface n'est pas pertinent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 8
    Dernier message: 10/01/2007, 21h10
  3. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14
  4. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo