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 :

Fichier de test d'une classe


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut Fichier de test d'une classe
    Bonjour,
    Je crée un fichier de test d'une classe et je n'arrive pas à m'affranchir des erreurs (et j'en ai plusieurs à faire sur le même modèle).
    Mon problème est qu'avant de tester ma classe, je veux vérifier que les fichiers nécessaires existent et je coince sur l'emplacement des namespaces et du mot clef 'use'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //use OptListSelect\OptListSelect;
     
    $erreur = array();
    require_once("../config.php");		// Dans lequel est la définition de URL_SITE
     
    define('TEST_FILE', URL_SITE."classes/moimp/OptListSelect.php");
    if (! file_exists(TEST_FILE)) {
    	echo sprintf("Le fichier '%s' n'existe pas.", TEST_FILE);
    }
    else {
    	require_once(TEST_FILE);
    	//use OptListSelect\OptListSelect;
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 319
    Points : 640
    Points
    640
    Par défaut
    Bonjour,

    Difficile de comprendre le problème sans le message d'erreur ni le code de la classe.

    Pour importer la classe avec require_once, il faut renseigner le chemin relatif ou absolu de la classe via le système de fichier et pas via le protocole HTTP : par exemple require_once("./classes/moimp/OptListSelect.php") ou require_once("/var/www/monprojet/classes/moimp/OptListSelect.php");
    Si la constante URL_SITE contient bien une URL, ton require_once est surement incorrect : require_once('http://localhost/classes/moimp/OptListSelect.php'); via HTTP ne retourne pas le même résultat.

  3. #3
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 754
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour

    Il s'agit de la fonctionnalité première de composer qui a été développé exactement pour rencontrer ce besoin : https://getcomposer.org/

    Le logo est môche et semble dater du siècle dernier mais il ne faut pas s'arrêter à ça, composer est indispensable quand on code en php et qu'on travaille, comme tu le fais, avec des classes.

    Tu devras définir ton projet dans un fichier nommé composer.json et y définir le chemin vers tes classes.

    Ensuite tu lanceras "composer update" dans ta console pour générer le dossier vendor qui contiendra alors un fichier nommé autoload.php.

    Plus d'explications sur le site de composer.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par Pytet Voir le message
    Pour importer la classe avec require_once, il faut renseigner le chemin relatif ou absolu de la classe via le système de fichier et pas via le protocole HTTP : par exemple require_once("./classes/moimp/OptListSelect.php") ou require_once("/var/www/monprojet/classes/moimp/OptListSelect.php");
    Si la constante URL_SITE contient bien une URL, ton require_once est surement incorrect : require_once('http://localhost/classes/moimp/OptListSelect.php'); via HTTP ne retourne pas le même résultat.
    Merci pour cette remarque qui résout une partie du problème.
    Mon code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    define('TEST_FILE', substr(__DIR__, 0, strlen(__DIR__)-5)."classes/moimp/OptListSelect.php");
    if (! file_exists(TEST_FILE)) {
    	echo sprintf("Le fichier '%s' n'existe pas.", TEST_FILE);
    }
    else {
    	require_once(TEST_FILE);
    	use OptListSelect\OptListSelect;		// génère une erreur unexpected token "use"
    }
    Il me semble que le mot clef use doit être placé en début de code mais je ne vois pas comment faire si je veux tester l'existence du fichier contenant la classe au préalable.

  5. #5
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    use OptListSelect\OptListSelect; // génère une erreur unexpected token "use"
    J'ai eu la même erreur en utilisant PHPMailer et la fonction "use", j'ai su solutionner en ne l'utilisant plus (intégré directement dans le code) : une solution à l'erreur de use m'intéresse donc également

  6. #6
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 319
    Points : 640
    Points
    640
    Par défaut
    Le mot clé use doit effectivement être utilisé dans le contexte global : https://www.php.net/manual/fr/langua...mporting.scope
    Il ne faut pas confondre les espaces de noms et le chargement automatique des classes, les deux sont souvent liés mais c'est deux notions différentes. Faire un require et use de toutes tes classes dans le point d'entrée de ton application n'est pas la bonne approche.

    Comme indiqué par Cavo, le mieux est surement de suivre le standard PSR-4 et d'utiliser l'autoload de composer.

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 364
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Citation Envoyé par cavo789 Voir le message
    Bonjour
    Il s'agit de la fonctionnalité première de composer qui a été développé exactement pour rencontrer ce besoin : https://getcomposer.org/
    Citation Envoyé par Pytet Voir le message
    Comme indiqué par Cavo, le mieux est surement de suivre le standard PSR-4 et d'utiliser l'autoload de composer.
    A noter que j'ai d'abord essayé d'utiliser l'autoloader de Composer mais que celui-ci ne trouvait pas une de mes classes. Je l'ai remplacé par un autoloader de rawsrc (ex-modo de DVP et très fort) et le problème a été résolu. Du coup, je mets en doute la qualité de l'autoloader généré par Composer.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 088
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 088
    Points : 8 184
    Points
    8 184
    Billets dans le blog
    17
    Par défaut
    L'autoloader de Composer ayant fait ses preuves depuis des années sur des millions de projets, perso j'ai plutôt tendance à mettre en doute la manière dont tu l'as utilisé
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 754
    Points : 2 985
    Points
    2 985
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Du coup, je mets en doute la qualité de l'autoloader généré par Composer.
    Composer est très largement éprouvé. Il fonctionne, cela ne fait strictement aucun doute.

    Ton souci était chez toi, par exemple dans le nommage de ta classe ou la localisation de ton fichier versus la configuration que tu as faite dans composer.json.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 364
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    OK ; en effet, le problème ne venait pas de composer. J'ai un peu modifié la structure de mon projet (j'ai créé un répertoire src et mis les fichiers sources dedans) puis adapté composer.json :
    Code json : 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
    {
      "name": "schmitt/pasdpanique",
      "description": "",
      "type": "project",
      "license": "MIT",
      "authors": [
        {
          "name": "Laurent Schmitt",
          "email": "xxx@gmail.com"
        }
      ],
      "keywords": [
        "php"
      ],
      "minimum-stability": "dev",
      "require": {
        "php": ">=8.0",
        "phpmailer/phpmailer": "dev-master",
        "rawsrc/phpecho": "dev-master"
      },
      "autoload": {
        "psr-4": {
          "PasDePanique\\": "src/"
        }
      }
    }
    puis composer update puis remis le bon include dans mon index.php (point d'entrée unique) : require DIR_ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; //autoload de composer et c'est bon (du moins pour ça car du coup, je n'ai plus que cet autre problème : https://www.developpez.net/forums/d2...-cette-classe/)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

Discussions similaires

  1. Trouver les fichiers compilés à partir d'une classe Java
    Par Foogiz972 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 04/09/2012, 10h55
  2. [EJB3.1] Test d'une class @Stateless avec façade
    Par Alskar dans le forum Java EE
    Réponses: 3
    Dernier message: 14/05/2012, 08h26
  3. Réponses: 3
    Dernier message: 11/07/2011, 18h07
  4. [JUnit] comment écrire des test dans une classe DAO
    Par nouramin dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 23/04/2010, 11h05
  5. [FPDF] Générer deux fichiers PDF à partir d'une classe
    Par doreen07 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 31/10/2007, 11h17

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