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 :

Utiliser une fonction autoloader


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 508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut Utiliser une fonction autoloader
    J'ai mis dans mon fichier principal une fonction d'autoload, mais elle ne marche pas et donc je suis obligé d'inclure la définition de la classe dans le 2e fichier où elle est utilisée. Peut-on me dire pourquoi ?

    autoloader dans index.php (fichier principal) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function my_autoloader($class) {
        echo "chargement du fichier (autoloader) : ".__DIR__.'\new\class_'.$class.'.php';
        include __DIR__.'\new\class_'.$class.'.php';
    }
     
    spl_autoload_register('my_autoloader');

    Je dois mettre l'inclusion de la définition de la classe dans le 2e fichier de connexion :
    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
    <?php
    if(empty($bdd_planning)){
    	include_once (__DIR__.'\\new\class_MyPdo.php');
    }
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    				$bdd_planning = new MyPdo("planning_dev");
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}
    ?>

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    pour que l'autoloader fonctionne tu dois penser à l'initialiser au moins une fois à chaque requête serveur.
    Pour cela, tu devrais regrouper toutes les fonctions d'initialisation dans un fichier du genre bootstrap.php qui serait requis au début de tous les scripts avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once 'path/to/bootstrap.php';
    Pour rester propre, un autoloader doit renvoyer false en cas d'échec et passer la main à un autre autoloader qui aurait été enregistré.
    D'ailleurs avant de faire un include tu devrais t'assurer quand même de l'existence du fichier avec un if (is_file($full_path)) { include $full_path; }

  3. #3
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Salut Laurent,
    Je croyais que tu avais réussi à le faire marcher, ton autoload... c'est quoi ton message d'erreur ? Toujours Class 'class_MyPdo' not found ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    pour que l'autoloader fonctionne tu dois penser à l'initialiser au moins une fois à chaque requête serveur.
    Pour cela, tu devrais regrouper toutes les fonctions d'initialisation dans un fichier du genre bootstrap.php qui serait requis au début de tous les scripts avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once 'path/to/bootstrap.php';
    OK, mais alors que gagne-t-on par rapport à inclure dans les fichiers utilisant une classe, le fichier où elle est définie ?

    Citation Envoyé par kalimukti Voir le message
    Je croyais que tu avais réussi à le faire marcher, ton autoload... c'est quoi ton message d'erreur ? Toujours Class 'class_MyPdo' not found ?
    Moi aussi, je le croyais mardi soir, mais depuis hier matin, j'ai de nouveau le message d'erreur que tu cites.

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    on y gagne énormément, une fois que le moyen de trouver un fichier est indiqué dans un autoloader, tu ne fais qu'utiliser les classes dans tes codes sans te préoccuper de savoir où elle sont implémentées.
    L'autoloader se débrouille pour trouver le fichier adéquate au premier appel et le charge pour toi.
    Donc quand t'utilises 20 classes différentes dans un script, tu ne te préoccupes pas de les inclure une par une en début de script... Tu y gagnes forcément.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 334
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    j'ai de nouveau le message d'erreur que tu cites.
    ? mais puisque tu as inséré cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "chargement du fichier (autoloader) : ".__DIR__.'\new\class_'.$class.'.php';
    tu devrais nous retourner le retour de l'écho (et l'erreur exacte). Si l'echo n'est pas affiché alors c'est que ta fonction my_autoloader() n'est pas chargée...

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut
    Y voir plus clair quand on a 20 classes...C'est sûr qu'en ayant pour l'instant une seule, je ne voyais pas...

    L'echo exact que j'obtiens est
    chargement du fichier (auto_loader) : C:\wamp\www\eis\eis\new\class_MyPdo.php
    et le message d'erreur est
    Fatal error: Class 'MyPdo' not found in C:\wamp\www\eis\eis\connect_mysql.php on line 9

  8. #8
    Membre chevronné
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Par défaut
    Salut Laurent,

    Le problème de ton problème, c'est qu'il n'existe pas dans mon environnement de test. Chez moi, il trouve les classes autolodées...
    Quelle est ta version de php ? (< 5.1.2, spl_autoload_register n'existe pas, peut-être cela vient de là).

    En tout cas, tu peux tester le code suivant, qui fonctionne sur mon wampserver.

    structure:
    Nom : structure_code.jpg
Affichages : 195
Taille : 19,1 Ko

    codes:
    index.php à la racine :
    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
     
    <?php
    session_start();
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);
    ini_set('display_errors','1'); 
     
    header('Content-type: text/html; charset=UTF-8');
    require_once 'lib/utils/Autoload.php';
     
    include ('connect_mysql.php');
     
    $maClasse = new maClasse();
     
    $maClasse->__toString();


    connect_MySQL.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
    /*if(empty($bdd)){
    	include_once (dirname(__DIR__).'\\eis\new\class_MyPdo.php');
    }*/
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
        $bdd = new MyPdo("dbName");
        var_dump("?????");
    }
    catch(PDOException $e){
        echo "argggggggggggggg".$e->getMessage();
        return(FALSE);
    }		
    ?>

    lib/db/class_MyPdo.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
    23
     
    <?php
     
    // MyPDO
    class MyPdo extends PDO {
     
    	protected $DB_NAME;
    	protected $HOST = "localhost";
    	protected $USER ="root";
    	protected $PASS ="xxxxxxxx";
     
     
     
    	function __construct($db_name) {	
     
     
    	$this->DB_NAME = $db_name;
    	parent::__construct("mysql:host=$this->HOST;dbname=$this->DB_NAME",$this->USER,$this->PASS);
     
    	}
     
    }
    ?>

    lib/utils/Autoload.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
     
        set_include_path(PATH_SEPARATOR.dirname(dirname(__FILE__)));
        //echo(get_include_path());
        spl_autoload_register(function ($classe) {
            $possibilities = array(
                "db/class_".$classe . '.php',
                "autres/class_".$classe . '.php',
            );
            foreach ($possibilities as $file) {
                if (file_exists(dirname(dirname(__FILE__)).'/'.$file)) {
                    //echo $i." autoload ".$file."<br />";
                    require_once($file);
                    return true;
                }
            }
            return false;
        });

    lib/autres/class_maClasse.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
    class maClasse {
        //put your code here
     
        function __construct() {	
     
     
    	var_dump("construct de ". get_class($this));
     
        }
     
        public function __toString() {
            echo("toString de ". get_class($this));;
        }
    }

    Et avec tout ça, respecte la casse car une majuscule rajoutée ou enlevée et plus rien de marche !

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

Discussions similaires

  1. [WD9] Utiliser une fonction d'un ActiveX avec pointeur
    Par archimor dans le forum WinDev
    Réponses: 3
    Dernier message: 21/03/2006, 00h41
  2. [Débutant] Déclarer, utiliser une fonction
    Par Hokagge dans le forum Langage
    Réponses: 7
    Dernier message: 14/03/2006, 08h03
  3. Réponses: 10
    Dernier message: 10/02/2006, 14h23
  4. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15
  5. Utiliser une fonction
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/08/2005, 07h53

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