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

MVC PHP Discussion :

[MVC] Utilisez-vous la méthode init() des contrôleurs d'action ? [Débat]


Sujet :

MVC PHP

  1. #1
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut [MVC] Utilisez-vous la méthode init() des contrôleurs d'action ?
    Salut

    Un débat vient de naître sur les listes de Zend Framework : faut-il utiliser __construct() ou bien init() dans un contrôleur d'action ? Pourquoi l'un plutôt que l'autre ?

    La réponse apportée par la majorité des participants est favorable à init(). Cependant, cette méthode est déclarée avec une visibilité "public", ce qui n'a pas d'intérêt puisqu'elle est systématiquement appelée depuis le contrôleur lui-même.

    Il a donc été suggéré de la rendre protected dans une version ultérieure.

    Si la méthode Zend_Controller_Action::init() devient protected, elle deva être renommée en _init().


    En parallèle, Lars Strojny est intervenu pour déconseiller l'existence d'une méthode init(), argumentant que cette méthode a le même objectif que __construct()...

    Hi Matthew,

    Am Samstag, den 12.07.2008, 14:55 -0400 schrieb Matthew Weier O'Phinney:
    > -- Hector Virgen <djvirgen@gmail.com> wrote
    > (on Saturday, 12 July 2008, 10:41 AM -0700):
    > > If Zend_Form::init() becomes protected, will it be renamed to _init()?
    >
    > Yes -- but such a change will not happen prior to 2.0 at the earliest,
    > if at all.


    I have to admit that I find the wide-spread usage of init()-methods
    quite unfortunate, as they address a bad programming habit. Not calling
    the parent constructor is a bad practice, as it will always break code.
    I totally agree that complicated setup code do not belong in the
    constructor itself, but the init()-methods are not about complicated
    object setups but about allowing the user to forget about
    parent::__construct(). So I would really love to see most of them go
    away in 2.0.

    cu, Lars
    Qu'en dites-vous ?

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Personnellement; je trouve qu'une méthode doit-être utilisée que si elle apporte quelque chose de confortable et un réel +.

    dans le cas du init(), cette méthode apporte-elle quelques choses de plus.

    Si la réponse est non, alors __construct() devrais-être utilisé en priorité.

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ok, prenons le problème par l'autre bout.

    Actullement, la méthode __construct() des contrôleurs est réservée par le framework lui-même. En tant que développeur utilisant le framework, il nous est déconseillé d'utiliser __construct() à cause de sa complexité. Nous avons donc à notre disposition init(), une méthode appelée tout à la fin de __construct(), ce qui revient donc au même.

    Si je définis un contrôleur d'actions My_Controller_Action dérivé de Zend_Controller_Action et qui me sert de base pour tous mes propres contrôleurs d'action, j'utilise la méthode init() comme constructeur.

    Par extension, lorsque je définis un contrôleur d'action final dans mon appli, quelle méthode dois-je utiliser pour personnaliser à nouveau le constructeur ? __construct() n'est plus accessible et init() est déjà utilisé. Dois-je surcharger init() en appelant parent::init() ? En ce cas, pourquoi ne pas le faire avec __construct() ? Par souci d'homogénéité, je pourrais donc déclarer un niveau supplémentaire de constructeur : mettons setup()... Ce qui me donne trois méthodes pour la même opération.

    C'est sans doute cela que Lars voulait mettre en avant.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    En même temps, pour récupérer l'objet ancêtre de __construct et en hériter, tu dois appeler parent::__construct.

    tu ne dois donc pas redéfinir, ni surcharger cette méthode, sauf si tu veux modifier explicitement cette méthode.

    Idem pour init();

  5. #5
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Je me suis souvent demandé pourquoi init() n'était pas une méthode protégée. J'y vois un seul argument, un développeur n'ose pas vraiment surcharger une classe protégée d'un framework. Techniquement parlant, il est plus logique qu'elle soit protégée.

    Utiliser le constructeur ou utiliser une fonction d'initialisation a toujours été un débat dans la programmation orienté objet. J'hésite même à parler de troll.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

Discussions similaires

  1. Quelle méthodes d'analyse des risques utilisez-vous ?
    Par cyberzoide dans le forum Sécurité
    Réponses: 6
    Dernier message: 12/03/2014, 07h49
  2. appel des méthodes init,start?
    Par schwarzy2 dans le forum JBuilder
    Réponses: 7
    Dernier message: 13/06/2007, 08h59
  3. Quels outils utilisez-vous pour créer des diagrammes ?
    Par khayyam90 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 11
    Dernier message: 30/05/2007, 11h56
  4. Réponses: 8
    Dernier message: 10/11/2006, 19h33
  5. Quels frameworks utilisez-vous ? (MVC et autres...)
    Par onlytoine dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 12
    Dernier message: 16/03/2006, 12h24

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