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

public class MyClass {

}

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

De cómo hacer esto en PHP? Ya sé get_class(), pero funciona sólo para los objetos. Actualmente estoy trabajando en el Registro Activo. Necesito declaración como MyClass::className.

  • Podría dar un ejemplo concreto, cuando podría ser útil en php? Si usted tiene codificado el classname – usted puede envolver en citas y conseguir lo que quieres.
  • Por desgracia automático refactorings (por ejemplo, en IDEs) como RenameClass generalmente no cambiar el nombre de dicha clase que las cadenas de nombre. Por lo tanto, sería bueno tener algún tipo de forma estática para obtener el nombre de la clase, aparte de hacer el public $__CLASS__ = __CLASS__; bailar con cada una de las otras clases…
  • Posibles duplicados de ¿Cómo puedo obtener el nombre de la clase a partir de una llamada estática en una extensión de la clase de PHP?
InformationsquelleAutor Rezan Achmad | 2013-02-27

10 Kommentare

  1. 105

    Desde PHP 5.5 puede utilizar el nombre de clase de la resolución a través de Nombreclase::clase.

    Ver las nuevas características de PHP5.5.

    <?php
    
    namespace Name\Space;
    
    class ClassName {}
    
    echo ClassName::class;
    
    ?>

    Si desea utilizar esta característica en su clase en el uso del método estática::clase:

    <?php
    
    namespace Name\Space;
    
    class ClassName {
       /**
        * @return string
        */
       public function getNameOfClass()
       {
          return static::class;
       }
    }
    
    $obj = new ClassName();
    echo $obj->getNameOfClass();
    
    ?>

    Para versiones antiguas de PHP, puede utilizar get_class().

    • ¿Cuál es la diferencia entre static::class y get_class_name()?
    • Parece como si static::class se resuelve durante el tiempo de compilación, mientras que get_class_name() se interpreta en tiempo de ejecución. He encontrado esto por intentar acceder a el ::de la propiedad de clase(?) de una clase generada dinámicamente y obteniendo el siguiente error: Dynamic class names are not allowed in compile-time ::class fetch. Ver este respuesta para más detalles. También encontré esta nota de la documentación de ayuda.
  2. 26

    Puede utilizar __CLASS__ dentro de una clase para obtener el nombre.

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

    • usted también puede echar un vistazo aquí para ver todos los interesantes const : php.net/manual/en/language.constants.predefined.php
    • Gracias a @Brad por el enlace, me parece que la respuesta aquí
    • Ese es el enlace que he enlazado en mi respuesta.
    • +1 como yo estaba tratando de obtener el nombre de la clase en un método definido en la clase padre. Otras soluciones (get_class($this), static::class) simplemente devuelve el niño (que se extiende a los padres) nombre de la clase.
    • viene: self::class, también, parece que vuelve el padre nombre de la clase.
  3. 21

    Suena como usted contestó a su propia pregunta. get_class conseguirá que el nombre de la clase. Es de procedimiento y tal vez eso es lo que está causando la confusión. Echa un vistazo a la documentación de php para get_class

    Aquí está el 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 hacer más como su ejemplo, usted podría hacer algo como:

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

    Ahora usted puede hacer:

     $className = MyClass::getClass();

    Esto es algo limitado, sin embargo, porque si mi clase se amplió aún regresar ‘Miclase’. Podemos utilizar get_called_class lugar, que se basa en A Finales De Estática De Unión, una característica relativamente nueva, y requiere de 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. Dinero para la idea.. Pero no funciona en la herencia.
  4. 10

    Ahora, tengo la respuesta para mi problema. Gracias a Brad por el enlace, me parece que la respuesta aquí. Y gracias a J. Dinero 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" 
    • No tiene ningún sentido. FooBar::getClassName() es siempre 'FooBar'. Si usted podría escribir Product::getClassName() – entonces usted podría escribir 'Product' lugar así.
    • Sí, lo sé.. quiero evitar el error y también cuando re-factorizar el nombre de la clase (con el IDE de herramientas), no necesito search & reemplazar la cadena.
  5. 8

    Para obtener el nombre de la clase puede utilizar ReflectionClass

    class MyClass {
        public function myNameIs(){
            return (new \ReflectionClass($this))->getShortName();
        }
    }
    • Mientras este fragmento de código puede ser la solución, incluyendo una explicación realmente ayuda a mejorar la calidad de tu post. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, y esas personas pueden no saber las razones de su sugerencia de código.
    • Absolutamente Especial!!! Este es un SUPER solución simple pero! Thankss!!!!
  6. 3

    Creo que es importante mencionar poca diferencia entre ‘yo’ y ‘estática’ en PHP como «mejor respuesta» usos «estático» que puede dar un resultado confuso para 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
  7. 2

    Parece ReflectionClass es un muy productivos opción.

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

    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]
    
  8. 0
    <?php
    namespace CMS;
    class Model {
      const _class = __CLASS__;
    }
    
    echo Model::_class; //will return 'CMS\Model'

    para mayores de PHP 5.5

  9. 0

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

    Class_Name::class: el retorno de la clase con el espacio de nombres. Así que después de que usted sólo tiene que crear una matriz, a continuación, obtener el último valor de la matriz.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea