yep all , ca fait un moment que je n'ai plus posté ^^
Bon voila , j'ai fais qqls petites recherches sur un problèmes auquel je tiens absolument à avoir une solution et surtout la comprendre .
Je me suis lancé récemment dans la programation objet ( POO pour les intimes ) sous php . Etant habitué ( c'est un grand mot .. , j'en ai oublié quasi tout les notions ) sous java , j'ai l'habitude de faire dans mes class , plusieurs constructeurs avec un nombre d'attributs différent pour chacun .
class ma_classe
{
public ma_classe(var)
{
}
public ma_classe(var1,var2)
{
}
}
En gros ceci .
Malheureusement , sur php5 deux fonctions du même nom , php5 n'en veut pas . Je cherche donc une alternative à cela .
Une légère esquisse de la solution comme je l'ai fait ici m'aiderait .
Je pensais passer par l'héritage , mais je nage ^^
__________________________
[RRP4J]
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne et personne ne sait pourquoi...
salut ReaM...
tout d'abord, moi aussi c'est un peu mon come-back (j'ai pas pu venir de tout l'été )
bon, pour ton pb, je ne sais plus si PHP5 permet la surcharge de constructeur (à mon avis, non mais bon). COmme je peux pas tester (on est en PHP4 à la Fac), je te donne ma "solution" sans être sur du résultat:
Tout d'abord le constructeur en PHP5 a le nom __construct (avec 2 underscores) et non le même que celui de la classe!
Essaye donc de cette manière pour voir ce que ca donne...
Et tiens nous au courant
__________________________ FAQ PHP
Oui je suis au courant de ca , __construct() et _destruct() et les constructeurs surchargés php n'en veut pas , ce qui est bien dommage ( c'est mon avis ^^ ) .
L'exemple de code que j'ai mis au dessus se rapporte à ce que j'ai vu en java ;) .
Sinon en php5 tu peux tjs utilisé une fonction constructeur qui a le même nom que la class , je l'ai lu dans une faq , surement pour un soucis de compatibilié avec d'anciens scripts fait pour php4 .
Mais le hic c'est qu'on ne peut pas avoir deux fois ( ou plusieurs fois ) une function avec le même nom :/
__________________________
[RRP4J]
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne et personne ne sait pourquoi...
Alors, en fait pour faire ce que tu veux, en php tu n'as pas besoin de faire de surcharge.
Tu fais un seul constructeur qui va tout gérer.
Si c'est possible, c'est parce que le php n'ai pas typé, et donc (1) le constructeur est moins strict sur ce qu'il reçois.
En plus, (2)tu peux définir dans une fonction des paramètres optionnels, qui ne seront donc pas obligatoirement fournis lors de l'appel de la fonction.
Et troisiemement, il y a en php un moyen de récupérer l'ensemble des arguments qui ont été fourni à une fonction, sans que la fonction de précise qu'elle doit recevoir des arguments. (en gros tu déclare un fonction sans rien dans les parenthèses, et après tu récupères les arguments qui ont été fourni d'une autre manière)
Ces trois remarques font qu'il y a à mon avi deux solutions pour faire une classe "multi-constructeurs"
Premièrement :
Tu défini ton constructeur avec des paramètres optionnels. Tu traite après les données en fonctions des paramètres que tu reçois.
Exemple :
Comme tu peux le voir, tu peux définir la valeur que tu veux par defaut.
Par contre, ca peut être embetant cette solution si tu veux envoyer le parametre 1, le 4 mais pas le 2 et 3 par exemple.
Dans ce cas tu serait obligé d'envoyer les valeurs par defaut.... tu les connais pas toujours (enfin c chiant d'aller les rechercher).
Donc pour éviter ce problème, tu peux faire une fonction a laquelle tu envois les parametres comme tu veux. Mais après, faut pouvoir retrouver dans la fonction quel parametre est quoi. Donc a utiliser si tu peut differencier les differents parametres par leur type par exemple. (bien que php soit pas rigoureux sur les type, ceux-ci existent et on peut les utiliser).
exemple :
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}