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 :

Inclusion automatique des classes et résolution automatique de chemin de fichier


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut Inclusion automatique des classes et résolution automatique de chemin de fichier
    Salut !

    Je fais des tests pour comprendre comment la fonction spl_autoload() fonctionne.

    En local, j'arrive à faire fonctionner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $includeFolder = "common/includes/";
    set_include_path(get_include_path().PATH_SEPARATOR.$includeFolder);
    spl_autoload_extensions('.class.php');
    spl_autoload_register();
     
    use nbcore\fb\Facebook;
    $facebook = new Facebook(); //correspond au fichier common/includes/nbcore/fb/Facebook.class.php
    En revanche quand je passe sur le serveur, ça ne fonctionne pas. J'ai tenté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $includeFolder = __DIR__."/common/includes/";
    Mais c'est comme si la résolution des namespace vers des noms de dossiers ne fonctionnait pas. Car si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include("nbcore/fb/Facebook.class.php");
    Cela fonctionne, ce qui prouve que l'include_path est bien défini et fonctionnel.

    D'où cela peut-il venir ? En local j'exécute PHP 5.4.12 sous Windows, sur le serveur distant PHP 5.3.3-7 sous Debian.

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    Citation Envoyé par MonsieurPoulet Voir le message
    Salut !

    Je fais des tests pour comprendre comment la fonction spl_autoload() fonctionne.
    pour comprendre c'est pas le bon code car tu gère rien;
    ici tu gères tout (code de traitement a ecrire ...)

    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
    spl_autoload_register(function ($class) {
        // the project namespace prefix
        $prefix = '/common/includes/';
     
        // traitement particulier ....
        $class= str_replace('\\', '/', $class);
        // on peut decouper en $path - $ClassName - extension (".class.php")
        // ..
     
       // par exemple
       file = __DIR__ . $prefix . $class .'.classes.php';
     
       // on execute
       if (is_readable($file)) {
           include $file;
       }
      // else echo $file.' non chargée !';
     
    });
    mais bonne méthode est de ce faire un classLoader (exemple):
    https://github.com/php-fig/fig-stand.../autoloader.md

    ps : NomClasse.classe.php beurk, code non actuel

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    L'idée c'est justement de se passer de cette fonction définie par l'utilisateur !

    Lis le post de "a dot schaffhirt at sedna-soft dot de" sur la page officielle de la doc :
    http://php.net/manual/fr/function.sp...d-register.php

    La fonction définie par l'utilisateur vient réécrire une routine à la base écrite en C et est donc nettement moins performante.

    De plus, tu ne réponds pas à ma question, puisque le bout de code que j'ai indiqué fonctionne en local : il n'est donc pas faux.

    Edit :
    Note, je ne veux pas lancer de polémique ni sur les best practices, ni sur l'usage de spl_autoload() avec ou sans fonction définie par l'utilisateur, mais juste trouver une réponse à ma question de base

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    Justement je répond a ta question : " pour comprendre comment fonctionne"
    en fait tu désires juste comprendre comment utiliser

    ...est donc nettement moins performante
    lol, si tu désires la performance oublie simplement l'autoload et n'utilise que include() ou require().
    ici tu utilises une "vielle notation .class.php", si tu désire aussi utiliser une bibliotheque moderne (ou encore + ancienne), comment vas tu faire ?

    set_include_path() est presque obselete depuis pas mal de temps !
    c'etait la méthode avant les namespaces et oui ta reference dans la doc a 4 ans !

    Pour ton probleme :
    1) je suppose que tu sait qu'il y a une différence minuscule-majuscule sur Linux (contrairement a windows)
    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $includeFolder = __DIR__."/common/includes/";
    c'est évident, c'est le but de l'autoloader, on ajoute un chemin absolut !

    3) suis pas sur que tu sache différence chemin absolut-relatif ?
    ligne 6 fait un echo get_include_path() pour voir si hebergeur permet ceci.

    ton test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include("nbcore/fb/Facebook.class.php");
    ce qui veut dire que tu executes ce code dans "common/includes" ou pas ?

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    Je vais passer sur la condescendance du propos - après tout je poste dans "débutant", j'imagine que je savais à quoi m'en tenir.

    1) Oui. En quoi c'est important ici ?
    2) Ça n'a rien d'évident, et pour preuve ça fonctionne en local.
    3) Ça me donne un long chemin relatif à la racine du serveur. Et oui du coup l'include_path est bon puisque je peux correctement appeller des classes qui ne seraient pas visibles autrement. Comme expliqué dans mon premier post.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    1) un Vrai débutant peut créer un dossier "/Common/includes/"

    2) set_include_path rempli une variable PATH exectement comme tu as sur windows, le PATH est une liste de chemins ABSOLUTS, les chemins ou rechercher les fichiers

    3) possible de mettre echo spl_autoload_extensions() pour voir si ok

    si tu vois .../icommon/includes et ".class.php"

    ton code est bon et bien interprété par ton php (serveur)
    si charge bien par include set_include_path() est ok

    reste a tester use \nbcore\fb\Facebook; (nbcore a la racine !)

    et te repete :
    set_include_path() est presque obselete depuis pas mal de temps !
    c'etait la méthode avant les namespaces et oui ta reference dans la doc a 4 ans !
    tu pars sur une mauvaise méthode avec l'autoload, pour débuter un framework, pas bon.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    J'ai testé \nbcore\fb\Facebook sans succès.

    echo get_include_path() renvoie bien le bon chemin absolu.
    echo spl_autoload_extensions() renvoie bien ".class.php"

    C'est dommage que ça ne fonctionne pas je trouvais la méthode élégante (elle avait le mérite de donner une syntaxe un peu AS3/Java que je trouve assez lisible).

    En AS3 "import com.patate.Patate" fait référence au fichier "com/patate/Patate.as" et te permet d'utiliser la classe Patate par la suite.

    La méthode avec la classe qui sert d'Autoloader est lourdingue syntaxiquement parlant. Je vais tester néanmoins, mais j'essaie toujours de faire marcher ce bout de code

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    tu préfères utiliser 2 fonction plutôt qu'une class ? pour quelqu'un qui désire se mettre a la poo ...

    Comprend pas avec une classe autoloader , j'ai avec les namespaces la même syntaxe que java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php namespace Illuminate\Http;
     
    use Illuminate\Support\MessageBag; // je charge  .../MessageBag.php !!!!!!!!!!!
    use Symfony\Component\HttpFoundation\Cookie;
    use Illuminate\Session\Store as SessionStore;
    use Illuminate\Support\Contracts\MessageProviderInterface; // charge class MessageProviderInterface.php !!!!!!!!!
     
    class RedirectResponse extends \Symfony\Component\HttpFoundation\RedirectResponse {
    }
    edit : et justement on n'utilise pas de fichiers NomClass.class.php !

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    si tu as lu Code Bright
    Laravel rajoute 2 couches "lourdingue" objet sur l'autoloader :
    IOC et Facades

    j'ai écrit : http://www.webstratege.fr/ioc-de-laravel-pour-les-nuls/

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    T'es un peu pipelette toi non ? Sans animosité hein.

    Ton autoloader c'est une encapsulation de spl_autoload_register(). C'est pas que je ne considère pas la solution. C'est juste que c'est pas la réponse à ma question !

    C'est un peu comme si je te disais "hey j'ai cette pièce dans ma Peugeot qui ne marche pas" et que tu me disais "pas de problème, utilise plutôt une Porsche". Oui j'aime les analogies débiles. Ca ne veut pas dire que je vais pas utiliser la Porsche (surtout que dans le cas présent elle est gratuite !), juste que je veux comprendre pourquoi ma Peugeot démarre pas. Rien à voir avec mon envie de monter en compétence en POO, etc.

    Evidemment que ta solution est meilleure, je veux juste comprendre pourquoi la mienne foire. XD

    Si tu veux vraiment m'aider a effectuer mon travail de deuil, voici un pastebin dans lequel tu pourras retrouver mes aventures :
    http://pastebin.com/5UiBjetf

    Juste deux fichiers à reproduire

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    oui , je radote, car dans precedent post tu dis vouloir passer a poo et bonnes méthodes "design pattern".

    La c'est les "mauvaises" méthodes, et lorsque je te parle de d'objet tu reponds "lourdingue syntaxiquement", je comprend +

    tu sais avec php3 on pouvais faire un echo $toto directement a la place d'un $_POST['toto'], et bien la "Peugeot" php3, je m'en tape

    Si j'ai répondu a ce post , c'était donc pour te dire que tu partais mal et pas pour répondre a un probleme que je ne verrai surement jamais de ma vie.

    -----------------------------
    pour ton paste je developpe sous linux, donc, tres facile : car moi c'est un probleme de Majuscule Test.class.php ne passe pas mais test.class.php est ok
    la "Peugeot" elle fume ! '(et pas que du bon)
    Il faut mettre le nom de fichier en minuscule ????? bien sur avec vrai class autoloader il n'y a pas de probleme

    ajoute comme moi , un nouveau fichier avec reponse en minuscule et regarde lequel il charge...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php // mon/outil/test.class.php
    namespace mon\outil;
    class Test
    {
        public function __construct()
        {
            echo "tralala !";
        }  
    }

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    Magnifico c'était bien ça. Tu peux m'expliquer du coup le coup des majuscules sous linux ?

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    Citation Envoyé par MonsieurPoulet Voir le message
    Magnifico c'était bien ça. Tu peux m'expliquer du coup le coup des majuscules sous linux ?
    ? tu le sais deja que linux différencie majuscule - minuscule ! test.php et un autre fichier que Test.php
    La apparemment c'est un bug de php :
    il a l'air de vouloir charger automatiquement le "use" en minuscule

    Bien sur la bonne syntaxe c'est Majuscule au nom de Classe et Majuscule au nom du fichier

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    Merci !

    Le bug est dépendant de la version de PHP ou de l'OS ?

  15. #15
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    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 333
    Par défaut
    suis en php5.4

    pour l'OS lol, php doit tourner sous linux la version windows n'est pas vraiment l'officielle. Donc si il y a bug c'est windows.

    Sérieusement utilise le loader "normalement" et il n'y aura pas de probleme. Et pour les tres anciennes classes, normalement on ne les utilise plus, sinon on utilise simplement un require().

    Chaque framework a son propre loader(tiré de psr-0) et il existe aussi pour une bibliotheque github "composer" qui génère un autoloader.

    edit :
    Ma peugeot est au fond du jardin a rouiller depuis 3 ans, alors savoir qu'elle avais peut-être un probleme de frein, ne m'intéresse même pas

  16. #16
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2013
    Messages : 14
    Par défaut
    Merci encore !

Discussions similaires

  1. Créer des classes d'ontologie automatiquement
    Par keddari dans le forum Ontologies
    Réponses: 1
    Dernier message: 29/08/2012, 23h26
  2. Import automatique des classes utilisées dans la javadoc.
    Par onlytoine dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 03/03/2009, 12h49
  3. Réponses: 1
    Dernier message: 17/04/2007, 18h21
  4. [C++ / UML] Diagramme des classes automatique
    Par poukill dans le forum C++
    Réponses: 5
    Dernier message: 26/02/2007, 12h23
  5. [JUnit] Génération automatique des classes de tests
    Par sidi.elmoctar dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/08/2006, 01h54

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