Problème avec le constructeur

Eléphant du PHP | 52 Messages

21 avr. 2007, 15:57

Bonjour tout le monde,:D

j'ai une classe qui doit comprendre deux constructeurs, avec et sans paramètres. J'ai fait ça comme suit :

class MyClass
{
     public $att ;
    
     public function MyClass($att)
     {
          $this->att = $att ;
     }
   
     public function __construct(){}

    public function  fnctTest()
   {
        //code
   }
}

J'ai un script qui appelle cette classe ,
require("MyClass.php") ;
$myclass = new MyClass("test");
$myclass->fnctTest() ;
Mon problème est que ce dernier script ne donne pas de résultat.
SI JE SUPPRIME LA LIGNE "public function __construct(){}" le script marche à merveille.
Est-ce qu'il y a quelque chose qui m'échappe ? :roll:

Merci.

Mammouth du PHP | 505 Messages

21 avr. 2007, 19:10

On ne peut pas utiliser les 2 methodes de constructeurs, et en plus avec des signatures différentes...

le public function MyClass, c'est l'ancienne méthode pour compatibilité avec php4. Le __construct, c'est la nouvelle methode php5. C'est celle qu'il faut que tu utilises.

Si tu veux gérer plusieurs type de constructeur, il faut le faire manuellement.
Ne prendre aucun parametre déclaré, puis utiliser func_get_args() et func_num_args(), et partant de la, faire un appel a des contructeur internes.

Mais c'est vraiment histoire de dire par ce que ce genre de truc, a mon avis, y a un pb de conception a la base...

Fais plutot un seul contructeur __construct($att = false) et si att === false, c'est ss params, si !== de false, c'est avec.

Eléphanteau du PHP | 38 Messages

21 avr. 2007, 19:12

class MyClass
{
     public $att ;
    
     public function __construct($att)
     {
          $this->att = $att ;
     }
   
     public function __construct(){}

    public function  fnctTest()
   {
        //code
   }
}
Le constructeur en php5 étant construct(), je dirais que tu dois laisser ta fonction construct() vide, et que tu dois renommer l'autre en construct($att). Il me semble que php5 gère la surcharge de méthode, donc ca ne devrait pas poser de problème.

Mon problème est que ce dernier script ne donne pas de résultat.
Je pense que c'est justement parce que le constructeur est __construct(). La tu lui dit : va me construire ma classe avec construct et un paramètre, or il ne trouve pas ta méthode construct avec un paramètre, donc il ne fait rien. Mais je ne suis pas sur, sur ce point la.
Ni sur l'autre d'ailleurs :roll: :lol:
Mais tu peux toujours essayer.

Invité
Invité n'ayant pas de compte PHPfrance

21 avr. 2007, 21:20

hello

tu peux tout simplement rendre tes parametres facultatifs en les définissant dans la déclaration de fonction:
function __construct( $var = null ){
    $this->var = $var
}
lorsqu'une classe est initialisée, ses membres sont automatiquements déclarés avec une valeur null, donc le constructeur avec parametres présenté ci dessus ne change rien.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

21 avr. 2007, 21:57

Il me semble que php5 gère la surcharge de méthode, donc ca ne devrait pas poser de problème.
Attention, il te semble mal ;)
class MaClasse
{

        function maMethode()
        {
                echo "Pas d'arguments";
        }

        function maMethode($arg)
        {
                echo "Un argument : $arg";
        }

}
Fatal error: Cannot redeclare MaClasse::maMethode() in /home/naholyr/Desktop/test_const.php on line 11

Eléphanteau du PHP | 38 Messages

22 avr. 2007, 04:47

Attention, il te semble mal Wink
Sur...?? Php5 gère pas la surcharge...on m'aurait menti ?? :lol:
Je croyais pourtant.

Eléphant du PHP | 52 Messages

22 avr. 2007, 11:28

Merci pour vous tous,

Donc j'ai utilisé la solution de notre invité qui marche plutot bien.

Merci :D

Mammouth du PHP | 505 Messages

22 avr. 2007, 13:47

