Wat is ::class in PHP?

Wat is de ::classnotatie in PHP?

Een snelle Google-zoekopdracht levert niets op vanwege de aard van de syntaxis.

dubbelpunt dubbele punt klasse

Wat is het voordeel van het gebruik van deze notatie?

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

Antwoord 1, autoriteit 100%

SomeClass::classretourneert de volledig gekwalificeerde naam van SomeClassinclusief de naamruimte. Deze functie is geïmplementeerd in PHP 5.5.

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

Het is om twee redenen erg handig.

  • Je hoeft je klasnamen niet meer in strings op te slaan. Veel IDE’s kunnen deze klassenamen dus ophalen wanneer u uw code refactoreert
  • Je kunt het trefwoord usegebruiken om je klas op te lossen en je hoeft niet de volledige klasnaam te schrijven.

Bijvoorbeeld:

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

Bijwerken:

Deze functie is ook handig voor Late Static Binding .

In plaats van de magische constante __CLASS__te gebruiken, kun je de functie static::classgebruiken om de naam van de afgeleide klasse binnen de bovenliggende klasse te krijgen. Bijvoorbeeld:

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

Antwoord 2, autoriteit 20%

classis speciaal en wordt geleverd door php om de volledig gekwalificeerde klassenaam te krijgen.

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

Antwoord 3, autoriteit 6%

Als je benieuwd bent in welke categorie het valt (of het een taalconstructie is, enz.),

Het is gewoon een constante.

PHP noemt het een “Special Constant”. Het is speciaal omdat het tijdens het compileren door PHP wordt geleverd.

De speciale ::class constante is beschikbaar vanaf PHP 5.5.0, en staat toe
voor volledig gekwalificeerde klassenaamresolutie tijdens het compileren, is dit:
handig voor klassen met naamruimte:

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


Antwoord 4

Houd er rekening mee dat u het volgende gebruikt:

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

Hierdoor ontstaat een syntaxisfout:

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

Maar u kunt in plaats daarvan het volgende doen:

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

of

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

Other episodes