Bonjour,
Je souhaite simplement écrire :
Mais j'obtiens une erreur d'analyse :Code:new Bar ()->foo ();
Code:Parse error: parse error
Est-ce normal ?
Version imprimable
Bonjour,
Je souhaite simplement écrire :
Mais j'obtiens une erreur d'analyse :Code:new Bar ()->foo ();
Code:Parse error: parse error
Est-ce normal ?
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 ? :roll:
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 :
C'est un peu ce que l'on retrouve dans zend framework :Code:
1
2 $bar = new Bar (); $bar->foo ();
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 ?Code:
1
2 $application->bootstrap() ->run();
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...
Mais si je veux mon instance :furieux:
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 :
Après si je veux faire d'autres choses rien ne m'empêche de chainer le tous :Code:
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 ();
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 ?Code:
1
2
3 new MyPDF ()->setTitle ('Mon PDF') ->setData ($data) ->Output ();
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.
Je n'ai pas testé mais c'est certainement le cas d'un grand nombre de langages OO : java, C#, C++, ...
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 :
Code:var_dump (new Bar ());
Après avoir tourné-viré dans la doc php, j'ai trouvé ça :
Donc c'est étudié pour...Citation:
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).
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 :D