php5 ne gère pas de déclaration multiple d'une meme fonction. Meme si la signature diffère.
Avant de répondre, et surtout si on n'est pas sur, la moindre des choses est qd meme de vérifier non ?

Eléphanteau du PHP | 38 Messages

22 avr. 2007, 15:39

Avant de répondre, et surtout si on n'est pas sur, la moindre des choses est qd meme de vérifier non ?
Euh, doucement hein. J'ai bien précisé que je n'étais pas sur, je n'ai pas dit voila, ta solution est ceci.
Ensuite, j'ai dit ca ne coute rien d'essayé. C'est juste une ligne de code à changé, personne ne va en mourir je crois, alors, pas la peine d'être agressif...

ViPHP
ViPHP | 5924 Messages

22 avr. 2007, 15:45

En fait, php5 gère une pseudo surcharge nativement, et une vraie surcharge si on installe les bons modules (c'est expérimental toutefois :-/)

Mammouth du PHP | 505 Messages

22 avr. 2007, 16:14

Je vois pas ou je suis agressif ? C'est un forum d'aide, je trouve donc logique de vérifier l'aide que l'on apporte si on est pas sur de ce qu'on avance, faute de quoi on risque plus d'embourber la personne qu'autre chose. Je trouve juste que c'est du bon sens, rien d'autre.

Skitoyai, ca semble etre plus de la surcharge des geter/seter, ce que tu proposes. Je n'ai pas l'impression que cela permette de faire des fonctions à signatures multiple.

Quand au module expérimental, j'avoue avoir du mal a en saisir l'interret par apport a ce qui est dispo nativement via les __set/__get/__call standards

ViPHP
ViPHP | 5924 Messages

22 avr. 2007, 16:23

Skitoyai, ca semble etre plus de la surcharge d'opérateur, ce que tu proposes. Je n'ai pas l'impression que cela permette de faire des fonctions à signatures multiple.
(Sékiltoyai :) )
D'après la même page :
Les appels de méthodes et l'accès aux membres peuvent être surchargés via les méthodes __call(), __get() et __set().
C'est à dire que sur les méthodes de classe, on peut faire une pseudo surcharge, c'est à dire que la méthode __call($fonction, $args) recoit le nom de la fonction est ses arguments sous forme de tableau, ce qui permet d'appeler une méthode avec le nombre et les types d'argument que l'on veut, mais l'intérêt est limité parce que c'est la méthode __call en elle même qui doit gérer toutes les fonctions à surcharger, c'est à dire que les signatures multiples restent invalides.
Et bien évidemment, il est plutôt improbable que ca fonctionne avec __construct ou __destruct (faut tester mais ca m'étonnerait beaucoup en tous cas :-/ ).
Pour le module expérimental, je crois que j'ai parlé trop vite, en fait je pense qu'il oblige juste à passer par __set, __get, et __call, même lorsque la méthode ou l'élément existe...

Mammouth du PHP | 505 Messages

22 avr. 2007, 18:20

Oops, désolé pour le nick, je recommencerai plus :)
Et bien évidemment, il est plutôt improbable que ca fonctionne avec __construct ou __destruct (faut tester mais ca m'étonnerait beaucoup en tous cas :-/ ).
Bah, ca par contre je peux répondre, __call ne sera jamais appelé en tant que constructeur...

Quand à utiliser __call pour émuler des fonction a signatures multiples, ca revient a faire ce que je proposais, une methode ss aucun parametre, puis utiliser func_get_args() pour faire la gestion de signature a la main, et ca, c'est aussi faisable sur le constructeur.
Utiliser __call dans ce context n'apporterait rien voir va compliquerait la chose puisque tu vas entrer dans __call à chaque appel d'une methode non déclarée, il faudra donc faire en plus du tri sur les signatures le tri sur les noms de methodes.

ViPHP
ViPHP | 5924 Messages

22 avr. 2007, 18:41

Oui, je suis d'accord, par contre faut s'assurer que la directive ad hoc soit activée dans le php.ini, et c'est pas tjs le cas :-/

Mammouth du PHP | 505 Messages

22 avr. 2007, 20:09

De quelle directive parles tu ?