Как получить имя класса в PHP?
public class MyClass {
}
В Java мы можем получить имя класса с String className = MyClass.class.getSimpleName();
Как это сделать в PHP? Я уже знаю get_class()
, но он работает только для объектов. В настоящее время я работаю в Active Record. Мне нужно выражение типа MyClass::className
.
Ответы
Ответ 1
С PHP 5.5 вы можете использовать разрешение имен классов с помощью ClassName:: class.
Смотрите новые функции PHP5.5.
<?php
namespace Name\Space;
class ClassName {}
echo ClassName::class;
?>
Если вы хотите использовать эту функцию в своем методе класса, используйте static:: class:
<?php
namespace Name\Space;
class ClassName {
/**
* @return string
*/
public function getNameOfClass()
{
return static::class;
}
}
$obj = new ClassName();
echo $obj->getNameOfClass();
?>
Для более старых версий PHP вы можете использовать get_class().
Ответ 2
Вы можете использовать __CLASS__
внутри класса, чтобы получить имя.
http://php.net/manual/en/language.constants.predefined.php
Ответ 3
Похоже, ты ответил на свой вопрос. get_class
получит имя класса. Это процедурный и, возможно, именно это вызывает путаницу. Взгляните на документацию php для get_class
Вот их пример:
<?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 name is foo
// internal call
$bar->name(); // My name is foo
Чтобы сделать его более похожим на ваш пример, вы можете сделать что-то вроде:
<?php
class MyClass
{
public static function getClass()
{
return get_class();
}
}
Теперь вы можете сделать:
$className = MyClass::getClass();
Это несколько ограничено, потому что, если мой класс будет расширен, он все равно вернет "MyClass". Вместо этого мы можем использовать get_called_class
, который полагается на Late Static Binding, относительно новую функцию и требует 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'
Ответ 4
Теперь у меня есть ответ на мою проблему. Благодаря Brad для ссылки я найду ответ здесь. И благодаря J.Money за эту идею. Мое решение:
<?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"
Ответ 5
Чтобы получить имя класса вы можете использовать ReflectionClass
class MyClass {
public function myNameIs(){
return (new \ReflectionClass($this))->getShortName();
}
}
Ответ 6
Я думаю, что важно отметить небольшую разницу между "я" и "статикой" в PHP, поскольку "лучший ответ" использует "статический", который может дать запутанный результат для некоторых людей.
<?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();
Результаты:
X: X, X
Y: Y, X
Z: Z, X
Ответ 7
<?php
namespace CMS;
class Model {
const _class = __CLASS__;
}
echo Model::_class; // will return 'CMS\Model'
старше PHP 5.5
Ответ 8
end(preg_split("#(\\\\|\\/)#", Class_Name::class))
Class_Name::class
: вернуть класс с пространством имен. Поэтому после того, как вам нужно только создать массив, получите последнее значение массива.
Ответ 9
Похоже, ReflectionClass
- довольно продуктивный вариант.
class MyClass {
public function test() {
// 'MyClass'
return (new \ReflectionClass($this))->getShortName();
}
}
Ориентир:
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]