web-dev-qa-db-fra.com

PHP: 'use' à l'intérieur de la définition de classe

Récemment, je suis tombé sur une classe qui utilise l'instruction use à l'intérieur de la définition de classe.

Quelqu'un pourrait-il expliquer exactement ce qu'il fait - car je ne trouve aucune information à ce sujet.

Je comprends que cela pourrait être un moyen de l'éloigner de la portée globale du fichier donné, mais cela permet-il peut-être également à la classe donnée d'hériter de plusieurs classes parents - puisque extends n'autorise qu'une seule référence de classe parent ?

L'exemple que j'ai vu était dans le modèle utilisateur de l'installation originale de Laravel:

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

}

et j'ai vu quelques exemples de ce modèle utilisant réellement des méthodes incluses dans la classe UserTrait - d'où mes soupçons, mais j'aimerais vraiment en savoir plus sur la signification des instructions use incluses.

documentation PHP dit:

Le mot-clé use doit être déclaré dans la portée la plus externe d'un fichier (la portée globale) ou dans les déclarations d'espace de noms. Cela est dû au fait que l'importation est effectuée au moment de la compilation et non au moment de l'exécution, elle ne peut donc pas être étendue au bloc. L'exemple suivant montrera une utilisation illégale du mot clé use:

suivi de l'exemple:

namespace Languages;

class Greenlandic
{
    use Languages\Danish;

    ...
}

ce qui indiquerait qu'il s'agit d'une utilisation incorrecte du mot clé use - des indices?

50
Sebastian Sulinski

Ils sont appelés Traits et sont disponibles depuis PHP 5.4. Ils sont importés dans une autre classe ou un autre espace de noms en utilisant utilisez le mot-clé qui est inclus depuis PHP 5.0 comme pour importer une classe régulière dans une autre classe. Ce sont des héritages uniques. La principale raison de la mise en œuvre des traits est due à la limitation de l'héritage unique.

Pour plus de détails, voir le manuel des traits PHP :

36
Sagar Rabadiya