J'ai un dossier avec une classe Resp
. Le chemin est:
C:\xampp\htdocs\One\Classes\Resp.php
Et j'ai un index.php
fichier dans ce répertoire:
C:\xampp\htdocs\Two\Http\index.php
Dans ce index.php
fichier, je souhaite instancier une classe Resp
.
$a = new Resp();
Je sais que je peux utiliser des mots require
- include
clés ou pour inclure le fichier dans une classe:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Mais je veux importer des classes sans utiliser require
ou include
. J'essaie de comprendre comment use
fonctionne le mot clé. J'ai essayé ces étapes mais rien ne fonctionne:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Ça dit:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Comment fonctionne le mot-clé use
? Puis-je l'utiliser pour importer des classes?
namespace
s. En fait il n'y a pas de Symfony si vous n'utilisez pas d'espaces de nomsRéponses:
use
n'inclut rien. Il importe simplement l'espace de noms (ou la classe) spécifié dans la portée actuelleSi vous souhaitez que les classes soient chargées automatiquement - lisez à propos du chargement automatique
la source
Non, vous ne pouvez pas importer une classe avec le
use
mot - clé. Vous devez utiliserinclude
/require
statement. Même si vous utilisez un chargeur automatique PHP, le chargeur automatique devra toujours utiliser soitinclude
ou enrequire
interne.Le mot-clé Purpose of use :
Prenons un cas où vous avez deux classes avec le même nom; vous trouverez cela étrange, mais lorsque vous travaillez avec une grosse structure MVC, cela arrive. Donc, si vous avez deux classes avec le même nom, placez-les dans des espaces de noms différents. Considérez maintenant quand votre chargeur automatique charge les deux classes (fait par
require
) et que vous êtes sur le point d'utiliser un objet de classe. Dans ce cas, le compilateur ne sait pas quel objet de classe charger parmi deux. Pour aider le compilateur à prendre une décision, vous pouvez utiliser l'use
instruction afin qu'il puisse prendre une décision sur laquelle va être utilisée.De nos jours, les principaux frameworks utilisent
include
ourequire
viacomposer
etpsr
1) compositeur
2) chargeur automatique PSR-4
Les parcourir peut vous aider davantage. Vous pouvez également utiliser un alias pour adresser une classe exacte. Supposons que vous ayez deux classes avec le même nom, disons
Mailer
avec deux espaces de noms différents:et
Et si vous souhaitez utiliser les deux classes Mailer en même temps, vous pouvez utiliser un alias.
Plus tard dans votre code, si vous souhaitez accéder à ces objets de classe, vous pouvez effectuer les opérations suivantes:
Il référencera la classe d'origine.
Certains peuvent être confus, car il n'y a pas de noms de classe similaires, alors il n'y a pas d'utilisation de
use
mot - clé. Eh bien, vous pouvez utiliser une__autoload($class)
fonction qui sera appelée automatiquement lorsque l'use
instruction sera exécutée avec la classe à utiliser comme argument et cela peut vous aider à charger la classe à l'exécution à la volée en cas de besoin.Reportez-vous à cette réponse pour en savoir plus sur le chargeur automatique de classe.
la source
use
déclaration de manière indiquera au compilateur de charger cela pour moi maintenant. Je l'ai cher!Ne réfléchissez pas trop à ce qu'est un espace de noms .
L'espace de noms est essentiellement juste un préfixe de classe (comme le répertoire dans le système d'exploitation) pour garantir l' unicité du chemin de classe .
Aussi juste pour clarifier les choses, l' instruction use ne fait rien qui alias uniquement vos espaces de noms afin que vous puissiez utiliser des raccourcis ou inclure des classes avec le même nom mais des espaces de noms différents dans le même fichier.
Par exemple:
Si vous voulez savoir comment fonctionnent les espaces de noms PHP et le chargement automatique (l'ancienne méthode ainsi que la nouvelle méthode avec Composer), vous pouvez lire l'article de blog que je viens d'écrire sur ce sujet: https://enterprise-level-php.com/ 2017/12/25 / la-magie-derriere-autoloading-php-files-using-composer.html
la source
Vous devrez de toute façon inclure / exiger la classe, sinon PHP ne connaîtra pas l'espace de noms. Cependant,
vous n'êtes pas obligé de le faire dans le même fichier. Vous pouvez le faire dans un fichier bootstrap par exemple. (ou utilisez un chargeur automatique, mais ce n'est pas le sujet en fait)
la source
Le problème est très probablement que vous devrez utiliser un chargeur automatique qui prendra le nom de la classe (interrompre par «\» dans ce cas) et le mapper à une structure de répertoires.
Vous pouvez consulter cet article sur la fonctionnalité de chargement automatique de PHP. Il existe déjà de nombreuses implémentations de ce type de fonctionnalité dans les frameworks.
J'en ai déjà implémenté un auparavant. Voici un lien .
la source
Je suis d'accord avec Green, Symfony a besoin d'un espace de noms, alors pourquoi ne pas les utiliser?
Voici comment un exemple de classe de contrôleur démarre:
la source
Vous ne pouvez pas le faire comme ça en dehors des exemples ci-dessus. Vous pouvez également utiliser le mot-clé à l'
use
intérieur des classes pour importer des traits , comme ceci:la source
Le
use
mot-clé est pour l'aliasing en PHP et il n'importe pas les classes. Cela aide vraiment1) Lorsque vous avez des classes avec le même nom dans des espaces de noms différents
2) Évitez d'utiliser des noms de classe très longs encore et encore.
la source
L'espace de noms est utilisé pour définir le chemin vers un fichier spécifique contenant une classe, par exemple
Vous pouvez ensuite inclure cette classe spécifique dans un autre fichier php en utilisant le mot-clé "use" comme ceci:
REMARQUE: n'utilisez pas le chemin d'accès au fichier contenant la classe à implémenter, étend l'utilisation pour instancier un objet mais n'utilisez que l'espace de noms.
la source
L'utilisation du mot-clé "use" sert à raccourcir les littéraux d'espace de noms. Vous pouvez utiliser les deux avec ou sans alias. Sans alias, vous devez utiliser la dernière partie de l'espace de noms complet.
la source