2009-12-15 2 views
25

Question assez simple. En C++, le constructeur parent sera implicitement appelé avant le constructeur enfant, alors quelle est la logique pour que PHP ne fasse pas les choses de cette façon?Pourquoi PHP n'appelle pas automatiquement les constructeurs parents?

EDIT: J'ai une bonne réponse de Lukman, mais j'espérais plus d'une raison pour laquelle il y a une différence. Peut-être que la question devrait être pourquoi C++ ne permet pas l'appel personnalisé des constructeurs parents? Je suppose que c'est une autre question cependant.

+2

Oui, je comprends cela! Je suis sûr qu'il existe des différences dans les langues qui ont influencé la décision d'appeler ou de ne pas appeler le parent - je veux connaître les raisons. – Skilldrick

+8

C'est un peu comme si on disait "Pourquoi les chiens ne se chamaillent pas?": "Parce qu'ils ne sont pas des canards". – Skilldrick

+0

2Skilldrick: ressemble à ceci est la réponse à la question :) – ep3static

Répondre

24

Je pense que c'est une bonne chose que PHP vous fait appeler le constructeur de parent manuellement, car il permet au constructeur de l'enfant, comme suit:

public function __construct() { 
    // set up variables that parent::__construct() requires 
    $var1 = get_stuff_from_db(); 
    $var2 = get_stuff_from_webservice(); 

    parent::__construct($var1, $var2); 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

Ou encore:

public function __construct($param) { 
    // call differently based on condition 
    if (is_array($param)) 
     $param['id'] = 0; 
     parent::__construct($param); 
    } 
    else { 
     parent::__construct($param, 0, TRUE); 
    } 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

Signification, vous êtes libre appeler le constructeur parent n'importe où dans l'enfant et vous êtes libre de faire des choses avant et après l'appel. N'est-ce pas une fonctionnalité en effet?

+0

Notez que vous pouvez facilement appeler le constructeur parent uniquement lorsque le corps du constructeur ne contient pas déjà un appel explicite. – putgeminmouth

+1

Une classe de base qui nécessite une classe enfant pour effectuer l'initialisation avant de pouvoir s'auto-initialiser ...: O Je recommande vivement à quiconque dans ce scénario de reconsidérer la conception de l'application. Là encore, il n'y a pas de limite au facteur kludge potentiel avec PHP. – developerbmw

+0

C'est mauvais parce que le constructeur devrait toujours être appelé quand un objet est instancié. À travers le cycle d'héritage, le type d'objet hérité est instancié et possède un indicateur indiquant que le constructeur ne doit pas être déclenché.Cela casse la règle générale du constructeur et conduit à la confusion (la preuve est dans le PO). D'un autre côté, des langages tels que C# ou C++ permettent l'exécution différée de constructeurs en la demandant implicitement, plutôt que de casser la règle par défaut des constructeurs appelés à l'instanciation. C'est une partie vraiment stupide de PHP et devrait être résolue. – Jimmyt1988

1

pour éviter un couplage serré qui est la raison pour laquelle l'héritage (extension mot-clé en java) est mal et classe d'interface est preferred voir article JavaWorld: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html

encore ce serait bien s'il y avait une instruction pour appeler le parent à un pointer avec un mot-clé spécial comme forward mais je ne l'ai encore jamais vu dans aucune langue (même Rebol) sauf dans une langue inconnue inventée par Paul Allen (ouais le co-fondateur de Microsoft) qui est Openscript.

+0

méthode de parent appelant? beaucoup de langues OOP ont cela. Comme le préfixe 'parent' en PHP,' super() 'en Python,' super' en Java et même en utilisant le nom de la classe parent comme 'BaseClass :: method()' en C++. – Lukman

+0

TOUS LES OOP ont cela qui fait partie de la POO :). Cela ne veut pas dire que vous devriez en abuser. –

+0

L'héritage est-il mauvais? Quelle? Donc, vous dites que le fait qu'un serpent et une girafe soient des animaux, vous ne devriez pas hériter des attributs d'une classe d'animaux, mais plutôt ... quoi? créer une interface qui a une méthode qui indique des pointeurs à un animal? Quelle? Comment est-ce correct? Sheesh. Et ne me mettez pas sur les gens en disant "l'héritage multiple ne devrait pas exister", il y a des cas réels où cela a un sens logique. Ce sont des cas rares, mais ils existent. – Jimmyt1988

7

Lorsque vous n'avez pas de constructeur dans la classe enfant, le parent est automatiquement appelé.

Si vous avez décidé d'ajouter un constructeur à la classe enfant, vous devez bien sûr appeler explicitement le constructeur parent. Si vous prenez déjà le temps d'ajouter un constructeur à votre classe enfant, l'ajout d'une ligne supplémentaire de code parent::__construct(); ne semble pas être une grosse affaire. Mais la priorité est en fait une flexibilité pratique.

+3

PHP est le seul langage que l'on peut appeler un mauvais design "Une flexibilité pratique": D – developerbmw

+1

Vous ne savez pas ce que vous dites ici? Je pense qu'il est vraiment préférable de n'avoir qu'un seul constructeur responsable de l'obtention de l'objet dans un état valide. En mélangeant les constructeurs enfant et parent, je dirais qu'il y a plus à suivre. Ou sinon, ne créez pas un constructeur enfant. Donc, PHP encourage commodément l'utilisation d'un seul constructeur. – prograhammer

+1

@Brett quel genre de mauvais design parlez-vous; soin d'expliquer? – Kyslik

Questions connexes