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,
];

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

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!

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


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) {...}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.