Co to jest :: class w PHP?

102

Jaka jest ::classnotacja w PHP?

Szybkie wyszukiwanie w Google nic nie zwraca ze względu na naturę składni.

klasa okrężnicy

Jaka jest zaleta używania tej notacji?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];
Yada
źródło

Odpowiedzi:

87

Ta funkcja została zaimplementowana w PHP 5.5.

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

Jest to bardzo przydatne z 2 powodów.

  • Nie musisz już przechowywać nazw klas w łańcuchach. Dlatego wiele środowisk IDE może pobrać te nazwy klas podczas refaktoryzacji kodu
  • Możesz użyć usesłowa kluczowego, aby rozwiązać swoją klasę i nie musisz wpisywać pełnej nazwy klasy.

Na przykład :

use \App\Console\Commands\Inspire;

//...

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

Aktualizacja :

Ta funkcja jest również przydatna w przypadku późnego wiązania statycznego .

Zamiast używać __CLASS__magicznej stałej, możesz użyć tej static::classfunkcji, aby uzyskać nazwę klasy pochodnej wewnątrz klasy nadrzędnej. Na przykład:

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
źródło
1
Niewielka korekta: w pierwszym przykładzie Inspire::classjest to odpowiednik „App \ Console \ Commands \ Inspire”, bez przedrostka ukośnika wstecznego.
Jason
1
@FabienHaddadi: zwróć uwagę, że te dwie notacje use \App\...i use App\...są dozwolone. Używam tego, aby odróżnić klasę zawartą w podprzestrzeni nazw od klas znajdujących się poza bieżącą hierarchią przestrzeni nazw.
alphayax
Słowo ostrzeżenia, możesz wpisać cokolwiek i nadal otrzymać nazwę „klasy”. Mógłbym wpisać SomeDumbCrapThatDoesntExist :: class i nie da mi to błędu ani ostrzeżenia, jeśli IDE go nie złapie. Łatwo popełnić literówkę i ją przegapić.
Gabriel Alack
19

class jest specjalny, który jest dostarczany przez php, aby uzyskać w pełni kwalifikowaną nazwę klasy.

Zobacz 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
źródło
Czy jest jakiś powód, dla którego Laravel zdecydował się na to przejść?
Yada,
7
To nie jest stała w klasie Inspire. Jest to stała dostarczana przez php. Jest to szybki sposób na uzyskanie w pełni kwalifikowanej nazwy klasy. php.net/manual/en/ ...
jfadich
1
@Yada Uważam, że powodem używania Laravel jest to, że daje o jedno miejsce mniej na wpisanie literówki. Możesz użyć ciągu „\ App \ Console \ Commands \ Inspire” lub Inspire :: class, aby uzyskać to samo, ale twoje IDE wyłapie błędy składni / pisowni w tym ostatnim, co nieco ułatwi debugowanie.
jfadich
0

Pamiętaj, aby użyć następujących:

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

Spowoduje to zgłoszenie błędu składniowego:

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

Zamiast tego możesz wykonać następujące czynności:

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

lub

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
źródło
ten hack do dynamicznego nazewnictwa, z php 5. * działa jak$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,