public class MyClass { }
В Java мы можем получить имя класса с помощью String className = MyClass.class.getSimpleName();
Как это сделать в PHP? Я уже знаю get_class()
, но он работает только для объектов. В настоящее время я работаю в Active Record. Мне нужна инструкция типа MyClass::className
.
Начиная с 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 () .
Вы можете использовать __CLASS__
в классе, чтобы получить имя.
Теперь у меня есть ответ на мою проблему. Спасибо Брэду за ссылку, я нахожу здесь ответ. И благодаря 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"
Похоже, ты ответил на свой вопрос. 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
этого мы можем использовать 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'
Я думаю, что важно отметить небольшую разницу между «я» и «статикой» в 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
<?php namespace CMS; class Model { const _class = __CLASS__; } echo Model::_class; // will return 'CMS\Model'
для старше PHP 5.5
$foo = (new \ReflectionClass($this))->getShortName();