O que é :: class em PHP?

102

Qual é a ::classnotação em PHP?

Uma rápida pesquisa no Google não retorna nada devido à natureza da sintaxe.

classe de cólon e cólon

Qual é a vantagem de usar essa notação?

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

Respostas:

87

Este recurso foi implementado no PHP 5.5.

Documentação: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

É muito útil por 2 motivos.

  • Você não precisa mais armazenar os nomes das classes em strings. Portanto, muitos IDEs podem recuperar esses nomes de classe quando você refatorar seu código
  • Você pode usar a usepalavra-chave para resolver sua classe e não precisa escrever o nome completo da classe.

Por exemplo :

use \App\Console\Commands\Inspire;

//...

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

Atualização :

Este recurso também é útil para Late Static Binding .

Em vez de usar a __CLASS__constante mágica, você pode usar o static::classrecurso para obter o nome da classe derivada dentro da classe pai. Por exemplo:

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
fonte
1
Uma pequena correção: no primeiro exemplo, Inspire::classé equivalente a "App \ Console \ Commands \ Inspire", sem o prefixo de barra invertida.
Jason
1
@FabienHaddadi: observe que as duas notações use \App\...e use App\...são permitidas. Eu uso isso para fazer a diferença entre uma classe contida em um subnamespace e uma classe contida fora da hierarquia de namespace atual.
alphayax
Uma palavra de aviso, você pode digitar qualquer coisa e ainda obter um nome de "classe". Eu poderia digitar SomeDumbCrapThatDoesntExist :: class e não me dará um erro ou um aviso se o IDE não detectá-lo. Fácil de errar e errar.
Gabriel Alack
19

class é especial, que é fornecido pelo php para obter o nome de classe totalmente qualificado.

Consulte 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
fonte
Existe uma razão pela qual o Laravel decidiu mudar para ele?
Yada
7
Não é uma constante na classe Inspire. É uma constante fornecida pelo php. É uma maneira rápida de obter o nome de classe totalmente qualificado. php.net/manual/en/…
jfadich
1
@Yada Eu acredito que o raciocínio por trás do uso do Laravel é que ele dá a você um lugar a menos para cometer erros de digitação. Você pode usar a string '\ App \ Console \ Commands \ Inspire' ou Inspire :: class para obter a mesma coisa, mas seu IDE detectará erros de sintaxe / ortografia no último, tornando-o um pouco mais fácil de depurar.
jfadich
0

Esteja ciente de usar o seguinte:

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

Isso gerará um erro de sintaxe:

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

Mas você pode fazer o seguinte:

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

ou

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
fonte
este hack para nomenclatura dinâmica, do php 5. * funciona como$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