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 :

Chainage à partir du constructeur [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Chainage à partir du constructeur
    Bonjour,

    Je souhaite simplement écrire :
    Mais j'obtiens une erreur d'analyse :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Parse error: parse error

    Est-ce normal ?

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Hum... franchement, je me rappelle pas avoir déjà essayé... Ce genre de syntaxe implique que tu crées une instance de ton objet mais que tu ne la gardes nulle part. Donc ça me parait logique que ton script râle : à quoi ça sert de faire des instances si on n'en fait rien ?

    Si l'instance ne t'intéresse pas, ta méthode devrait sans doute être statique et appelée par ::
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Celira Voir le message
    Hum... franchement, je me rappelle pas avoir déjà essayé... Ce genre de syntaxe implique que tu crées une instance de ton objet mais que tu ne la gardes nulle part. Donc ça me parait logique que ton script râle : à quoi ça sert de faire des instances si on n'en fait rien ?

    Si l'instance ne t'intéresse pas, ta méthode devrait sans doute être statique et appelée par ::
    Si l'instance m'intéresse mais juste pour appeler une fonction. Actuellement je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bar = new Bar ();
    $bar->foo ();
    C'est un peu ce que l'on retrouve dans zend framework :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $application->bootstrap()
                ->run();
    Sauf que je veux le faire en partant du constructeur, ce qui devrait être possible puisqu'il retourne bien un objet, mais je pense que ça n'a pas été prévu par l'analyseur donc peut être un bug à reporter ?

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Si l'instance m'intéresse mais juste pour appeler une fonction. Actuellement je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bar = new Bar ();
    $bar->foo ();
    Si tu ne crées $bar QUE pour appeler la fonction et que tu ne t'en ressers pas après, c'est que l'instance ne t'intéresse pas... Auquel cas il faut utiliser une fonction statique.
    Par contre, si tu t'en ressers après (pour autre chose qu'appeler cette même fonction) faut ben que tu la stocke quelque part et donc que tu fasses la manœuvre en deux étapes.

    Enfin je suppose que ça dépend de ta fonction...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Celira Voir le message
    Si tu ne crées $bar QUE pour appeler la fonction et que tu ne t'en ressers pas après, c'est que l'instance ne t'intéresse pas... Auquel cas il faut utiliser une fonction statique.
    Par contre, si tu t'en ressers après (pour autre chose qu'appeler cette même fonction) faut ben que tu la stocke quelque part et donc que tu fasses la manœuvre en deux étapes.
    Mais si je veux mon instance

    Concrètement c'est une classe qui génère un PDF, j'ai juste besoin de l'afficher à l'écran, il semble logique de n'avoir qu'à appeler la fonction d'affichage, ensuite c'est l'objet qui sait comment il doit s'afficher :
    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
    class MyPDF extends PDF
    {
      public function __construct ()
      {
        parent::__construct ('P', 'mm', 'A4');
        [...]
      }
     
      public function Content ()
      {
      }
     
      public function Output ()
      {
        $this->addPage ();
        $this->Content ();
        parent::Output ();
      }
    }
     
    new MyPDF ()->Output ();
    Après si je veux faire d'autres choses rien ne m'empêche de chainer le tous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new MyPDF ()->setTitle ('Mon PDF')
                ->setData ($data)
                ->Output ();
    Bref, ma question ne porte pas sur la conception de mon code mais sur l'erreur d'analyse qui ne me semble pas justifiée. Est ce voulu ? Est ce normal ? Ou est ce un bug ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Perso ça me parait logique.

    Tu crée ton instance puis tu l'utilises. Tu ne peux pas faire les deux en une opération.
    Y'a des langages qui permettent ce genre de choses ?

    Le chaînage des méthodes après la création de l'instance est envisageable si les méthodes sont définies pour être chaînées.
    Pourfendeur de singletons en croisade

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Y'a des langages qui permettent ce genre de choses ?
    Je n'ai pas testé mais c'est certainement le cas d'un grand nombre de langages OO : java, C#, C++, ...

    Citation Envoyé par Petibidon Voir le message
    Le chaînage des méthodes après la création de l'instance est envisageable si les méthodes sont définies pour être chaînées.
    Oui, bien sûr, il faut que la méthode renvoie une instance de l'objet, mais c'est justement le cas du constructeur :/

    Par exemple, il est possible de faire :


  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Après avoir tourné-viré dans la doc php, j'ai trouvé ça :
    Pour créer une instance d'une classe, un nouvel objet doit être créé et assigné à une variable. Un objet doit toujours être assigné lors de la création d'un nouvel objet à moins qu'il ait un constructeur défini qui lance une exception en cas d'erreur. Les classes doivent être définies avant l'instanciation (dans certains cas, c'est impératif).
    Donc c'est étudié pour...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Celira Voir le message
    Donc c'est étudié pour...
    Bon bah dans ce cas je vais mis plier, Merci

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Après un petit test, java permet ce genre de chose.

    J'en reste pantois. Bouleversé. Choqué.

    C'est tout de même relativement étrange comme manière de faire les choses. Enfin à mon gout
    Pourfendeur de singletons en croisade

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/06/2011, 07h29
  2. Réponses: 1
    Dernier message: 16/12/2010, 13h33
  3. Constructeur classe dérivée à partir d'objets parents
    Par Zavonen dans le forum Général Python
    Réponses: 16
    Dernier message: 06/04/2009, 20h09
  4. Appel d'un constructeur à partir d'un autre
    Par Pragmateek dans le forum Langage
    Réponses: 28
    Dernier message: 18/06/2006, 01h07

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