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 :

Instanciation de class


Sujet :

Langage PHP

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Instanciation de class
    Bonjour à toutes et tous,

    Tout d'abord je vous souhaite de belles fêtes et une fin d'année radieuse.
    Pour 2018, continuez sur le même thème et tout ira bien.

    Bon ceci étant fait, voici mon tracas du jour.
    Je reprends PHP après quelques années d'absence et je cale.
    J'ai une classe : class_test.class.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
    <?php
    /**************************************************
    *
    * Test
    *
    *
    *************************************************/
    class test
    {
    	var $dbHost = "";
     
    	// méthode
        	function afficher()
        	{
        	    echo $this->dbHost;
        	}
    }
    ?>
    J'ai un script qui appelle instancie cette classe : conf_global.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
    <?php
    session_start();
    error_reporting(E_ALL & ~E_NOTICE);
    $application = "test";
    // Chemin physique du site
    $href = "http://".$_SERVER['HTTP_HOST']."/";
    $_SESSION['href_relatif'] = $href;
     
    // Chemin absolu
    $href_abs = $_SERVER['DOCUMENT_ROOT'].$application;
    $_SESSION['href_absolu'] = $href_abs;
     
    require_once($href_abs."/inc/fonctions.php");
    echo ($href_abs);
    if (!set_include_path($href_abs.'/class/'.PATH_SEPARATOR.get_include_path()))
      die('Cannot register include path');
     
    spl_autoload_extensions('.class.php');
    spl_autoload_register();
     
    // testons tout ça
    var_dump( class_exists('test', true) );
    $test = new test;
    $test->afficher();
    $test->dbhost = "localhost";
    $test->afficher();
    ?>
    À l'exécution, c'est pas terrible, j'ai le message suivant à la ligne 22 qui est mon var_dump
    Fatal error: Uncaught exception 'LogicException' with message 'Class test could not be loaded' in C:\wamp\www\test\inc\conf_global.php on line 22
    Suivi de
    ( ! ) LogicException: Class test could not be loaded in C:\wamp\www\test\inc\conf_global.php on line 22
    Call Stack
    # Time Memory Function Location
    1 0.0010 140904 {main}( ) ..\index.php:0
    2 0.0010 145936 require_once( 'C:\wamp\www\test\inc\conf_global.php' ) ..\index.php:3
    3 0.0050 536752 class_exists ( ) ..\conf_global.php:22
    4 0.0050 537008 spl_autoload ( ) ..\conf_global.php:22
    J'utilise pour la 1ère fois "spl_autoload" que j'ai trouvé ici sur ce forum
    Citation Envoyé par Benjamin Delespierre Voir le message
    Conseil: utilise un seul fichier .php par classe et donne lui l'extension .class.php.
    Ensuite, mets en place un autoloader pour charger les classes à la demande, c'est très simple si tu as tous tes .class.php dans un même répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    if (!set_include_path('chemin/ver/test/classes'.PATH_SEPARATOR.get_include_path()))
      die('Cannot register include path');
     
    spl_autoload_extensions('.class.php,.php,.inc');
    spl_autoload_register();
     
    // testons tout ça
    var_dump( class_exists('Model', true) );
    De cette façon tu n'auras plus jamais à t'occuper du chargement des classes, ce sera automatique
    Mon erreur vient-elle d'une mauvaise utilisation de ce code ?
    Merci pour votre partage de neurones.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    pour utiliser "spl_autoload", le nom du fichier doit commencer par le nom de la classe, donc essayez avec "test.class.php"

    autre solution : écrivez vous même le chargeur de classe à l'aide de la fonction http://php.net/spl_autoload_register

  3. #3
    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 : 47
    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,

    une discussion en cours qui pourrait t'apporter des réponses par ici

  4. #4
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par mathieu Voir le message
    pour utiliser "spl_autoload", le nom du fichier doit commencer par le nom de la classe, donc essayez avec "test.class.php"

    autre solution : écrivez vous même le chargeur de classe à l'aide de la fonction http://php.net/spl_autoload_register
    Merci cela fonctionne.

    Alors j'ai fait quelques modifications pour commencer une classe MySqli et je teste pas à pas pour voir au fur et à mesure mes erreurs éventuelles.
    J'ai juste changer le nom de la classe de "test" en "MySqli"
    Et j'ai une erreur :
    Fatal error: Call to undefined method mysqli::afficher() in C:\wamp\www\test\inc\conf_global.php on line 24
    J'ai donc : conf_global.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
    <?php
    session_start();
    error_reporting(E_ALL & ~E_NOTICE);
    $application = "test";
    // Chemin physique du site
    $href = "http://".$_SERVER['HTTP_HOST']."/";
    $_SESSION['href_relatif'] = $href;
     
    // Chemin absolu
    $href_abs = $_SERVER['DOCUMENT_ROOT'].$application;
    $_SESSION['href_absolu'] = $href_abs;
     
    require_once($href_abs."/inc/fonctions.php");
    echo ($href_abs);
    if (!set_include_path($href_abs.'/class/'.PATH_SEPARATOR.get_include_path()))
      die('Cannot register include path');
     
    spl_autoload_extensions('.class.php');
    spl_autoload_register();
     
    // testons tout ça
    var_dump( class_exists('MySqli', true) );
    $MySqli = new MySqli;
    $MySqli->afficher();
    $MySqli->dbHost = "toto";
    $MySqli->afficher();
    ?>
    Et ma classe : MySqli.class.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
    <?php
    /**************************************************
    *
    * Test
    *
    *
    *************************************************/
    class MySqli
    {
    	var $dbHost = "dbhost";
     
    	// méthode
        	function afficher()
        	{
        	    echo $this->dbHost;
        	}
    }
    ?>
    Alors pourquoi ça ne fonctionne plus ?
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

Discussions similaires

  1. [JAR]Instancier une classe d'un jar
    Par Foub dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/08/2005, 15h10
  2. Réponses: 3
    Dernier message: 13/08/2005, 15h18
  3. [MFC] où instancier mes classes?
    Par giova_fr dans le forum MFC
    Réponses: 3
    Dernier message: 26/07/2005, 13h15
  4. [Débutant(e)]Instancier une classe connaissant son nom (String)
    Par Invité dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/06/2005, 11h05
  5. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00

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