|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Estéban MougnaudÉtudiant Inscription : décembre 2011 Messages : 29 ![]() |
Bonjour,
Je cherche à utiliser plusieurs constructeurs dans la même classe. J'ai réussi à l'aide de Switch et de la fonction func_get_arg(). Cependant, mon maître de stage n'approuve pas cette méthode (selon lui, le code ne serait pas en objet pur et le code ne serait pas réutilisable facilement) et me demande de le faire à l'aide de tableaux mais je ne vois pas du tout comment faire Merci d'avance pour votre aide. |
|
00
|
|
|
#2 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Il n'a pas totalement tor mais je pense que c'est toi qui a raison, si tu veux réélement avoir plusieurs prototypes disponibles pour un constructeur, il vaut mieux utiliser func_get_args.
Enfin bref, ce que tu peux faire sinon (et qui est largement pratiqué dans certains frameworks comme Symphony pour les helpers de vue) c'est d'injecter un tableau, comme il le préconise, ça donne effectivement encore plus de souplesse. Voici concrêtement à quoi ça peut ressembler: Code :
Code :
L'inconvénient majeur de ces deux formes est qu'on ne bénéficie plus du type hinting, c'est donc au constructeur de valider les données qu'il reçoit au niveau de leur typage... pas très pratique. De plus, on peut passer des arguments arbitraires complétement inutiles ou pire.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
10
|
|
|
#3 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 811 ![]() |
C'est même moins bon je trouve car il faut aussi vérifier les index correspondant à des variables privé dont on ne doit pas modifier la valeur.
Par contre pourriez-vous détailler le pourquoi pour func_get_args() ?
__________________
|
|
|
00
|
|
|
#4 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Estéban MougnaudÉtudiant Inscription : décembre 2011 Messages : 29 ![]() |
Bonjour et merci pour les réponse
![]() @Benjamin Delespierre Je ne comprend pas très bien désolé (je suis dans la prog objet depuis peu) mais par exemple que peut on mettre dans $param si on en a plusieurs ? Et je ne comprend pas le $params += $defaults; @transgohan Si ta question est "Pourquoi il ne veut pas de la fonction ?" C'est apparemment parce que le code doit être réutilisable. |
|
00
|
|
|
#6 | |||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
L'utilisation de l'opérateur + sur des tableaux à pour conséquence d'ajouter au premier les valeurs du second dont les clés ne sont pas présentes dans le premier. Dans notre cas, ça va mettre les valeurs par défaut (définies dans $defaults) là dans $params si ces valeurs n'ont pas étés spécifiées. Un exemple vaut mieux qu'un long discours: Code :
Code :
Pour la petite histoire, quand on veut explicitement écraser les valeurs existantes, on utilise array_merge.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||||
|
00
|
|
|
#7 |
|
Invité régulier
![]() Estéban MougnaudÉtudiant Inscription : décembre 2011 Messages : 29 ![]() |
Mais pourquoi $b a 'int (2)' ?
Désolé mais je souhaite vraiment comprendre à fond |
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Parce que un var_dump affiche des résultat sous la forme
|
|
00
|
|
|
#9 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Quand la clé est présente dans le coté gauche, elle n'est pas écrasée par celle du coté droit tout simplement.
Si on voulait reproduire le comportement de l'opérateur + sur des tableaux de façon programmatique on ferait: Code :
non ? Tout est expliqué ici: http://www.php.net/manual/fr/languag...tors.array.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
20
|
|
|
#10 |
|
Invité régulier
![]() Estéban MougnaudÉtudiant Inscription : décembre 2011 Messages : 29 ![]() |
Ah d'accord
Je te remercie amplement Benjamin pour tes réponses et merci d'avoir pris le temps de m'expliquer
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 811 ![]() |
Je me permet de continuer un peu la discussion pour ma culture personnelle.
C'était bien entendu "en quoi c'est mal", mais je ne vois pas pourquoi utiliser cette fonction donnerai du code non réutilisable ? Car justement j'ai tendance à l'utiliser, je trouve cela plus propre à écrire que d'utiliser un tableau. :/
__________________
|
|
|
00
|
|
|
#12 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Je pense qu'il voulait plus dire "générique" que "réutilisable". Car oui, des signatures "dynamiques" de fonctions offrent beaucoup plus de flexibilité au détriment de la sécurité.
Par exemple: Code :
Pour avoir un comportement équivalent avec une signature générique, il faut ajouter pas mal de code, effectuer le type hinting à la main (instanceof et is_*) et ajouter les valeurs par défaut nous même. Qu'on décide d'utiliser des tableaux ou de jouer avec func_get_args.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#13 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 811 ![]() |
C'est bien ce qu'il me semblait.
Par contre je viens d'apprendre qu'on pouvait typer les variables dans un prototype en PHP.
__________________
|
|
|
00
|
|
|
#14 | |||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 726 ![]() |
Citation:
Cependant, ce "typage" s'arrête uniquement aux Objets et aux tableaux, et donc rien encore au niveau des integer, booléen, etc ... Ceci dit, rien n'empêche de le faire, d'imposer les autres types. Exemple simple : Code :
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|||
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 811 ![]() |
Ah bah si seulement les objets sont pris en compte en effet il reste de l'évolution à attendre...
Je continuerai à faire mes tests de type renvoyant des exceptions.
__________________
|
|
|
00
|
|
|
#16 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Allez voir par ici pour plus de détails: http://php.net/manual/en/book.spl-types.php Citation:
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
00
|
|
|
#17 |
|
Expert Confirmé
![]() ![]() |
Pour ceux qui seraient intéressés par le sujet : il faut regarder du côté de l'autoboxing:
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
10
|
|
|
#18 | |||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 726 ![]() |
Citation:
Je sais qu'on ne peux pas instancier une interface, faut créer une classe dérivée pour ça. Cette démo serait (peut être) pour dire qu'on peut quand même créer une fonction (ou méthode de classe, peu importe) qui attendrait une interface en paramètre. Ensuite, en pratique on passera l'Objet dérivée de cette interface. Est-ce cela ? Cet exemple plus simple serait il correcte ? Code :
Grosso modo : A partir du moment ou l'Objet passé en paramètre est un dérivée de celui déclaré, ça passera. Et quelque soit la profondeur aussi ? C'est a dire : admettons une classe A, puis une classe B dérivée de A, puis une classe C dérivée de B. Je déclare dans la fonction le type d'Objet -> A, et je passe en paramètre un Objet C. Ca marcherait ça ? J'ai tendance à dire qu'il ne faudrait pas. Mais ??? (sans vraiment d'explications). (vous allez dire qu'il suffit d'essayer
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|||||
|
|
00
|
|
|
#19 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Vu que mon exemple n'était effectivement pas bien parlant, en voici un autre: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
00
|
|
|
#20 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 726 ![]() |
Citation:
![]() Je plaisante Merci pour ces compléments d'infos et démos ![]() J'avais de gros aprioris à ce niveau en tout cas, je ne pensais pas qu'on pouvait déclarer le parent, voir en deçà. Ou alors si je l'ai fais, je m'en suis même pas rendu compte. Ceci dit, j'imagine qu'on peu aussi tomber dans la simplicité, c'est à dire qu'au final obtenir un "typage" pas si restrictif que ça si on crée à chaque fois une interface, on dérive un peu tout, et puis ... Histoire d'éviter de se faire "taper sur les doigts", nous dire que le type ne serait pas le bon. Mais bon ... J'aurais bien aimé des types integer, bool, float, et compagnie, et ça nativement (sans PECL), car finalement, même pour les Objets ou tableaux, Php ne l'impose pas. Je me dis que ça devrait venir un jour (Php 6 peut être). Merci encore.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com