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 :

Namespace et class : ne retrouve pas son chemin


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut Namespace et class : ne retrouve pas son chemin
    Hello,
    j'ai une question à propos des namespace, je comprends pas bien comment ca marche, j'ai un index.php dans dossier public et Animals.php dans Lib\Misc.
    J'utilise composer avec dans le json :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "autoload": {        "psr-4": {
                "Lib\\": "Lib/"
            }
        }
    Dans index j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    require_once '../vendor/autoload.php';
    use Lib\Misc\Animal;
    use Lib\Misc\Dog;
     
     
    $animal1 = new Animal("Seb");
    $animal1->Speak();
     
     
    $dog1 = new Dog("Seb2");
    $dog1->Speak();

    dans Animals.php :



    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
    26
    27
    28
    29
    30
    31
    namespace Lib\Misc;
     
     
    class Animal
    {
     
     
        public function __construct(public string $name){}
     
     
        public function Speak()
        {
            echo "Je suis un animal nommé {$this->name}.";
        }
     
     
    }
     
     
     
     
    class Dog extends Animal
    {
     
        public function Speak()
        {
            echo "Je suis un animal nommé {$this->name} wouarf !";
        }
     
     
    }
    et j'ai l'erreur
    Fatal error: Uncaught Error: Class "Lib\Misc\Animals\Animal" not found ...
    Qelqu'un peut me guider pour que je comprenne comment bien utiliser le namspace svp ? Merci !!

  2. #2
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 757
    Points : 2 991
    Points
    2 991
    Par défaut
    Juste une piste : as-tu bien généré une mise à jour du fichier autoload ?

    Pour cela exécute composer dump-autoload.

    Ainsi on est sûr que l'autoload est à jour.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut
    Salut, oui.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    je n'ai pas trouvé mais ai vu 2 trucs qui ne vont pas :
    1- il faut un fichier pour définir une classe (d'où nécessité de créer un fichier Dog.php)
    2- Besoin dans la classe Animal de mettre
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Animal
    {
        public string $name;
     
        public function __construct(string $the_name){
            $this->name = $the_name;
        }
    etc

    Cela dit, même en faisant ces corrections, j'ai encore l'erreur
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Lis ça : https://www.developpez.net/forums/bl...09/autoloader/

    Du coup, si on applique ce qui est écrit, il faut adopter cette arborescence :
    Lib
       Msc
          Animals (à noter ce répertoire)
              Animal.php
          Dog.php    
    
    Et ce code :
    index.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    require_once 'vendor/autoload.php';
    use Lib\Misc\Animals\Animal;
    use Lib\Misc\Dog;
     
     
    $animal1 = new Animal("Seb");
    $animal1->Speak();
     
     
    $dog1 = new Dog("Seb2");
    $dog1->Speak();
    ?>

    Animal.php :
    Code php : 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
    <?php
    namespace Lib\Misc\Animals;
     
    class Animal
    {
        public string $name;
        public function __construct(string $the_name){
            $this->name = $the_name;
        }
     
        public function Speak()
        {
            echo "Je suis un animal nommé {$this->name}.";
        }
    }
    ?>

    Dog.php :
    Code php : 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
    <?php
    namespace Lib\Misc;
    use Lib\Misc\Animals\Animal;
     
    class Dog extends Animal
    {
        public string $name;
     
        public function __construct(string $the_name){
            $this->name = $the_name;
        }
     
        public function Speak()
        {
            echo "Je suis un animal nommé {$this->name} wouarf !";
        }
     
     
    }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 757
    Points : 2 991
    Points
    2 991
    Par défaut
    Citation Envoyé par nanog Voir le message
    Salut, oui.
    Ouille... Lecture sur smartphone...

    Je n'avais pas vu que tu déclarais deux classes dans le même fichier. Oublie cette approche, elle n'est absolument pas recommandée (sauf rares exceptions) et, avec composer, oublie toujours. Une classe, un fichier. Regarde la dernière réponse de laurentSc, elle devrait fonctionner.

    Une remarque perso sur l'organisation du code : un chien étant un animal, pour moi, logiquement, il doit être déclaré dans le même namespace et donc dog.php doit être mis dans le dossier animals.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Regarde la dernière réponse de laurentSc, elle devrait fonctionner.
    c’est le cas l’ayant testée en local…

    Ok pour ta remarque perso CAVO.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut
    merci pour vos commentaires,
    juste une question bête :

    sur la proposition : "une classe Feuille et définie sur l'espace de nom namespace Meuble\Tiroir\Classeur; devra se trouver physiquement à cet emplacement Racine_du_site/Meuble/Tiroir/Classeur/Feuille.php"

    est ce que le nom du fichier Feuille.php peut etre Truc.php ? Dans tous les exemples que je vois partout c'est AAA.php pour la classe AAA ect. C'est un question pratique ou technique ?

    Parce que j'appelle la classe feuille, ok, mais comment php sait que feuille est dans feuille.php ? juste parce que ya un namespace namespace Meuble\Tiroir\Classeur\Feuille ?

    et

    Meuble\Tiroir\Classeur\Feuille : ca appelle le fichier feuille.php ou la classe feuille ?



    Merci

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nanog Voir le message
    est ce que le nom du fichier Feuille.php peut etre Truc.php ?
    Fais l'essai. Tu verras que non.
    Citation Envoyé par nanog Voir le message
    Parce que j'appelle la classe feuille, ok, mais comment php sait que feuille est dans feuille.php ? juste parce que ya un namespace namespace Meuble\Tiroir\Classeur\Feuille ?
    Non, je pense grâce à l'autoloader.

    Citation Envoyé par nanog Voir le message
    Meuble\Tiroir\Classeur\Feuille : ca appelle le fichier feuille.php ou la classe feuille ?
    ???
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 757
    Points : 2 991
    Points
    2 991
    Par défaut
    Bonjour

    Citation Envoyé par nanog Voir le message
    Meuble\Tiroir\Classeur\Feuille : ca appelle le fichier feuille.php ou la classe feuille ?
    Les deux mon capitaine puisque la norme (PSR4) demande à ce que le nom du fichier = le nom de la classe.

    Plus strictement : l'instruction use charge une classe (et pas un fichier) et c'est le autoloader.php qui contient le lien entre la classe et le fichier où elle est déclarée.

    As-tu déjà ouvert le fichier vendor/autoload.php? Tu peux le consulter sans souci; tu auras peut-être quelques réponses à ta saine curiosité.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. L'exécutable ne trouve pas son chemin
    Par colorid dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2012, 06h43
  2. proteger .class pour ne pas retrouver code source
    Par fantomas261 dans le forum Langage
    Réponses: 3
    Dernier message: 04/11/2007, 10h36
  3. objet qui ne retrouve pas sa class
    Par trax44 dans le forum Langage
    Réponses: 9
    Dernier message: 20/07/2006, 16h33
  4. [ERREUR] Ne retrouve pas la classe main
    Par Anathema dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 06/07/2005, 16h16
  5. [SERVLET] retrouver son chemin
    Par sebos63 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/09/2003, 08h59

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