¿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.


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 () .


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


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'

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" 

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();
    }
}

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]

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

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.


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

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

para versiones anteriores a PHP 5.5


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.