PHP get class name without namespace
public function getName() {
$path = explode('\\', __CLASS__);
return array_pop($path);
}
Written by Markus Perl
Related protips
9 Responses
public function getName() {
return substr(strrchr(__CLASS__, "\\"), 1);
}
ReflectionClass is actually faster;
(new \ReflectionClass($this))->getShortName();
It was a big surprise to me, but reflection is actually much faster than the other two.
Here is the result:
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]
I have to mention that if I run the tests only once (no iterations, but several runs and making an avarage), the substring solution is the winner in speed. (This is probably because reflection is cached)
Actually the original solution is the slowest of all.
Using the CLASS constant generally works, however it fails if used in a child class of a class which uses a trait:
trait ClassDetector
{
public function getClassName()
{
return __CLASS__;
}
}
class Foo
{
use ClassDetector;
}
class Bar extends Foo
{
}
$bar = new Bar;
// returns Foo
$bar->getClassName();
fastest solution so far
return (substr($classname, strrpos($classname, '\\') + 1));
why not
class_basename($objectOrString);
?
@filpgame
why not
class_basename($objectOrString); ?
class_basename is over 10x slower on my machine anyway
using this script
$time = microtime(true);
for($i=0; $i < 1000000; ++$i){
//$a=explode('\', CLASS); arraypop($a);
// 0.29 sec
substr(strrchr(CLASS, "\"), 1);
// 0.15 sec
//(new \ReflectionClass($this))->getShortName();
// 0.35 sec
//classbasename(CLASS);
// 3.6 sec
}
var_dump([
$time,
microtime(true),
(microtime(true)-$time),
]);
You can do this with reflection.
$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
// do this
}
You can use ReflectionClass::getShortName which get name of the class without its namespace.
(new \ReflectionClass(getcalledclass()))->getShortName()