web-dev-qa-db-fra.com

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

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

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

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

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

Dans ce fichier index.php, je souhaite instancier une classe Resp.

$a = new Resp();

Je sais que je peux utiliser les mots clés require ou include pour inclure le fichier avec 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 fonctionne le mot clé use. J'ai essayé ces étapes mais rien ne marche:

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?

111
Green

use n'inclut rien. Il importe juste l'espace de noms spécifié (ou classe) dans la portée actuelle

Si vous voulez que les classes soient autoloadées - en savoir plus sur autoloading

68
zerkms

Non, vous ne pouvez pas importer une classe avec le mot clé use. Vous devez utiliser l'instruction includerequire. Même si vous utilisez un chargeur automatique PHP, l'autochargeur devra toujours utiliser include ou require en interne. 

Le but du _/use mot clé:

Prenons le cas où vous avez deux classes portant le même nom. vous trouverez cela étrange, mais lorsque vous travaillez avec une grande structure MVC, cela se produit. Donc, si vous avez deux classes du même nom, placez-les dans des espaces de noms différents. Pensez maintenant lorsque votre chargeur automatique charge les deux classes (le fait par require) et que vous êtes sur le point d'utiliser un objet de classe. Dans ce cas, le compilateur sera confus quel objet de classe à charger entre deux. Pour aider le compilateur à prendre une décision, vous pouvez utiliser l'instruction use afin qu'il puisse prendre une décision sur laquelle elle sera utilisée.

De nos jours, les principaux frameworks utilisent include ou require via composer et psr

1) compositeur

2) PSR-4 autochargeur

Passer par eux peut vous aider davantage. Vous pouvez également utiliser un alias pour adresser une classe exacte. 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{}

et 

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, procédez comme suit:

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

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

Certains peuvent avoir du mal à croire qu’il n’existe pas de nom de classe similaire, le mot clé use n’est donc pas utilisé. Eh bien, vous pouvez utiliser la fonction __autoload($class) qui sera appelée automatiquement lorsque l’instruction use sera exécutée avec la classe à utiliser comme argument, ce qui peut vous aider à charger la classe au moment de l’exécution à la volée au besoin. 

Reportez-vous à cette réponse pour en savoir plus sur l'autoloader de classe. 

149
Rajan Rawal

Ne pensez pas ce qu'est un {Namespace} _.

Espace de noms est fondamentalement juste un préfixe Classe (comme le répertoire dans le système d'exploitation) pour garantir l'unicité du chemin Classe.

De plus, pour clarifier les choses, l’instruction utiliser ne fait pas que créer un alias pour votre Espaces de nommage afin que vous puissiez utiliser des raccourcis ou inclure Classes avec le même nom mais de manière différente Namespace 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 et le chargement automatique de PHP (l'ancienne et la nouvelle manière avec Composer), vous pouvez lire le 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

12
BlocksByLukas

Quoi qu'il en soit, vous devrez inclure/exiger la classe, sinon PHP ne saura rien de l'espace de noms.
Cependant, vous n’avez pas besoin de le faire dans le fichier same. Vous pouvez le faire dans un fichier d'amorçage par exemple. (ou utilisez un autochargeur, mais ce n'est pas le sujet en fait)

8
Samy Dindane

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

Vous pouvez consulter cet article sur la fonctionnalité autoloading 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 link .

4
Tyler Carter

Je suis d'accord avec Green, Symfony a besoin d'un espace de noms, alors pourquoi ne pas l'utiliser?

Voici comment un exemple de classe de contrôleur démarre:

espace de noms Acme\DemoBundle\Controller;

utilisez Symfony\Bundle\FrameworkBundle\Controller\Controller;

la classe WelcomeController étend le contrôleur {...}.

3
Eric Draven

Le mot clé use concerne l'aliasing dans PHP et il n'importe pas les classes. Cela aide vraiment 
1) Lorsque vous avez des classes de même nom dans des espaces de noms différents
2) Évitez d’utiliser le nom de classe très long, encore et encore.

3
Abdul Mannan

Puis-je l'utiliser pour importer des classes?

Vous ne pouvez pas le faire comme ça en plus des exemples ci-dessus. Vous pouvez également utiliser le mot clé use dans les classes pour importer traits , comme ceci:

trait Stuff {
    private $baz = 'baz';
    public function bar() {
        return $this->baz;
    }
}

class Cls {
    use Stuff;  // import traits like this
}

$foo = new Cls;
echo $foo->bar(); // spits out 'baz'
2
Thielicious

L'utilisation du mot clé "use" sert à raccourcir les littéraux d'espace de noms. Vous pouvez utiliser les deux avec aliasing et sans. Sans alias, vous devez utiliser la dernière partie de l'espace de noms complet.

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
1

L'espace de noms est utilisé pour définir le chemin d'accès à un fichier spécifique contenant une classe, par exemple.

namespace album/className; 

class className{
//enter class properties and methods here
}

Vous pouvez ensuite inclure cette classe spécifique dans un autre fichier php en utilisant le mot-clé "use" comme ceci:

use album/className;

class album extends classname {
//enter class properties and methods
}

NOTE: N'utilisez pas le chemin d'accès au fichier contenant la classe à implémenter, cela étend l'utilisation pour instancier un objet mais utilisez uniquement l'espace de noms.

0