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 :

include et autoloading [POO]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut include et autoloading
    Bonjour,

    ayant un code énorme, pour faciliter la lecture, j'ai décidé d'exporter des blocs de code dans des fichiers, et le fichier de départ (CSVImportController.php) qui contenait le code énorme devient une succession de include "fichierX.php";

    Je suis parti du principe que faire include "fichierX.php"; dans CSVImportController.php revient à copier-coller le contenu de fichierX.php dans CSVImportController.php. Donc si fichierX.php contient un new MyClass();, du moment que fichier1.php contient un use namespace\MyClass, cette classe sera trouvée.
    Mais ce n'est pas le cas car depuis que j'ai exporté les new :
    Fatal error: Uncaught Error: Class "COU_country" not found in C:\projets\ticket_rawsrc\src\controller\createObjectsTicket.php:4 Stack trace: #0 C:\projets\ticket_rawsrc\src\controller\CSVImportController.php(138): include() #1 C:\projets\ticket_rawsrc\index.php(120): ticket_rawsrc\controller\CSVImportController->invoke(Array) #2 {main} thrown in C:\projets\ticket_rawsrc\src\controller\createObjectsTicket.php on line 4
    Le gros fichier de départ est CSVImportController.php. J'ai exporté des new dans le fichier createObjectsTicket.php et mis dans CSVImportController.php include "createObjectsTicket.php";

    Le fichier createObjectsTicket.php commence par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->ref_Country = new COU_country(
    $this->data['customer_sesa_id'],
    $this->data['product_name'],
    $this->data['country'],
    $this->data['region']
    );
    et CSVImportController.php contient :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    namespace ticket_rawsrc\controller;
     
    use ticket_rawsrc\model\COU_country;
     
    class CSVImportController
    {
        private $data=[];
         private $ref_Country;
    Il est où le bug SVP ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Souhaitant résoudre ce problème, j'ai tenté de coder un cas très basique.

    Pour l'instant, j'ai ça (je compte enrichir plus tard) :
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
     
    require __DIR__ . '/vendor/autoload.php';
     
    use DVP\MyClass\Class1;
    use DVP\MyClass\Class2;
     
    //include "creerClasses.php";
    $my_Class1 = new Class1();
    $my_Class2 = new Class2();
     
    $my_Class1->setClass1_propertie("a_value1");
     
    $a = $my_Class1->getClass1_propertie();
    echo "<br/><br/>a=".$a."<br/><br/>";
     
     
    $my_Class2->setClass2_propertie("a_value2");
     
    $b = $my_Class2->getClass2_propertie();
     
    echo "<br/><br/>b=".$b."<br/><br/>";

    Class1.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
    namespace DVP\MyClass ;
     
    class Class1
    {
        private $Class1_propertie;
     
        public function setClass1_propertie($value) {
            $this->Class1_propertie = $value;
        }
     
        public function getClass1_propertie() {return($this->Class1_propertie);}
    }

    Class2.php : idem à Class1.php en changeant 1 par 2

    composer.json :
    Code json : 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
    {
      "name": "schmitt/pooInclude",
      "description": "test include",
      "type": "project",
      "license": "MIT",
      "authors": [
        {
          "name": "Laurent Schmitt",
          "email": "laurent.schmitt28380@gmail.com"
        }
      ],
      "keywords": [
        "php"
      ],
      "minimum-stability": "dev",
      "require": {
        "php": ">=8.0"
      },
      "autoload": {
        "psr-4": {
          "DVP\\": "src/"
        }
      }
    }

    résultat :
    Fatal error: Uncaught Error: Class "Class1" not found in C:\projets\dvp\pooInclude\test.php:6 Stack trace: #0 {main} thrown in C:\projets\dvp\pooInclude\test.php on line 6
    alors que si je fais sans composer mais avec des include, ça marche.

    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
    20
    21
    22
    23
    24
    25
    <?php
     
    //require __DIR__ . '/vendor/autoload.php';
     
    include "src\Class1.php";
    include "src\Class2.php";
     
    use DVP\MyClass\Class1;
    use DVP\MyClass\Class2;
     
    //include "creerClasses.php";
    $my_Class1 = new Class1();
    $my_Class2 = new Class2();
     
    $my_Class1->setClass1_propertie("a_value1");
     
    $a = $my_Class1->getClass1_propertie();
    echo "<br/><br/>a=".$a."<br/><br/>";
     
     
    $my_Class2->setClass2_propertie("a_value2");
     
    $b = $my_Class2->getClass2_propertie();
     
    echo "<br/><br/>b=".$b."<br/><br/>";
    Quel est mon bug, SVP ?

  3. #3
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Salut,

    Vu que le 2ème code fonctionne et qu'on voit include "src\Class1.php" c'est normal , il manque un dossier DVP au vu du composer.json sinon composer ne va pas trouver les classes .
    Mais bon je ne vois le rapport entre les 2 messages .

    PS: Il faut toujours doubler les \

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Hello

    Avec ton code fonctionnel (celui avec include) on voit que tu charges /src/Class1.php et c'est pas du tout logique avec ton namespace.

    Ton namespace est en trois parties et donc ton fichier DOIT respecter cela. Du coup ton fichier devrait être nommé comme suit : /src/MyClass/Class1.php.

    Le namespace doit être en cohérence avec ta structure de fichiers, c'est intimement lié.

    Note : si tu codes avec vscode, grâce à composer, tu peux maintenant utiliser la touche F12 pour, quand tu cliques sur une méthode d'une librairie, te rendre dans le code. C'est ce qu'on nomme la navigation dans le code et le support de composer est un atout indéniable.

    Du coup, s'il ne saute pas dans le code, il y a donc un souci dans les chemins.

    (j'utilise vscode mais chaque outil de développement sérieux aura son raccourci clavier)

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonsoir et merci pour vos réponses.

    Sachez qu'ayant réfléchi, je compte me passer des include mais vais éclaircir le code à l'aide la POO (je vais découper le code en plusieurs méthodes de la classe courante).

    Ce soir, petit problème que je compte résoudre demain matin.
    Bonne nuit

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Le "petit" problème a été résolu une fois de plus par rawsrc (j'avais foutu la panique dans composer, mais j'en sais pas plus).

    En tout cas, le découpage, je le fais avec des méthodes et plus avec des include.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/10/2019, 17h46
  2. Réponses: 2
    Dernier message: 01/08/2019, 12h11
  3. Réponses: 7
    Dernier message: 06/03/2014, 08h42
  4. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44
  5. #include "math.h" et #include <math.h>
    Par pounka dans le forum C
    Réponses: 4
    Dernier message: 01/05/2003, 21h06

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