2015-06-11 5 views
33

Qual è la notazione ::class in PHP?Che cos'è :: class in PHP?

Una ricerca rapida su Google non restituisce nulla a causa della natura della sintassi.

classe colon colon

Qual è il vantaggio di utilizzare questa notazione?

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

risposta

14

class è speciale, che è fornito da PHP per ottenere il nome completo della classe.

Vedere 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! 
+0

C'è un motivo per cui Laravel ha deciso di passare ad esso? – Yada

+6

Non è una costante nella classe Inspire. È una costante fornita da php. È un modo rapido per ottenere il nome completo della classe. http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name – jfadich

+1

@ Yada Credo che il ragionamento dietro Laravel che lo usa sia che ti dà un posto in meno da fare un errore di battitura.Puoi usare la stringa "\ App \ Console \ Commands \ Inspire" o Inspire :: class per ottenere la stessa cosa, ma il tuo IDE rileverà errori di sintassi/di ortografia su quest'ultimo rendendolo un po 'più facile da eseguire il debug. – jfadich

24

Questa funzione è stata implementata in PHP 5.5.

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

E 'molto utile per 2 motivi.

  • Non è necessario memorizzare i nomi delle classi nelle stringhe. Quindi, molti IDE possono recuperare questi nomi di classe quando si effettua il refactoring del codice
  • È possibile utilizzare la parola chiave use per risolvere la classe e non è necessario scrivere il nome completo della classe.

Per exemple:

use \App\Console\Commands\Inspire; 

//... 

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

Aggiornamento:

Questa funzione è anche utile per Late Static Binding.

Invece di utilizzare la costante magica __CLASS__, è possibile utilizzare la funzione static::class per ottenere il nome della classe derivata all'interno della classe padre. Per Esempio:

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 
0

Si prega di essere a conoscenza di utilizzare il seguente:

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

Questo getterà una sintassi-error:

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

ma si può fare il seguente invece:

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

Forse questo è alrea dy risolto in PHP 7.