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 :

[Système] Cannot redeclare mafonction() (previously declared)


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut [Système] Cannot redeclare mafonction() (previously declared)
    Bonjour,

    À l'intérieur d'une classe, j'ai déclaré la fonction suivante :
    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
    22
    23
    24
    25
     
    /**
     * Trie les enregistrements selon la colonne donnée
     * Paramètres : string $col (Nom de la colonne à trier)
     **/
        function trier($col) {
          //Le paramètre est passé en variable globale pour atteindre la fonction ci-dessous
          $GLOBALS["col"] = $col;
          //Fonction servant à comparer deux véhicules
          function lineicmp($c1, $c2) {
            switch($GLOBALS["col"]) {
              case "id"          : return $c1->getId()       - $c2->getId();
              case "id_emp"      : return $c1->getEmp()      - $c2->getEmp();
              case "ddq"         : return strcasecmp($c1->getDdq()  , $c2->getDdq());
              case "hdq"         : return strcasecmp($c1->getHdq()  , $c2->getHdq());
              case "odt"         : return $c1->getOdt()      - $c2->getOdt();
              case "ort"         : return $c1->getOrt()      - $c2->getOrt();
              case "dfq"         : return strcasecmp($c1->getDfq()  , $c2->getDfq());
              case "hfq"         : return strcasecmp($c1->getHfq()  , $c2->getHfq());
              case "id_route"    : return $c1->getRoute()    - $c2->getRoute();
              case "id_vehicule" : return $c1->getVehicule() - $c2->getVehicule();
            }
          }
          usort($this->c, "lineicmp");
        }
    J'ai une autre fonction qui va appeler à deux reprises la fonction trier, ce qui cause me message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Cannot redeclare lineicmp() (previously declared) in /var/www/html/monrepertoite/class/cartes.php:453) in /var/www/html/monrepertoire/class/cartes.php on line 453
    Je suppose que c'est probablement que j'utilise mal la notion de callback. Faudrait-il que je sorte ma fonction lineicmp() de trier()?

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 064
    Points
    6 064
    Par défaut
    Je crois que ça arrive parce que tu as du surement faire un copier/Collier de la fonction avec le mot clés devant "function trier" au lieu de trier tous cour.

  3. #3
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Voici ma fonction qui appelle trier. Je ne crois pas qu'il y aie une erreur de syntaxe. De toute façon, le problème concerne la fonction lineicmp(). Je ne sais pas trop, je me doute que la solution est probablement très simple mais ce n'est pas ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /**
         * Renvoie un tableau contenant toutes les cartes débutant un jour donné
         * Paramètre : string $date
         **/
        function getCarteJour($date) {
          $cartes = array();
          $this->trier("hdq");
          $this->trier("ddq");
          foreach($this->c as $id => $carte) {
            if($carte["ddq"] = $date) array_push($cartes, $this->c[$id]); 
          }
          return $cartes;
        }

  4. #4
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Ta fonction lineicmp() est tout simplement déclarée 2 fois et la première fois c'était ici --> cartes.php:453

  5. #5
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    La fonction lineicmp() n'apparaît qu à la ligne 453. Nulle part ailleurs, ni dans aucun autre fichier inclus. Et même si je n'appelle qu'une seule fois ma fonction trier le problème reste entier.

  6. #6
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    On peut déclarer une fonction dans une fonction et tout ceci dans une classe ???

  7. #7
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 064
    Points
    6 064
    Par défaut
    Trier est appelé combien de fois? car la fonction lineicmp() est déclaré à l'intérieur de Trier. Apres elle rappeler dans le unsort. Je crois qu'il y a un os à ce niveau là.

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 064
    Points
    6 064
    Par défaut
    Citation Envoyé par FCYPBA
    On peut déclarer une fonction dans une fonction et tout ceci dans une classe ???
    Oui. Et je crois qu'il est possible de déclarer une classe dans une fonction déclarer une classe dans une methode d'une classe.

  9. #9
    Membre expérimenté
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par berceker united
    Oui. Et je crois qu'il est possible de déclarer une classe dans une fonction déclarer une classe dans une methode d'une classe.
    Les déclarations de fonctions dans d'autres fonctions ca donne vraiment envie de , faut pas s'étonner d'avoir des bugs ensuite

  10. #10
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    J'ai déjà utilisé à plusieurs reprises cette façon de faire mais je n'ai malheureusement pas accès à mes sources d'où je suis. Cependant je sais qu'il est possible d'appeler plusieurs fois une fonction structurée comme je tente de la faire pour trier(). Il doit y avoir quelque chose que je fais mal dans la déclaration de cette fonction.

  11. #11
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par guitou12
    Les déclarations de fonctions dans d'autres fonctions ca donne vraiment envie de , faut pas s'étonner d'avoir des bugs ensuite
    J'ai déjà utilisé des classes avec plusieurs fonctions qui faisaient un travail comme trier() dans la même classe. Si je déclarais ma fonction en dehors, je devrais toutes les baptiser différemment alors qu'elles sont toutes semblables. Je ne déclare jamais de fonction à l'intérieur d'une fonction excepté pour les callback.

  12. #12
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Je pense que le problème est surement lié à l'endroit ou ta fonction est déclarée.

    Et je n'arrive pas à comprendre pourquoi tu la déclare à cet endroit précis.

    Pierre

  13. #13
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 064
    Points
    6 064
    Par défaut
    Ce que je ne comprend pas c'est cette ligne là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      usort($this->c, "lineicmp");

  14. #14
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Avec ce code, le tableau c de la classe est trié à l'aide la fonction lineicmp

    C'est le B-a-Ba dans le traitement des tableaux

  15. #15
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Okay j'explique.

    Dans ma fonction trier(), j'appelle la fonction usort() qui nécessite que je lui fournisse le nom de ma fonction qui comparera mes données. Cette dernière fonction n'est pas vue par usort() si elle est à l'extérieur du bloc logique que représente la fonction trier().

    J'ai essayé de la mettre à l'extérieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: usort() [function.usort]: Invalid comparison function. in /var/www/html/cartetemps4/class/cartes.php on line 483

  16. #16
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Okay pour l'emplacement de la déclaration.

    Maintenant, peut etre faut-il détruire la fonction de tri après le usort() .

    Peut-on détruire une fonction ???

  17. #17
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 064
    Points
    6 064
    Par défaut
    Citation Envoyé par FrankOVD
    Okay j'explique.

    Dans ma fonction trier(), j'appelle la fonction usort() qui nécessite que je lui fournisse le nom de ma fonction qui comparera mes données. Cette dernière fonction n'est pas vue par usort() si elle est à l'extérieur du bloc logique que représente la fonction trier().

    J'ai essayé de la mettre à l'extérieur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: usort() [function.usort]: Invalid comparison function. in /var/www/html/cartetemps4/class/cartes.php on line 483
    Effectivement je comprend pourquoi tu es obligé de le mettre la déclaration d'une fonction à l'intérieur d'une methode. De ce faite il se pourrait que ceci rende les choses incompatible. Je sais que la fonction déclarer dans la methode ne sont visible que pour la méthode. Quoi c'est a vérifier mais il y a pas de raison.

  18. #18
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    J'ai essayé de déclarer ma fonction comme privée mais ça n'a pas fonctionné non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Parse error: parse error, unexpected T_PRIVATE in /var/www/html/cartetemps4/class/cartes.php on line 453

  19. #19
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Citation Envoyé par berceker united
    De ce faite il se pourrait que ceci rende les choses incompatible.
    Tu peux détailler un petit peu?

  20. #20
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Je pense qu'il veut dire que tu ne pourrais pas utiliser usort au sein d'une méthode d'une classe.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2015, 09h23
  2. Réponses: 13
    Dernier message: 10/12/2011, 17h12
  3. Réponses: 3
    Dernier message: 30/11/2006, 20h54
  4. Message d'erreur absurde du genre Cannot redeclare
    Par philippe281281 dans le forum Langage
    Réponses: 11
    Dernier message: 17/11/2006, 11h35
  5. Cannot redeclare class...
    Par DeezerD dans le forum Langage
    Réponses: 4
    Dernier message: 02/11/2005, 18h51

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