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 :

Pb avec spl_autoload_register


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Janvier 2016
    Messages : 95
    Points : 61
    Points
    61
    Par défaut Pb avec spl_autoload_register
    Bonjour,

    Je n'arrive pas à comprendre pourquoi le code ne fonctionne pas.
    C'est un code issu d'un cours :
    mon fichier index.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
     
    <?php
     
    spl_autoload_register(function ($class) {
        include 'MesProduits/' . $class . '.php';
    });
     
    use MesProduits\Produit ;
     
    $imprimante=new Produit("imprimante",1,800);
     
    $imprimante->ajouterProduit();
    $imprimante->supprimerProduit();
    echo $imprimante;
    et mon fichier de la classe :
    dans un répertoire MesProduits :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    <?php
     
    namespace MesProduits ;
     
    class Produit 
    {
        function __construct(string $nom,int $quantite,float $prix,bool $rupture=false)
        {
     
            $this->nom=$nom;
            $this->quantite=$quantite;
            $this->prix=$prix;
            $this->rupture=$rupture;
     
        }
     
        function getNom()
        {
            return $this->nom;
     
        }
     
        function setNom($valeur)
        {
            if (!is_string($valeur)){
                echo "la propriété nom doit être un chaîne de caractères";
            }
             else {
                $this->nom=$valeur;
            }
     
        }
        function getQuantite()
        {
            return $this->quantite;
     
        }
     
        function setQuantite($valeur)
        {
            if (!is_integer($valeur)){
                echo "La propriété quantite doit être un entier";
            }
             else {
                $this->quantite=$valeur;
            }
     
        }
     
        function getprix()
        {
            return $this->prix;
     
        }
     
        function setprix($valeur)
        {
            if (!is_numeric($valeur)){
                echo "La propriété prix doit être un nombre";
            }
             else {
                $this->prix=$valeur;
            }
     
        }
     
     
        function __toString()
        {
            return "Nom: ".$this->nom.'<br>'.
                   "Prix: ".$this->prix.'<br>'.
                   "Quantité: ".$this->quantite.'<br>'.
                   (($this->rupture)?"Rupture de stock<br>":"En stock<br>");
        }
        function ajouterProduit()
        {
            $this->quantite+=1;
            if($this->quantite>0) $this->rupture=false;
        }
        function supprimerProduit()
        {
            $this->quantite-=1;
            if($this->quantite<=0){
                $this->quantite=0;
                $this->rupture=true;
            }
        }
     
    }
    Je n'arrive pas à comprendre où se trouve mon erreur ?

    Pourriez-vous m'aider

    Stéphane

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    As tu essayé de débuggé tes variables ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spl_autoload_register(function ($class) {
        include 'MesProduits/' . $class . '.php';
    });
    Si oui , tu as du te rendre compte que $class contient le namespace en plus du nom de classe et que donc ton include se traduit par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include  'MesProduits/MesProduits\Produit.php';
    Ce qui ne correspond pas à ton architecture de dossier

    La solution simple est donc d'écrire ton autoload ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spl_autoload_register(function ($class) {
        include  $class . '.php';
    });
    idéalement il faudrait faire quelque chose d'un peu plus intelligent qui transforme les '\' par des DIRECTORY_SEPARATOR pour assurer une certaines portabilité en fonction du système cible
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Janvier 2016
    Messages : 95
    Points : 61
    Points
    61
    Par défaut
    Bonjour, merci pour cette réponse, j'ai donc modifé comme suggéré le code :
    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
     
     
    <?php
     
    spl_autoload_register(function ($class) {
        include $class . '.php';
    var_dump $class
    });
     
    use MesProduits\Produit ;
     
    $imprimante=new Produit("imprimante",1,800);
     
    $imprimante->ajouterProduit();
    $imprimante->supprimerProduit();
    echo $imprimante;
    mais cela ne fonctionne toujours pas.
    fichier MesProduits/Produit.php.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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    <?php
     
    namespace MesProduits ;
     
    class Produit 
    {
        function __construct(string $nom,int $quantite,float $prix,bool $rupture=false)
        {
     
            $this->nom=$nom;
            $this->quantite=$quantite;
            $this->prix=$prix;
            $this->rupture=$rupture;
     
        }
     
        function getNom()
        {
            return $this->nom;
     
        }
     
        function setNom($valeur)
        {
            if (!is_string($valeur)){
                echo "la propriété nom doit être un chaîne de caractères";
            }
             else {
                $this->nom=$valeur;
            }
     
        }
        function getQuantite()
        {
            return $this->quantite;
     
        }
     
        function setQuantite($valeur)
        {
            if (!is_integer($valeur)){
                echo "La propriété quantite doit être un entier";
            }
             else {
                $this->quantite=$valeur;
            }
     
        }
     
        function getprix()
        {
            return $this->prix;
     
        }
     
        function setprix($valeur)
        {
            if (!is_numeric($valeur)){
                echo "La propriété prix doit être un nombre";
            }
             else {
                $this->prix=$valeur;
            }
     
        }
     
     
        function __toString()
        {
            return "Nom: ".$this->nom.'<br>'.
                   "Prix: ".$this->prix.'<br>'.
                   "Quantité: ".$this->quantite.'<br>'.
                   (($this->rupture)?"Rupture de stock<br>":"En stock<br>");
        }
        function ajouterProduit()
        {
            $this->quantite+=1;
            if($this->quantite>0) $this->rupture=false;
        }
        function supprimerProduit()
        {
            $this->quantite-=1;
            if($this->quantite<=0){
                $this->quantite=0;
                $this->rupture=true;
            }
        }
     
    }
    Resultat dans chrome :
    string(19) "mesProduits\Produit
    Quand je déplace le fichier Produit.php au même niveau que index.php et en remplaçant le spl_autoload par un include simple, cela fonctionne.

  4. #4
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Janvier 2016
    Messages : 95
    Points : 61
    Points
    61
    Par défaut
    Rebonjour,

    Indication en plus :
    quand je commente le spl_autoload et fait un include à la main, cela fonctionne :
    index.php =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     /*
    spl_autoload_register(function ($class) {
        include $class . '.php';
    var_dump $class
    });
     */
    use MesProduits\Produit ;
     
    include "MesProduits/Produit.php";

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2018, 15h10
  2. [PHP 5.3] Problème avec l'utilisation de spl_autoload_register
    Par beegees dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2012, 12h38
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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