Qu'est-ce que :: class en PHP?

102

Quelle est la ::classnotation en PHP?

Une recherche rapide sur Google ne renvoie rien en raison de la nature de la syntaxe.

classe deux-points

Quel est l'avantage d'utiliser cette notation?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];
Yada
la source

Réponses:

87

Cette fonctionnalité a été implémentée dans PHP 5.5.

Documentation: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

C'est très utile pour 2 raisons.

  • Vous n'avez plus besoin de stocker vos noms de classe dans des chaînes. Ainsi, de nombreux IDE peuvent récupérer ces noms de classe lorsque vous refactorisez votre code
  • Vous pouvez utiliser le usemot - clé pour résoudre votre classe et vous n'avez pas besoin d'écrire le nom complet de la classe.

Par exemple :

use \App\Console\Commands\Inspire;

//...

protected $commands = [
    Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];

Mise à jour :

Cette fonction est également utile pour la liaison statique tardive .

Au lieu d'utiliser la __CLASS__constante magique, vous pouvez utiliser la static::classfonctionnalité pour obtenir le nom de la classe dérivée dans la classe parente. Par exemple:

class A {

    public function getClassName(){
        return __CLASS__;
    }

    public function getRealClassName() {
        return static::class;
    }
}

class B extends A {}

$a = new A;
$b = new B;

echo $a->getClassName();      // A
echo $a->getRealClassName();  // A
echo $b->getClassName();      // A
echo $b->getRealClassName();  // B
alphayax
la source
1
Une petite correction: dans le premier exemple, Inspire::classéquivaut à "App \ Console \ Commands \ Inspire", sans le préfixe barre oblique inverse.
Jason
1
@FabienHaddadi: notez que les deux notations use \App\...et use App\...sont autorisées. J'utilise cela pour faire la différence entre une classe contenue dans un sous-espace de noms et une classe contenue en dehors de la hiérarchie d'espaces de noms actuelle.
alphayax
Un mot d'avertissement, vous pouvez taper n'importe quoi et toujours obtenir un nom de "classe". Je pourrais taper SomeDumbCrapThatDoesntExist :: class et cela ne me donnera pas d'erreur ou d'avertissement si l'EDI ne le détecte pas. Facile de faire une faute de frappe et de la rater.
Gabriel Alack
19

class est spécial, qui est fourni par php pour obtenir le nom de classe complet.

Voir http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name .

<?php

class foo {
    const test = 'foobar!';
}

echo foo::test; // print foobar!
xdazz
la source
Y a-t-il une raison pour laquelle Laravel a décidé d'y passer?
Yada du
7
Ce n'est pas une constante dans la classe Inspire. C'est une constante fournie par php. C'est un moyen rapide d'obtenir le nom complet de la classe. php.net/manual/en/…
jfadich
1
@Yada Je crois que le raisonnement derrière Laravel en l'utilisant est qu'il vous donne une place de moins pour faire une faute de frappe. Vous pouvez utiliser la chaîne '\ App \ Console \ Commands \ Inspire' ou Inspire :: class pour obtenir la même chose, mais votre IDE détectera les erreurs de syntaxe / orthographe sur ce dernier, ce qui facilitera un peu le débogage.
jfadich du
1

Si vous êtes curieux de savoir dans quelle catégorie ::classappartient (que ce soit une construction de langage, etc.), c'est très simple. C'est une constante . PHP l'appelle une "constante spéciale". C'est spécial car il est fourni par PHP.

https://www.php.net/manual/en/language.oop5.constants.php

Lucas Bustamante
la source
0

Veuillez noter que vous devez utiliser les éléments suivants:

if ($whatever instanceof static::class) {...}

Cela lancera une erreur de syntaxe:

unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'

Mais vous pouvez faire ce qui suit à la place:

if ($whatever instanceof static) {...}

ou

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
la source
ce hack pour la dénomination dynamique, à partir de php 5. * fonctionne comme$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
Vladimir Ch