p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Débutant

    Homme Profil pro
    Webmaster débutant
    Inscrit en
    octobre 2006
    Messages
    5 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 5 037
    Points : 2 120
    Points
    2 120
    Billets dans le blog
    1

    Par défaut fonction__autoload pour la POO

    Bonjour,

    plusieurs questions à propos de cette fonction (je débute en POO) :

    - D'abord j’ai lu ça : La fonction spl_autoload_register() fournit une alternative plus flexible pour le chargement automatique de classes. Pour cette raison, l'utilisation de la fonction __autoload() n'est plus encouragée et pourrait devenir obsolète, voire être supprimée dans le futur.
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     function spl_autoload_register($class_name) { // appelée dès qu'une classe est pas trouvée
    //function __autoload($class_name) { // appelée dès qu'une classe est pas trouvée
    require(strtolower($class_name)."_class.php"); //strtolower pour unix
    }
    Provoque une erreur :
    Fatal error: Cannot redeclare spl_autoload_register() in D:\divers\boulot\formation_PHPPOO\index.php on line 5
    que faut-il en penser ?

    - cette fonction est placée dans le index.php de mon application ; est-ce que ça suffit pour qu'elle soit appelée dès lors que n'importe où on souhaite utiliser une classe qui n'est pas encore définie ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Membre confirmé Avatar de John Blobsmith
    Inscrit en
    avril 2004
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 198
    Points : 207
    Points
    207

    Par défaut

    Il faut pensé que tu a re-déclaré la fonction spl_autoload_register qui existe déjà...

  3. #3
    Responsable Développement Web


    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2008
    Messages
    23 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2008
    Messages : 23 788
    Points : 91 426
    Points
    91 426
    Billets dans le blog
    20

    Par défaut

    J'imagine que tu essayes de faire un autoload sur une classe déjà chargée via include par exemple...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Débutant

    Homme Profil pro
    Webmaster débutant
    Inscrit en
    octobre 2006
    Messages
    5 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 5 037
    Points : 2 120
    Points
    2 120
    Billets dans le blog
    1

    Par défaut

    Ca, je l'avais compris ! Mais comme je viens de découvrir l'existence de cette fonction, je ne l'ai pas définie ailleurs...
    Et au sujet de ma 2e question ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  5. #5
    Membre confirmé Avatar de John Blobsmith
    Inscrit en
    avril 2004
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 198
    Points : 207
    Points
    207

    Par défaut

    Citation Envoyé par laurentSc Voir le message
    Ca, je l'avais compris ! Mais comme je viens de découvrir l'existence de cette fonction, je ne l'ai pas définie ailleurs...
    Et au sujet de ma 2e question ?
    Ben il faut que tu utilise la fonction spl_autoload_register et non que tu la définisse...

  6. #6
    Débutant

    Homme Profil pro
    Webmaster débutant
    Inscrit en
    octobre 2006
    Messages
    5 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 5 037
    Points : 2 120
    Points
    2 120
    Billets dans le blog
    1

    Par défaut

    Donc, comme ça marchait avant, il ne faut pas simplement remplacer __autoload ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  7. #7
    Membre confirmé Avatar de John Blobsmith
    Inscrit en
    avril 2004
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 198
    Points : 207
    Points
    207

    Par défaut

    Non ça fonctionne comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function my_autoloader($class) {
        include 'classes/' . $class . '.class.php';
    }
     
    spl_autoload_register('my_autoloader');
    voir la doc :
    http://fr2.php.net/manual/fr/functio...d-register.php

  8. #8
    Débutant

    Homme Profil pro
    Webmaster débutant
    Inscrit en
    octobre 2006
    Messages
    5 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 5 037
    Points : 2 120
    Points
    2 120
    Billets dans le blog
    1

    Par défaut

    Merci pour ton explication ; je pensais justement regarder la doc et leur exemple est très clair.

    J'oubliais ; et ma 2e question :
    cette fonction est placée dans le index.php de mon application ; est-ce que ça suffit pour qu'elle soit appelée dès lors que n'importe où on souhaite utiliser une classe qui n'est pas encore définie ?
    J'ai pas trouvé réponse dans la doc...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  9. #9
    Membre confirmé Avatar de John Blobsmith
    Inscrit en
    avril 2004
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 198
    Points : 207
    Points
    207

    Par défaut

    Ça semble être le but. Tu enregistre tes class dans l'autoload et si une class n'est pas encore chargé il va voir dans l'autoload.

    Cet exemple répond à ta question :

    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
     
    <?php
     
        class ClassAutoloader {
            public function __construct() {
                spl_autoload_register(array($this, 'loader'));
            }
            private function loader($className) {
                echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
                include $className . '.php';
            }
        }
     
        $autoloader = new ClassAutoloader();
     
        $obj = new Class1();
        $obj = new Class2();
     
    ?>
     
    Output:
    --------
    Trying to load Class1 via ClassAutoloader::loader()
    Class1::__construct()
    Trying to load Class2 via ClassAutoloader::loader()
    Class2::__construct()
    up

  10. #10
    Débutant

    Homme Profil pro
    Webmaster débutant
    Inscrit en
    octobre 2006
    Messages
    5 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 5 037
    Points : 2 120
    Points
    2 120
    Billets dans le blog
    1

    Par défaut

    Merci pour ta réponse, mais pourquoi passes-tu aussi $this à la pile de l'autoload ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  11. #11
    Membre confirmé Avatar de John Blobsmith
    Inscrit en
    avril 2004
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 198
    Points : 207
    Points
    207

    Par défaut

    C'est le callback, a priori quant t'es dans une class tu utilise cette syntaxe pour spécifier la class courante.

    voir la doc :
    http://php.net/manual/fr/language.types.callable.php

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

Discussions similaires

  1. Bonnes pratiques pour la POO en Javascript
    Par piemur2000 dans le forum JavaScript
    Réponses: 5
    Dernier message: 05/10/2013, 15h33
  2. Tout changer pour la POO
    Par novphp dans le forum Débuter
    Réponses: 2
    Dernier message: 07/02/2009, 07h38
  3. aide pour la POO
    Par yorukaze dans le forum Général Python
    Réponses: 8
    Dernier message: 04/01/2008, 10h42
  4. [POO] doc pour comparaison POO entre PHP4 et PHP5
    Par mic79 dans le forum Syntaxe
    Réponses: 4
    Dernier message: 19/01/2007, 15h40
  5. Methodologie pour la POO
    Par afrikha dans le forum Méthodes
    Réponses: 5
    Dernier message: 26/11/2005, 03h15

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