Como obtenho o nome da classe em PHP?


99
public class MyClass {

}

Em Java, podemos obter o nome da classe com String className = MyClass.class.getSimpleName();

Como fazer isso em PHP? Eu já sei get_class(), mas funciona apenas para objetos. Atualmente trabalho com Active Record. Eu preciso de uma declaração como MyClass::className.


1
Você poderia dar um exemplo específico quando pode ser útil em php? Se você codificou o nome da classe - você pode colocá-lo entre aspas e obter o que deseja.
zerkms

2
Infelizmente, refatorações automáticas (por exemplo, em IDEs) como RenameClass geralmente não renomeiam essas strings de nome de classe. Portanto, seria bom ter algum tipo de forma estática de obter o nome da classe, além de fazer a public $__CLASS__ = __CLASS__;dança com todas as outras classes ...
EricSchaefer

Respostas:


114

Desde o PHP 5.5 você pode usar resolução de nome de classe via ClassName :: class .

Veja os novos recursos do PHP5.5 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

Se você quiser usar este recurso em seu método de classe, use static :: class :

<?php

namespace Name\Space;

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

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

?>

Para versões anteriores do PHP , você pode usar get_class () .


5
Qual é a diferença entre static::classe get_class_name()?
Alexander Jank

1
@AlexanderJank Parece que static::classé resolvido durante o tempo de compilação, enquanto get_class_name()é interpretado durante o tempo de execução. Descobri isso ao tentar acessar o :: propriedade de classe de uma classe gerada dinamicamente e recebendo o seguinte erro (?): Dynamic class names are not allowed in compile-time ::class fetch. Veja esta resposta para mais detalhes. Eu também achei esta nota dos documentos útil.
cjsimon

29

Você pode usar __CLASS__dentro de uma classe para obter o nome.

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


3
você também pode dar uma olhada aqui para ver todas as const interessantes: php.net/manual/en/language.constants.predefined.php
MatRt

Obrigado a @Brad pelo link, encontro a resposta aqui
Rezan Achmad

2
@ user1073122, Esse é o link que vinculei na minha resposta.
Brad

1 enquanto eu estava tentando obter o nome da classe em um método que é definido na classe pai. Outras soluções ( get_class($this), static::class) simplesmente retorna o nome da classe filha (que estende o pai).
akinuri

continuou :, self::classtambém, parece retornar o nome da classe pai.
akinuri

22

Parece que você respondeu sua própria pergunta. get_classobterá o nome da classe. É processual e talvez seja isso que esteja causando a confusão. Dê uma olhada na documentação php paraget_class

Aqui está o exemplo deles:

 <?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 torná-lo mais parecido com o seu exemplo, você poderia fazer algo como:

 <?php

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

Agora você pode fazer:

 $className = MyClass::getClass();

Isso é um pouco limitado, entretanto, porque se minha classe for estendida, ela ainda retornará 'MyClass'. Podemos usar get_called_class, em vez disso, o que depende de Late Static Binding , um recurso relativamente novo e requer 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'

Obrigado @ J.Money pela ideia .. Mas não funciona na herança.
Rezan Achmad

11

Agora, tenho uma resposta para o meu problema. Agradeço ao Brad pelo link, encontro a resposta aqui . E obrigado a J.Money pela ideia. Minha solução:

<?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
Isso não faz sentido. FooBar::getClassName()é sempre 'FooBar'. Se você pudesse digitar Product::getClassName(), você também poderia digitar 'Product'.
zerkms

7
Sim, eu sei .. Quero evitar erros de digitação e também ao refatorar o nome da classe (com ferramentas IDE), não preciso pesquisar e substituir a string.
Rezan Achmad

Isso também pode ajudar se você precisar usar o nome da classe da classe filha na classe pai "Model".
JR Lawhorne

8

Para obter o nome da classe, você pode usar ReflectionClass

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

Embora este trecho de código possa ser a solução, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código.
yivi

Absolutamente especial !!! Esta é uma solução SUPER, mas simples! Obrigado !!!!
Simone Campagna

4

Parece ReflectionClassuma opção bastante produtiva.

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

Referência:

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

Eu acho que é importante mencionar pouca diferença entre 'self' e 'static' no PHP, já que a 'melhor resposta' usa 'estático', o que pode dar um resultado confuso para algumas pessoas.

<?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: retorna a classe com o namespace. Então, depois que você só precisa criar um array, obtenha o último valor do array.


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

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

para mais de PHP 5.5


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.