Was ist :: Klasse in PHP?

102

Was ist die ::classNotation in PHP?

Eine schnelle Google-Suche gibt aufgrund der Art der Syntax nichts zurück.

Doppelpunkt Doppelpunkt Klasse

Was ist der Vorteil dieser Notation?

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

Antworten:

87

Diese Funktion wurde in PHP 5.5 implementiert.

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

Es ist aus zwei Gründen sehr nützlich.

  • Sie müssen Ihre Klassennamen nicht mehr in Zeichenfolgen speichern. Daher können viele IDEs diese Klassennamen abrufen, wenn Sie Ihren Code umgestalten
  • Sie können das useSchlüsselwort verwenden, um Ihre Klasse aufzulösen, und Sie müssen nicht den vollständigen Klassennamen schreiben.

Zum Beispiel :

use \App\Console\Commands\Inspire;

//...

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

Update :

Diese Funktion ist auch für die späte statische Bindung nützlich .

Anstatt die __CLASS__magische Konstante zu verwenden, können Sie die static::classFunktion verwenden, um den Namen der abgeleiteten Klasse innerhalb der übergeordneten Klasse abzurufen. Beispielsweise:

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
quelle
1
Eine leichte Korrektur: Im ersten Beispiel Inspire::classentspricht dies "App \ Console \ Commands \ Inspire" ohne das Präfix für einen Schrägstrich.
Jason
1
@FabienHaddadi: Beachten Sie, dass die beiden Notationen use \App\...und use App\...erlaubt sind. Ich benutze das, um den Unterschied zwischen einer in einem Subnamespace enthaltenen Klasse und einer außerhalb der aktuellen Namespace-Hierarchie enthaltenen Klasse zu machen.
Alphayax
Ein Wort der Warnung, Sie können alles eingeben und trotzdem einen "Klassennamen" erhalten. Ich könnte SomeDumbCrapThatDoesntExist :: class eingeben und es wird mir keinen Fehler oder eine Warnung geben, wenn die IDE ihn nicht abfängt. Einfach einen Tippfehler zu machen und ihn zu verpassen.
Gabriel Alack
19

class ist etwas Besonderes, das von PHP bereitgestellt wird, um den vollständig qualifizierten Klassennamen zu erhalten.

Siehe 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
quelle
Gibt es einen Grund, warum Laravel beschlossen hat, dorthin zu wechseln?
Yada
7
Es ist keine Konstante in der Inspire-Klasse. Es ist eine Konstante, die von PHP bereitgestellt wird. Dies ist ein schneller Weg, um den vollständig qualifizierten Klassennamen zu erhalten. php.net/manual/en/…
jfadich
1
@ Yada Ich glaube, die Argumentation hinter Laravel ist, dass es dir einen Platz weniger gibt, um einen Tippfehler zu machen. Sie können die Zeichenfolge '\ App \ Console \ Commands \ Inspire' oder Inspire :: class verwenden, um dasselbe zu erhalten, aber Ihre IDE erkennt Syntax- / Rechtschreibfehler bei letzterer, was das Debuggen etwas erleichtert.
Jfadich
1

Wenn Sie neugierig sind, in welche Kategorie ::classfällt (ob es sich um ein Sprachkonstrukt handelt usw.), ist dies sehr einfach. Es ist eine Konstante . PHP nennt es eine "spezielle Konstante". Es ist etwas Besonderes, weil es von PHP bereitgestellt wird.

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

Lucas Bustamante
quelle
0

Bitte beachten Sie Folgendes:

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

Dies löst einen Syntaxfehler aus:

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

Sie können stattdessen Folgendes tun:

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

oder

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
quelle
Dieser Hack für dynamische Benennung von PHP 5. * funktioniert wie$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