¿Cómo obtengo el nombre de la clase en PHP?

99
public class MyClass {

}

En Java, podemos obtener el nombre de la clase con String className = MyClass.class.getSimpleName();

¿Cómo hacer esto en PHP? Ya lo sé get_class(), pero funciona solo para objetos. Actualmente trabajo en Active Record. Necesito una declaración como MyClass::className.

Rezan Achmad
fuente
1
¿Podría dar un ejemplo particular cuando podría ser útil en php? Si ha codificado el nombre de la clase, puede envolverlo entre comillas y obtener lo que desee.
zerkms
2
Desafortunadamente, las refactorizaciones automáticas (por ejemplo, en IDE) como RenameClass generalmente no cambian el nombre de tales cadenas de nombres de clases. Por lo tanto, sería bueno tener algún tipo de forma estática para obtener el nombre de la clase, además de hacer el public $__CLASS__ = __CLASS__;baile con todas las demás clases ...
EricSchaefer

Respuestas:

114

Desde PHP 5.5 puede usar la resolución de nombres de clases a través de ClassName :: class .

Vea las nuevas características de PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Si desea usar esta característica en su método de clase, use static :: class :

<?php

namespace Name\Space;

class ClassName {
   /**
    * @return string
    */
   public function getNameOfClass()
   {
      return static::class;
   }
}

$obj = new ClassName();
echo $obj->getNameOfClass();

?>

Para versiones anteriores de PHP , puede usar get_class () .

Friso
fuente
5
¿Cuál es la diferencia entre static::classy get_class_name()?
Alexander Jank
1
@AlexanderJank Parece que static::classse resuelve durante el tiempo de compilación, mientras que get_class_name()se interpreta durante el tiempo de ejecución. Yo descubrí esto al tratar de acceder a la propiedad de clase :: de una clase generada de forma dinámica y obtener el siguiente error (?): Dynamic class names are not allowed in compile-time ::class fetch. Consulte esta respuesta para obtener más detalles. También encontré útil esta nota de los documentos.
cjsimon
29

Puede usar __CLASS__dentro de una clase para obtener el nombre.

http://php.net/manual/en/language.constants.predefined.php

Puntilla
fuente
3
También puede echar un vistazo aquí para ver todas las constantes interesantes: php.net/manual/en/language.constants.predefined.php
MatRt
Gracias a @Brad por el enlace, encuentro la respuesta aquí
Rezan Achmad
2
@ user1073122, ese es el enlace al que me vinculé en mi respuesta.
Brad
+1 ya que estaba tratando de obtener el nombre de la clase en un método que está definido en la clase principal. Otras soluciones ( get_class($this), static::class) simplemente devuelve el nombre de la clase secundaria (que extiende al padre).
akinuri
continuó :, self::classtambién, parece devolver el nombre de la clase principal.
akinuri
22

Parece que respondiste tu propia pregunta. get_classobtendrá el nombre de la clase. Es procedimental y quizás eso es lo que está causando la confusión. Eche un vistazo a la documentación de php paraget_class

Aquí está su ejemplo:

 <?php

 class foo 
 {
     function name()
     {
         echo "My name is " , get_class($this) , "\n";
     }
 }

 // create an object
 $bar = new foo();

 // external call
 echo "Its name is " , get_class($bar) , "\n"; // It's name is foo

 // internal call
 $bar->name(); // My name is foo

Para que se parezca más a su ejemplo, podría hacer algo como:

 <?php

 class MyClass
 {
       public static function getClass()
       {
            return get_class();
       }
 }

Ahora puedes hacer:

 $className = MyClass::getClass();

Sin embargo, esto es algo limitado porque si mi clase se amplía, todavía devolverá 'MyClass'. Podemos usar get_called_classen su lugar, que se basa en Late Static Binding , una característica relativamente nueva, y requiere PHP> = 5.3.

<?php

class MyClass
{
    public static function getClass()
    {
        return get_called_class();
    }

    public static function getDefiningClass()
    {
        return get_class();
    }
}

class MyExtendedClass extends MyClass {}

$className = MyClass::getClass(); // 'MyClass'
$className = MyExtendedClass::getClass(); // 'MyExtendedClass'
$className = MyExtendedClass::getDefiningClass(); // 'MyClass'
Ninguna
fuente
Gracias @ J.Money por la idea ... Pero no funciona en herencia.
Rezan Achmad
11

Ahora tengo la respuesta a mi problema. Gracias a Brad por el enlace, encuentro la respuesta aquí . Y gracias a J.Money por la idea. Mi solución:

<?php

class Model
{
    public static function getClassName() {
        return get_called_class();
    }
}

class Product extends Model {}

class User extends Model {}

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 
Rezan Achmad
fuente
3
No tiene sentido. FooBar::getClassName()es siempre 'FooBar'. Si pudiera escribir Product::getClassName(), también podría escribir en su 'Product'lugar.
zerkms
7
Sí, lo sé ... Quiero evitar errores tipográficos y también al volver a factorizar el nombre de la clase (con herramientas IDE), no necesito buscar y reemplazar la cadena.
Rezan Achmad
Esto también podría ayudar si necesita usar el nombre de clase de la clase secundaria en la clase principal "Modelo".
JR Lawhorne
8

Para obtener el nombre de la clase, puede usar ReflectionClass

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
Omar Makled
fuente
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.
yivi
Absolutamente especial !!! ¡Esta es una solución SUPER pero simple! Gracias !!!!
Simone Campagna
4

Parece que ReflectionClasses una opción bastante productiva.

class MyClass {
    public function test() {
        // 'MyClass'
        return (new \ReflectionClass($this))->getShortName();
    }
}

Punto de referencia:

Method Name      Iterations    Average Time      Ops/second
--------------  ------------  --------------    -------------
testExplode   : [10,000    ] [0.0000020221710] [494,518.01547]
testSubstring : [10,000    ] [0.0000017177343] [582,162.19968]
testReflection: [10,000    ] [0.0000015984058] [625,623.34059]
Илья Зеленько
fuente
3

Creo que es importante mencionar poca diferencia entre 'self' y 'static' en PHP, ya que la 'mejor respuesta' usa 'static', lo que puede dar un resultado confuso a algunas personas.

<?php
class X {
    function getStatic() {
        // gets THIS class of instance of object
        // that extends class in which is definied function
        return static::class;
    }
    function getSelf() {
        // gets THIS class of class in which function is declared
        return self::class;
    }
}

class Y extends X {
}
class Z extends Y {
}

$x = new X();
$y = new Y();
$z = new Z();

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf();

Resultados:

X: X, X
Y: Y, X
Z: Z, X
JerzySkalski
fuente
2

end(preg_split("#(\\\\|\\/)#", Class_Name::class))

Class_Name::class: devuelve la clase con el espacio de nombres. Entonces, después de que solo necesite crear una matriz, obtenga el último valor de la matriz.

CallMarl
fuente
0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

echo Model::_class; // will return 'CMS\Model'

para versiones anteriores a PHP 5.5

23Pestrellas
fuente
0
echo substr(strrchr(__CLASS__, "\\"), 1);    
Lukas Correa
fuente