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 autoload


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut namespace et autoload
    Bonsoir,

    J'essaie de manipuler les namespaces et/ou l'autoload.

    J'ai 3 dossiers imbriqués avec des classes à l'intérieur
    Nom : imbriquation.PNG
Affichages : 516
Taille : 2,8 Ko

    A contient B et index.php
    B contient C et la classe Point.php
    C contient la classe Triangle.php

    J'essaie dans un premier temps, d'utiliser un namespace pour chaque classe appartenant à un dossier.

    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    namespace A;
     
    use \B\Point;
    use \C\Triangle;
     
    include '.\B\Point.php';
    include '.\B\C\Triangle.php';
     
     
     
     
    	//spl_autoload_extensions(".php,.inc");
    	//spl_autoload_register();
     
    	/*spl_autoload_register(function($class)
    	{
    		include 'A/B/C/' .$class . '.class.php';
    	});*/
     
     
    	$p = new Point(5, 11);
    	echo $p->getX();
     
    	$t = new Triangle(1,1,2,2,2,1);
     
    	var_dump($t);
    ?>
    Point.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
    <?php
    namespace B;
     
    class Point
    {
        private $x;
        private $y;
     
        public function __construct($x, $y) 
        { 
            $this->setX($x);
            $this->setY($y);
        }
     
        public function setX($x)
        { 
            $this->x = $x;
        }
     
        public function getX()
        { 
            return $this->x;
        }
     
        public function setY($y)
        { 
            $this->y = $y;
        }
     
        public function getY()
        { 
            return $this->y;
        }
    }
     
    ?>
    Triangle.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
     
    <?php
    namespace C;
     
    use B\C\Point;
     
    class Triangle
    { 
        private $pt = [];
     
        public function __construct($x1, $y1, $x2, $y2, $x3, $y3) 
        { 
            $this->pt[] = new Point($x1, $y1);
            $this->pt[] = new Point($x2, $y2);
            $this->pt[] = new Point($x3, $y3);
        }
         //...
    }
    ?>
    J'ai ceci comme erreur jusqu'à maintenant
    Nom : erreur.PNG
