¿Qué es :: clase en PHP?

102

¿Qué es la ::classnotación en PHP?

Una búsqueda rápida en Google no devuelve nada debido a la naturaleza de la sintaxis.

colon clase de colon

¿Cuál es la ventaja de usar esta notación?

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

Respuestas:

87

Esta característica se implementó en PHP 5.5.

Documentación: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

Es muy útil por 2 razones.

  • Ya no tienes que almacenar los nombres de tus clases en cadenas. Por lo tanto, muchos IDE pueden recuperar estos nombres de clase cuando refactoriza su código
  • Puede usar la usepalabra clave para resolver su clase y no necesita escribir el nombre completo de la clase.

Por ejemplo :

use \App\Console\Commands\Inspire;

//...

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

Actualización :

Esta función también es útil para el enlace estático tardío .

En lugar de usar la __CLASS__constante mágica, puede usar la static::classfunción para obtener el nombre de la clase derivada dentro de la clase principal. Por ejemplo:

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
fuente
1
Una pequeña corrección: en el primer ejemplo, Inspire::classes equivalente a "App \ Console \ Commands \ Inspire", sin el prefijo de barra invertida.
Jason
1
@FabienHaddadi: tenga en cuenta que las dos notaciones use \App\...y use App\...están permitidas. Lo uso para marcar la diferencia entre una clase contenida en un subespacio de nombres y una clase contenida fuera de la jerarquía actual del espacio de nombres.
alphayax
Una advertencia, puede escribir cualquier cosa y aún así obtener un nombre de "clase". Podría escribir SomeDumbCrapThatDoesntExist :: class y no me dará un error o una advertencia si el IDE no lo detecta. Es fácil cometer un error tipográfico y perderlo.
Gabriel Alack
19

class es especial, que es proporcionado por php para obtener el nombre de clase completo.

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
fuente
¿Hay alguna razón por la que Laravel decidió cambiarse a él?
Yada
7
No es una constante en la clase Inspire. Es una constante proporcionada por php. Es una forma rápida de obtener el nombre de clase completo. php.net/manual/en/…
jfadich
1
@Yada Creo que el razonamiento detrás de Laravel al usarlo es que te da un lugar menos para cometer un error tipográfico. Puede usar la cadena '\ App \ Console \ Commands \ Inspire' o Inspire :: class para obtener lo mismo, pero su IDE detectará errores de sintaxis / ortografía en este último, lo que lo hará un poco más fácil de depurar.
jfadich
0

Tenga en cuenta que debe utilizar lo siguiente:

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

Esto arrojará un error de sintaxis:

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

Pero puedes hacer lo siguiente en su lugar:

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

o

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
fuente
este truco para nombrar dinámicamente, de 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