"use" ne fonctionne pas

Fermé
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 - 19 mai 2016 à 15:19
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 - 23 mai 2016 à 22:21
Bonjour,

Fonctionne

require_once 'app/Controller/HeadLandingCtrl.php';
//Header html loading
$Header = new HeadLandingCtrl();
$Header->index();


Ne fonctionne pas...
" Fatal error: Class 'app\Controller\HeadLandingCtrl' not found in C:\xampp\htdocs\test\test\index.php on line 21"

namespace app\Controller;
use app\Controller\HeadLandingCtrl;
//Header html loading
$Header = new HeadLandingCtrl(); /*ligne 21*/
$Header->index();


Help s'il vous plait... je n'y comprend rien, car la doc php me dit que ca devrait fonctionner...
liens de la doc: https://www.php.net/manual/fr/language.namespaces.importing.php

4 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
19 mai 2016 à 16:15
Bonjour,

Il me semble que l'utilisation des NameSpace .. n'enlève pas le fait qu'il faille INCLURE les fichiers PHP les contenant....

Si je reprend un des exemples d'un tuto dispo sur le net.. on a :


Dans un fichier F.ns.php, placez ceci :
<?php

    namespace A\B\C\D\E\F;
   

    function getNamespace()
    {
        echo __NAMESPACE__;
    }
?>

Dans un autre fichier quelconque, essayez le code suivant :
<?php
    require 'F.ns.php';
    use A\B\C\D\E\F as nsF;

    nsF\getNamespace(); // Se transforme en A\B\C\D\E\F\getNamespace().

?>


https://openclassrooms.com/fr/courses/1217456-les-espaces-de-noms-en-php

même chose expliquée dans la doc PHP :
https://www.php.net/manual/fr/language.namespaces.basics.php


1
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 5
23 mai 2016 à 02:33
Merci, j'ai créé une clase d'autoloading avecl a fonction spl_autoload_register et ca fonctionne. Maintenant le problème rencontré est plus bizare encore, je le detail dans le commentaire en réponse a Jubasse. Je te remercie de ton aide.
0
jubasse Messages postés 24 Date d'inscription mercredi 2 septembre 2015 Statut Membre Dernière intervention 11 octobre 2017 1
Modifié par jubasse le 20/05/2016 à 09:37
Salut, l'utilisation du use ne permet pas l'utilisation de la classe mais crée une référence à celle-ci si elle existe :

namespace Foo;

use Bar\FooBar;

$fooBar = new FooBar();

Ici le FooBar sera référencé comme étant Bar\FooBar;

Pour utiliser la classe Bar\FooBar, il faudra l'inclure.

Cependant, il existe un moyen d'autocharger les classes à l'aide des Namespaces, c'est l'autoloading.

Il existe plusieurs normes d'autoloading en php suivant les principes PSR (PHP Standards Recommandation) https://www.php-fig.org/psr/ .

La première norme d'auto-chargement des classes était le PSR-0 qui est maintenant déprecié au profit du PSR-4.
Le but du PSR-4 est de normer tes namespaces comme ton architecture de dossiers :

- racine : namespace Racine;
- Dossier namespace Racine\Dossier;
- Fichier.php namepsace Racine\Dossier; class Fichier{}

qui te permettra d'appeler ta classe fichier de la manière suivante :

use Racine\Dossier\Fichier;

$fichier = new Fichier();

Le but étant de bien mapper ta racine (ex : on map le dossier app avec le namespace MonApp).

- app namespace MonApp;
- dossier namespace MonApp\Dossier;

Pour utiliser le PSR-4 tu as plusieurs possiblités mais la plus simple est d'utiliser Composer.

Voici un exemple en Anglais : https://experiencehq.net/blog/how-and-when-to-use-psr-4-autoloading-in-your-craft-plugins

Il faut simplement télécharger composer.phar sur https://getcomposer.org/ tu place le fichier à la racine de ton projet, il faut aussi avoir PHP en ligne de commande.

Tu dois seulement faire à l'aide d'un invite de commande :
php composer.phar init

Suivre les instructions, ouvrir un fichier générer nommé composer.json et y ajouter simplement ce qui est dit au dessus.

(en gros on ajoute un index autoload, on précise le type d'autoloading (psr-4) ,
ensuite on indique que le namespace "MonNamespace\\" mappera le dossier "dossier")
une fois tout cela crée, il suffit de faire :

composer dump-autoload

Voila, j'espère t'avoir éclairé.
0
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 5
23 mai 2016 à 02:44
Bonsoir, merci de votre réponse,

En réalité je ne comprend pas trop l'utilité de composer car j'ai créé une classe "Autoloader" avec les fonction "autoload" et "register" cette dernière appelant "spl_autoload_register(array(_CLASS__,"autoload")), c'est magique et ça a l'air de fonctionner, mais je rencontre un problème différent maintenant. Pouvez vous me dire si votre explication est la solution au problème que je rencontre?

La classe:
namespace app\Controller;

use core\Controller\MainController;

class AppCtrl extends MainController{ /* ligne 7*/
...
}


l'erreure:
Fatal error: Class 'Core\Controller\MainController' not found in C:\wamp\www\test\app\Controller\AppCtrl.php on line 7

et le pire c'est que l'arborescence décrite ds l’erreur est tout a fais correcte, c'est a s’arracher les cheveux pour un débutant comme moi.

Est-ce le problème de "composer" que vous décrivez?

merci de votre aide
0
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 5
23 mai 2016 à 02:45
PS: j'utilise PhpStorm pour developer mon appli
0
shared Messages postés 105 Date d'inscription mercredi 24 mars 2010 Statut Membre Dernière intervention 23 mai 2016 5
23 mai 2016 à 22:21
j'ai installé composer, et cela ne change rien a mon soucis..
0