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 :

Balbutiement avec les espaces de noms


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut Balbutiement avec les espaces de noms
    Bonjour,
    Je commence à avoir des problèmes de conflits et je me tourne vers les namespaces.

    J'ai un fichier TEST_CLASSES.php situé dans /root:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    spl_autoload_register(function($class) {
    	$path = "classes/".$class.".class.php";
    	if (is_file($path)) {
    		require $path;
    	}
    });
     
    use moimp\inputsCtl as inputsCtl;
     
    $test = new inputsCtl();
    $a = $test->ctl_password('abcdef', 2, 8, inputsCtl::CHECK_LOWER);
    et une classe de test située dans /root/classes/inputsCtl.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    namespace moimp\inputsCtl;
     
    /**
     * Classe rassemblant les contrôles de saisie de formulaire
     */
     
    class inputsCtl {
     
    	// CONSTANTES
     
    	// Contrôle de mot de passe
    	const CHECK_LOWER = 1<<0;
    	const CHECK_UPPER = 1<<1;
    	const CHECK_DIGIT = 1<<2;
    	const CHECK_NON_ALNUM = 1<<3;
     
    	const PATTERNS = [
    		CHECK_LOWER => '#[a-z]#',
    		CHECK_UPPER => '#[A-Z]#',
    		CHECK_DIGIT => '#\d#',
    		CHECK_NON_ALNUM=> '#[^[:alnum:]]#',
    	];
     
    	// VARIABLES
     
    	// METHODES
    	public function ctl_password(string $pw, int $min=0, int $max=0, int $types=0):bool {
     
    		if ( $min !=0 and mb_strlen($pw) <$min ) return false;
    		if ( $max !=0 and mb_strlen($pw) >$max ) return false;
    		if ( $types ) {
    			foreach (PATTERNS as $key=>$pattern) {
    				if ( 0 != ($types & $key) and !preg_match($pattern, $pw) ) { return false; }
    			}
    		}
    		return true;
    	}
    }
    EDIT: J'oubliais l'essentiel, le message d'erreur:
    Class 'moimp\inputsCtl' not found in C:\wamp64\www\monRepertoire\TEST_CLASSES.php:12 Stack trace: #0 {main} thrown in C:\wamp64\www\monRepertoire\TEST_CLASSES.php on line 12
    . Pourquoi PHP ne trouve t-il pas la classe?
    EDIT2: Corrigé une erreur ligne 4 du fichier TEST_CLASSES.php
    EDIT 3: Correction d'une erreur / au lieu de \ ligne 2 du fichier de classe

    Question annexe: Existe t-il une possibilité d'utiliser les constantes de classes sans utiliser les :: comme cela se fait pour les fonctions natives de PHP? Où sont elles définies dans ce cas dans PHP.

  2. #2
    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,

    un peu de lecture par ici

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Bonjour,
    Merci pour cette idée intéressante. Cependant, je me pose deux questions principales.
    1-De façon native dans PHP et sur les tutos que j'ai lu, le mot use définit-il le namespace seul or dans ton exemple, il semble désigner le nom complet de la classe c'est à dire namespase+class ?
    2-Je prévois plusieurs difficultés liées à l'arborescence physiques des fichiers et des classes, lesquels peuvent être regroupé en trois catégories:
    • Les classes anciennes sans namespaces regroupées sans distinction dans un répertoire racine/classes/
    • Les classes chargées à partir de bibliothèques (PHPMailer par exemple)
    • Les classes avec namespace enregistrées comme tu le préconises.

    Si tu préfères je peux transférer ma question 2 sur ton blog indiqué ci-dessus.

  4. #4
    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
    la spécification précise que le use indique le nom absolu de la classe que tu vas utiliser dans ton code (c'est pour cette raison que la syntaxe use \namespace1\class1 désignant l'espace de nom global est déconseillée, il est préférable de faire juste use namespace1\class1).

    ensuite pour gérer le chargement des classes c'est une autre problématique : il va te falloir pondre un chargeur de classes (autoloader) qui soit capable de se débrouiller avec tes cas de figure même exotiques.
    en gros tu dois aborder le problème avec en tête la notion de point d'entrée dans ton code.

    il te faudra un fichier de paramétrage des points d'entrée dans lequel tu indiqueras par exemple que le point d'entrée des classes sur l'espace de nom global correspond à tel répertoire, que le point d'entrée de l'application PHPMailer est à rechercher dans ce dossier, etc...
    Si tu n'utilises pas un autoloader pré-codé comme composer par exemple, c'est un chouette exercice de conception (il va falloir se creuser un peu les méninges)

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Merci, je vais essayé de me débrouiller avec tout ça.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Bonjour,
    Après avoir lu et cherché à appliquer un cours sur l'architecture professionnelle en utilisant MVC, je démarre un nouveau projet et je galère sur la déclaration des namespaces et mon spl_autoload_register selon le blog de @rawsrc.
    Je trouve fastidieux de répéter l'arborescence complète de la classe dans le namespace qui devient trop long.

    Voici l'arborescence où se trouve ma classe:
    root/common/classes/moimp/nom_classe/nom_classe.php

    Code de mon spl_autoload_register:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    spl_autoload_register(function($fullClassName) {
    	echo __line__; var_dump($fullClassName);echo '<br/>';
    	$name = str_replace('\\', DIRECTORY_SEPARATOR, $fullClassName);
    	echo __line__, $name, '<br/>';
    	// Classes historiques MP
    	$path = DIR_CLASSES.$name.'.class.php';
    	if ( is_file($path) ) { require $path; return true; }
    	// Classes standardisées avec namespace = répertoire
    	$path = DIR_CLASSES.$name.'.php';
    	echo __line__, $path, '<br/>';
    	if ( is_file($path) ) { require $path; return true; }
    	// Classes tierces
    	return false;
    });
    Tous les echo me retourne les bonnes valeurs mais la classe n'est pas trouvée.
    DIR_CLASSES contient 'root/common/classes/'
    A titre d'exemple la variable fullClassName contient 'moimp\nom_classe\nom_classe', le namespace vaut 'moimp\nom_classe' et la classe s'appelle 'nom_classe'.

    Il me semble que ceci est correct, pourtant la classe n'est pas trouvée.

  7. #7
    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,

    euh, tu relis parfois ton code ?

    Regarde ce que tu y a mis : $path = DIR_CLASSES.$name.'.class.php'; zieute surtout le .class.php et dans tes explications tu dis que le chemin absolu du fichier est root/common/classes/moimp/nom_classe/nom_classe.php, zieute surtout le nom_classe.php, tu n'y vois pas une différence toi ?

    Pour ce qui est des espaces de noms à rallonge te ne peux rien y faire à moins de réorganiser ton code.

    Personnellement, tous mes codes sont organisés par concept : Client, Utilisateur... qui correspondent à un unique point d'entrée : root/projects/projectA/web/src

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Bien sûr qu'il y a une différence: Comme je l'ai indiqué en commentaires, je distingue deux cas:
    • Mes anciennes classes avec le .class.php qui fonctionne.
    • Mes nouvelles classes selon les explications de ton blog. C'est sur cette partie que j'ai des difficultés.

    Le premier cas me permet d'utiliser mes anciennes classes en attendant de les réécrire. Il fonctionne.
    Si le premier cas n'a pas donné de résultat, je traite le deuxième cas. Seul le deuxième cas me préoccupe et fait l'objet de ma question (donc seules les lignes 8 et suivantes nous intéressent):
    Sur un exemple réel, la ligne 10 de mon code renvoie common/classes/moimp\LinkToStylesheet\LinkToStylesheet.php
    et j'obtiens une erreur:
    Uncaught Error: Class 'moimp\LinkToStylesheet\LinkToStylesheet' not found
    où on voit qu'il manque le début du chemin et je ne comprends pas pourquoi.

  9. #9
    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
    s'il te manque le début de chemin c'est que lors de l'appel de tes nouvelles classes, DIR_CLASSES n'est pas initialisé
    Tu peux tester l'existence de la constante avec defined(), comme ça tu en auras le cœur net
    D'ailleurs l'alternance de tes séparateurs : un coup / et au autre \ indiquerait qu'il y a un autre traitement fait par ailleurs sur le chargement des classes

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Décidément, je ne m'en sors pas.
    D'une part, le echo de ma ligne 10 prouve que le DIR_CLASSES est bien défini, d'autre part le test avec defined le confirme. Cette ligne affiche bien le chemin complet.
    Ensuite j'ai fait le test de mettre les séparateurs dans le même sens (j'ai testé dans les deux sens) et j'ai toujours l'erreur.

  11. #11
    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
    poste clairement tout le débogage, il se peut que cela soit simplement qu'un problème de majuscule/minuscule

  12. #12
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Appel de la classe depuis le fichier index.php à la racine du site:
    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
    <?php
     
    ob_start();
     
    require_once('common/tools/defines.php');
    require_once(COMMON_HEAD_PHP);
     
    use moimp\LinkToStylesheet\LinkToStylesheet;
     
    $arrCSS = [DIR_CSS.'structure.css'=>'all', DIR_CSS.'style0.css'=>'screen'];
     
    $strCSS = new LinkToStylesheet($arrCSS);
     
    require('indexView.php');
     
    ob_end_flush();
    Contenu de COMMON_HEAD_PHP (head_php.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
    <?php
     
    if ( empty(session_id()) ) session_start();
    require_once('common/tools/defines.php');
    require_once(COMMON_FUNCTIONS_PHP);
    $isIncluded = true; // La variable $isIncluded permet aux fichiers inclus de reconnaître si ils le sont afin de les rediriger dans le cas inverse.
     
    // Recherche automatique des classes
    // autoloader d'après https://www.developpez.net/forums/blogs/32058-rawsrc/b5109/autoloader/
    spl_autoload_register(function($fullClassName) {
    	$name = str_replace('\\', DIRECTORY_SEPARATOR, $fullClassName);
    	// Classes historiques MP
    	$path = DIR_CLASSES.$name.'.class.php';
    	if ( is_file($path) ) { require $path; return true; }
    	// Classes standardisées avec namespace = répertoire
    	$path = DIR_CLASSES.$name.'.php';
    	echo __line__, ': ', $path, '<br/>';
    	if ( is_file($path) ) { require $path; return true; }
    	// Classes tierces
    	return false;
    });
    Contenu de defines.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    // Chemins
    define('URL_SITE', "http://".$_SERVER['HTTP_HOST']."/");
    define('COMMON_HEAD_PHP', "common/includes/head_php.php");
    define('COMMON_FUNCTIONS_PHP', "common/tools/functions.php");
    define('DIR_LANGUAGES', "common/lang/");
    define('DIR_CLASSES', "common/classes/");
    define('DIR_IMAGES', "common/images/");
    define('DIR_CSS', "common/css/");
    Et le début de ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
     
    namespace moimp\LinkToStylesheet;
     
    class LinkToStylesheet {
    }

  13. #13
    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
    Dans mon tuto sur les espaces de nom, je définis la racine du site ainsi : define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR);, tu devrais en faire autant : define('DIR_CLASSES', __DIR__.DIRECTORY_SEPARATOR.'common'.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR);.
    Avec cette syntaxe, il faut ABSOLUMENT que ton fichier de définition des constantes se trouve à la racine du site

  14. #14
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    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 579
    Points : 804
    Points
    804
    Par défaut
    Je suis vraiment désolé de t'avoir dérangé pour rien mais après des dizaines de vérifications, il restait une faute de frappe dans mon nom de fichier.

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

Discussions similaires

  1. [Doctrine2] Problème d'alias avec les espaces de noms (chemin d'accès windows)
    Par the_angel dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 18/03/2011, 01h30
  2. [Winsock] Problème avec les espaces
    Par Fiquet dans le forum Développement
    Réponses: 3
    Dernier message: 12/01/2006, 18h06
  3. [XSL] problème avec copy espace de nom
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 15h18
  4. Supprimer les espaces des noms de fichier
    Par Cathy dans le forum Linux
    Réponses: 20
    Dernier message: 04/08/2005, 17h13
  5. [typedef] protection à travers les espaces de noms
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 7
    Dernier message: 02/02/2005, 20h21

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