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.

Rezan Achmad
fonte
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 () .

Dado
fonte
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

Brad
fonte
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'
Nenhum
fonte
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" 
Rezan Achmad
fonte
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();
    }
}
Omar Makled
fonte
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]
Илья Зеленько
fonte
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
JerzySkalski
fonte
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.

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

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

para mais de PHP 5.5

23 estrelas
fonte
0
echo substr(strrchr(__CLASS__, "\\"), 1);    
Lukas Correa
fonte