Как мне получить имя класса в PHP?
public class MyClass {
}
в Java, мы можем получить имя класса с String className = MyClass.class.getSimpleName();
как это сделать в PHP? Я уже знаю get_class()
, но это работает только для объектов. В настоящее время я работаю в Active Record. Мне нужно заявление, как MyClass::className
.
7 ответов:
начиная с 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 ().
похоже, вы ответили на свой вопрос.
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's 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
вместо этого, который полагается на Поздняя Статическая Привязка, относительно новая функция, и требует 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'
теперь у меня есть ответ на мою проблему. Спасибо бред для ссылки, я нахожу ответ здесь. И спасибо J. Деньги за идею. Мое решение:
<?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"
Я думаю, что важно упомянуть небольшую разницу между "само" и "статическим" в 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