Affichages : 510
Taille : 15,6 Ko

    Je suppose que je dois utiliser new \B\Point($x1, $y1);.

    Mais après avoir passé la soirée là-dessus, je n'arrive à rien.

    N'y a t'il pas moyen de n'utiliser que l'autoload, pour charger les classes qui sont appelées dans index.php? Donc sans utiliser de namespace ?

    Mon but final étant de corriger les différents scripts afin que index.php s'exécute sans erreur.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    lis ce billet

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Merci pour la doc, j'ai essayé de l'appliquer à mon code, mais mon idex.php, ne trouve pas ma class A\B\Point. (erreur ligne 11 index.php)
    Est-ce que mon use A\B\Point; est correct dans index.php?

    Autoloader.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
    <?php
    namespace A;
     
    class Autoloader 
    {
     
        static function register() {
            define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR);
     
            $autoloader = function($full_class_name) {
                // on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système
                $name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name);
                // on construit le chemin complet du fichier à inclure :a
                // il faut que l'autoloader soit toujours à la racine du site
                $path = DIR_ROOT.$name.'.php';
     
                // on vérifie que le fichier existe et on l'inclut
                // sinon on passe la main à une autre autoloader (return false)
                if (is_file($path)) {
                    include $path;
                    return true;
                } else {
                    return false;
                }
            };
            spl_autoload_register($autoloader);
        }
    }
    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
    15
    16
    17
    <?php
    namespace A;
     
    use A\B\Point;
    use A\B\C\Triangle;
     
    include_once 'Autoloader.php';
     
    Autoloader::register();
     
    $p = new Point(5, 11);
    echo $p->getX();
     
    $t = new Triangle(1,1,2,2,2,1);
     
    var_dump($t);
    ?>
    Point.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
    <?php
    namespace A\B;
     
    class Point
    {
        private $x;
        private $y;
     
        public function __construct($x, $y) 
        { 
            $this->setX($x);
            $this->setY($y);
        }
     
        public function setX($x)
        { 
            $this->x = $x;
        }
     
        public function getX()
        { 
            return $this->x;
        }
     
        public function setY($y)
        { 
            $this->y = $y;
        }
     
        public function getY()
        { 
            return $this->y;
        }
    }
     
    ?>
    Triangle.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
    <?php
    namespace A\B\C;
     
    use A\B\Point;
     
    include_once 'Autoloader.php';
     
    Autoloader::register();
     
    class Triangle
    { 
        private $pt = [];
     
        public function __construct($x1, $y1, $x2, $y2, $x3, $y3) 
        { 
            $this->pt[] = new Point($x1, $y1);
            $this->pt[] = new Point($x2, $y2);
            $this->pt[] = new Point($x3, $y3);
        }
         //...
    }
    ?>
    Dans ma class Triangle, j'ai également ajouté le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    include_once 'Autoloader.php';
     
    Autoloader::register();
    vu que j'y appel ma class Point, est-ce correct?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    le fichier index.php devrait être sur l'espace de nom global, pas la peine de lui définir un namespace. Ce fichier récupère toutes les requêtes donc il est global.
    Fichier index.php avec des commentaires
    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
    <?php
     
    // ici tu supposes que le fichier Autoloader.php
    // est à la racine du site juste à côté de index.php
    // supprime l'espace de nom de la classe Autoloader (reste sur l'espace de nom global)
    include_once 'Autoloader.php';
    Autoloader::register();
     
    // pour que l'autoloading fonctionne, il faut que le fichier
    // Point.php contenant la définition de la classe Point soit 
    // dans le dossier racine_du_site/A/B
    use A\B\Point;
     
    // pour que l'autoloading fonctionne, il faut que le fichier
    // Triangle.php contenant la définition de la classe Triangle soit 
    // dans le dossier racine_du_site/A/B/C
    use A\B\C\Triangle;
     
    $p = new Point(5, 11);
    echo $p->getX();
     
    $t = new Triangle(1,1,2,2,2,1);
     
    var_dump($t);
    Et je te l'ai déjà dit tu dois toujours définir la visibilité des fonctions : static function register() est très fortement déconseillé au profit de public static function register()
    Prends l'habitude de ne JAMAIS fermer les fichiers php avec ?>

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Ok, merci pour les explications, ça m'a vraiment aidé à mieux comprendre ces deux techniques, autoload et namespace.

    Voici la version qui fonctionne

    class Autoloader:
    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
    <?php
    //pas besoin de namespace, fait partie de l'espace global
     
    class Autoloader 
    {
        public static function register() 
        {
            define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR);
     
            $autoloader = function($full_class_name) 
            {
                // on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système
                $name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name);
                // on construit le chemin complet du fichier à inclure
                // il faut que l'autoloader soit toujours à la racine du site
                $path = DIR_ROOT.$name.'.php';
     
                // on vérifie que le fichier existe et on l'inclut
                // sinon on passe la main à une autre autoloader (return false)
                if (is_file($path)) {
                    include $path;
                    return true;
                } else {
                    return false;
                }
            };
            spl_autoload_register($autoloader);
        }
    }
    class 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
    15
    16
    <?php
    //pas besoin de namespace, fait partie de l'espace global
     
    use B\Point;//indique l'espace nom pour la class Point
    use B\C\Triangle;//indique l'espace nom pour la class Triangle
     
    include_once 'Autoloader.php';//Autoloading
     
    Autoloader::register();//appel de la fonction register
     
    $p = new Point(5, 11);
    echo $p->getX();
     
    $t = new Triangle(1,1,2,2,2,1);
     
    var_dump($t);
    class Point
    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
    <?php
    namespace B;
     
    class Point
    {
        private $x;
        private $y;
     
        public function __construct($x, $y) 
        { 
            $this->setX($x);
            $this->setY($y);
        }
     
        public function setX($x)
        { 
            $this->x = $x;
        }
     
        public function getX()
        { 
            return $this->x;
        }
     
        public function setY($y)
        { 
            $this->y = $y;
        }
     
        public function getY()
        { 
            return $this->y;
        }
    }
    class Triangle
    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
    <?php
    namespace B\C;
     
    use B\Point;//indique l'espace nom pour la class Point
     
    class Triangle
    { 
        private $pt = [];
     
        public function __construct($x1, $y1, $x2, $y2, $x3, $y3) 
        { 
            $this->pt[] = new Point($x1, $y1);
            $this->pt[] = new Point($x2, $y2);
            $this->pt[] = new Point($x3, $y3);
        }
         //...
    }

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

Discussions similaires

  1. PHPMailer avec un Autoloader + Namespace
    Par slack457 dans le forum Langage
    Réponses: 1
    Dernier message: 28/05/2016, 06h32
  2. [PHP 5.4] [Namespace] Questions Autoloader
    Par decad7 dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2014, 15h39
  3. autoload et namespace
    Par loustalet dans le forum Langage
    Réponses: 0
    Dernier message: 11/12/2013, 19h14
  4. Namespace et Autoload
    Par toham dans le forum Langage
    Réponses: 2
    Dernier message: 27/08/2012, 17h25
  5. [PHP 5.3] SPL, autoload, namespace et système
    Par Benj. dans le forum Langage
    Réponses: 1
    Dernier message: 25/02/2010, 13h27

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