Cos'è :: class in PHP?


102

Qual è la ::classnotazione in PHP?

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

colon colon classe

Qual è il vantaggio di usare questa notazione?

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

Risposte:


87

Questa funzionalità è stata implementata in PHP 5.5.

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

È molto utile per 2 motivi.

  • Non è più necessario memorizzare i nomi delle classi in stringhe. Quindi, molti IDE possono recuperare questi nomi di classi quando si effettua il refactoring del codice
  • Puoi utilizzare la useparola chiave per risolvere la tua classe e non è necessario scrivere il nome completo della classe.

Per esempio :

use \App\Console\Commands\Inspire;

//...

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

Aggiornamento :

Questa funzione è utile anche per il binding statico tardivo .

Invece di usare la __CLASS__costante magica, puoi usare la static::classfunzione per ottenere il nome della classe derivata all'interno della classe genitore. 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

1
Una leggera correzione: nel primo esempio, Inspire::classè equivalente a "App \ Console \ Commands \ Inspire", senza il prefisso della barra rovesciata.
Jason

1
@FabienHaddadi: nota che le due notazioni use \App\...e use App\...sono consentite. Lo uso per fare la differenza tra una classe contenuta in uno spazio dei nomi secondario e una classe contenuta all'esterno della gerarchia dello spazio dei nomi corrente.
alphayax

Un avvertimento, puoi digitare qualsiasi cosa e ottenere comunque un nome di "classe". Potrei digitare SomeDumbCrapThatDoesntExist :: class e non mi darà un errore o un avviso se l'IDE non lo rileva. Facile fare un errore di battitura e perderlo.
Gabriel Alack

19

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

Vedi 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!

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

7
Non è una costante della classe Inspire. È una costante fornita da php. È un modo rapido per ottenere il nome completo della classe. php.net/manual/en/...
jfadich

1
@ Yada, credo che il ragionamento dietro a Laravel che lo usa sia che ti dà un posto in meno per 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à gli errori di sintassi / ortografia su quest'ultimo, rendendo un po 'più facile il debug.
jfadich


0

Si prega di essere consapevoli di utilizzare quanto segue:

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

Questo genererà un errore di sintassi:

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

Ma puoi invece fare quanto segue:

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

o

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

questo trucco per la denominazione dinamica, da php 5. * funziona come$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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.