167 votes

Comment fonctionne le mot-clé "use" en PHP et puis-je importer des classes avec ce mot-clé ?

J'ai un fichier avec une classe Resp . Le chemin est le suivant :

C:\xampp\htdocs\One\Classes\Resp.php

Et j'ai un index.php dans ce répertoire :

C:\xampp\htdocs\Two\Http\index.php

Dans cette index.php Je veux instancier une classe Resp .

$a = new Resp();

Je sais que je peux utiliser require ou include 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 mots-clés fonctionne. 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();

Il est écrit :

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

Comment le mot-clé use travail ? Puis-je l'utiliser pour importer des classes ?

225voto

Rajan Rawal Points 1569

Non, vous ne pouvez pas importer une classe avec l'option use mot-clé. Vous devez utiliser include / require déclaration. Même si vous utilisez un chargeur automatique PHP, celui-ci devra toujours utiliser l'une ou l'autre des options suivantes include ou require en interne.

L'objectif de la utiliser mot-clé :

Considérez le cas où vous avez deux classes avec le même nom ; vous trouverez cela étrange, mais lorsque vous travaillez avec une grande structure MVC, cela arrive. Si vous avez deux classes portant le même nom, placez-les dans des espaces de noms différents. Maintenant, considérez le moment où votre chargeur automatique charge les deux classes (fait par require ), et vous êtes sur le point d'utiliser un objet de la classe. Dans ce cas, le compilateur ne saura pas quel objet de classe charger parmi les deux. Pour aider le compilateur à prendre une décision, vous pouvez utiliser la méthode use afin qu'il puisse décider de l'utilisation de l'un d'entre eux.

Aujourd'hui, les principaux cadres utilisent include ou require via composer et psr

1) compositeur

2) PSR-4 autochargeur

Les passer en revue peut vous aider davantage. Vous pouvez également utiliser un alias pour vous adresser à une classe précise. Supposons que vous ayez deux classes portant le même nom, par exemple Mailer avec deux espaces de noms différents :

namespace SMTP;
class Mailer{}

y

namespace Mailgun;
class Mailer{}

Et si vous souhaitez utiliser les deux classes Mailer en même temps, vous pouvez utiliser un alias.

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

Plus tard dans votre code, si vous souhaitez accéder à ces objets de classe, vous pouvez procéder comme suit :

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

Elle fera référence à la classe d'origine.

D'aucuns pourraient penser que s'il n'y a pas de noms de classes similaires, il n'y a pas lieu d'utiliser l'option use mot-clé. Vous pouvez utiliser __autoload($class) qui sera appelée automatiquement lorsque use est exécutée avec la classe à utiliser comme argument, ce qui peut vous aider à charger la classe au moment de l'exécution, au fur et à mesure des besoins.

Se référer à ce document répondre pour en savoir plus sur l'autochargeur de classe.

106voto

zerkms Points 105994

use n'inclut rien. Il importe simplement l'espace de noms (ou la classe) spécifié(e) dans le champ d'application actuel

Si vous souhaitez que les classes soient chargées automatiquement, lisez ce qui suit chargement automatique

38voto

EnchanterIO Points 2135

Ne réfléchissez pas trop à ce qu'un Espace de noms est.

Espace de noms n'est en fait qu'un Classe (comme un répertoire dans un système d'exploitation) pour s'assurer que l'élément Classe l'unicité du chemin.

Par ailleurs, pour que les choses soient claires, le utiliser ne fait rien d'autre que d'aliéner votre déclaration Espaces de noms afin d'utiliser des raccourcis ou d'inclure Classes portant le même nom mais différents Espace de noms dans le même fichier.

Par exemple

// You can do this at the top of your Class
use Symfony\Component\Debug\Debug;

if ($_SERVER['APP_DEBUG']) {
    // So you can utilize the Debug class it in an elegant way
    Debug::enable();
    // Instead of this ugly one
    // \Symfony\Component\Debug\Debug::enable();
}

Si vous voulez savoir comment fonctionnent les espaces de noms PHP et l'autoloading (l'ancienne méthode et la nouvelle 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/the-magic-behind-autoloading-php-files-using-composer.html

8voto

Samy Dindane Points 6874

Vous devrez inclure/exiger la classe de toute façon, sinon PHP ne connaîtra pas l'espace de noms.
Il n'est pas nécessaire de le faire dans les même Cependant, le dossier de l'entreprise n'est pas encore prêt. Vous pouvez le faire dans un fichier bootstrap par exemple. (ou utiliser un autoloader, mais ce n'est pas le sujet en fait)

4voto

Tyler Carter Points 30030

Le problème est que vous devrez probablement utiliser un chargeur automatique qui prendra le nom de la classe (interrompu par "\" dans ce cas) et l'associera à une structure de répertoire.

Vous pouvez consulter cet article sur le site 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à mis un en œuvre. Voici un lien .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X