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.