get_class
(PHP 4, PHP 5, PHP 7, PHP 8)
get_class — オブジェクトのクラス名を返す
パラメータ
戻り値
オブジェクト object
がインスタンス
であるクラスの名前を返します。
object
が
名前空間の中に存在しているクラスのインスタンスだった場合、
名前空間で修飾されたクラス名が返されます。
エラー / 例外
オブジェクト以外に対して get_class() をコールすると、
TypeError がスローされます。
PHP 8.0.0 より前のバージョンでは、
E_WARNING
レベルの警告が発生していました。
get_class() が、クラスの外部から引数なしで呼ばれた場合、
Error が発生します。PHP 8.0.0 より前のバージョンでは、
E_WARNING
レベルの警告が発生していました。
変更履歴
バージョン | 説明 |
---|---|
8.3.0 |
get_class() を引数なしでコールすると、
E_DEPRECATED が発生するようになりました。
これより前のバージョンでは、クラスの内部でこの関数をコールすると、
そのクラスの名前を返していました。
|
8.0.0 |
この関数をクラスの外部から引数なしで呼び出すと、
Error が発生するようになりました。
これより前のバージョンでは、
E_WARNING レベルの警告が発生し、
false を返していました。
|
7.2.0 |
null は、object のデフォルトのパラメータとして
扱われなくなり、
正しい入力ではなくなりました。
これより前のバージョンでは、object
のデフォルトのパラメータは null であり、何も値を渡さないのと同じ意味でした。
|
例
例1 get_class() の使用例
<?php
class foo {
function name()
{
echo "My name is " , get_class($this) , "\n";
}
}
// オブジェクトを生成
$bar = new foo();
// 外部からコール
echo "Its name is " , get_class($bar) , "\n";
// 内部からコール
$bar->name();
?>
上の例の出力は以下となります。
Its name is foo My name is foo
例2 get_class() のスーパークラスでの使用例
<?php
abstract class bar {
public function __construct()
{
var_dump(get_class($this));
var_dump(get_class());
}
}
class foo extends bar {
}
new foo;
?>
上の例の出力は以下となります。
string(3) "foo" string(3) "bar"
例3 名前空間の中にあるクラスを get_class() で使う
<?php
namespace Foo\Bar;
class Baz {
public function __construct()
{
}
}
$baz = new \Foo\Bar\Baz;
var_dump(get_class($baz));
?>
上の例の出力は以下となります。
string(11) "Foo\Bar\Baz"
参考
- get_called_class() - "遅延静的束縛" のクラス名
- get_parent_class() - オブジェクトの親クラスの名前を取得する
- gettype() - 変数の型を取得する
- get_debug_type() - 変数の型名をデバッグしやすい形で取得する
- is_subclass_of() - あるオブジェクトが指定したクラスのサブクラスに属するか (あるいは指定したインターフェイスを実装しているか) どうかを調べる
+add a note
User Contributed Notes 36 notes
jjanak at webperfection dot net ¶
10 years ago
>= 5.5
::class
fully qualified class name, instead of get_class
<?php
namespace my\library\mvc;
class Dispatcher {}
print Dispatcher::class; // FQN == my\library\mvc\Dispatcher
$disp = new Dispatcher;
print $disp::class; // parse error
dave at shax dot com ¶
10 years ago
A lot of people in other comments wanting to get the classname without the namespace. Some weird suggestions of code to do that - not what I would've written! So wanted to add my own way.
<?php
function get_class_name($classname)
{
if ($pos = strrpos($classname, '\\')) return substr($classname, $pos + 1);
return $pos;
}
?>
Also did some quick benchmarking, and strrpos() was the fastest too. Micro-optimisations = macro optimisations!
39.0954 ms - preg_match()
28.6305 ms - explode() + end()
20.3314 ms - strrpos()
(For reference, here's the debug code used. c() is a benchmarking function that runs each closure run 10,000 times.)
<?php
c(
function($class = 'a\b\C') {
if (preg_match('/\\\\([\w]+)$/', $class, $matches)) return $matches[1];
return $class;
},
function($class = 'a\b\C') {
$bits = explode('\\', $class);
return end($bits);
},
function($class = 'a\b\C') {
if ($pos = strrpos($class, '\\')) return substr($class, $pos + 1);
return $pos;
}
);
?>
mail dot temc at gmail dot com ¶
13 years ago
People seem to mix up what __METHOD__, get_class($obj) and get_class() do, related to class inheritance.
Here's a good example that should fix that for ever:
<?php
class Foo {
function doMethod(){
echo __METHOD__ . "\n";
}
function doGetClassThis(){
echo get_class($this).'::doThat' . "\n";
}
function doGetClass(){
echo get_class().'::doThat' . "\n";
}
}
class Bar extends Foo {
}
class Quux extends Bar {
function doMethod(){
echo __METHOD__ . "\n";
}
function doGetClassThis(){
echo get_class($this).'::doThat' . "\n";
}
function doGetClass(){
echo get_class().'::doThat' . "\n";
}
}
$foo = new Foo();
$bar = new Bar();
$quux = new Quux();
echo "\n--doMethod--\n";
$foo->doMethod();
$bar->doMethod();
$quux->doMethod();
echo "\n--doGetClassThis--\n";
$foo->doGetClassThis();
$bar->doGetClassThis();
$quux->doGetClassThis();
echo "\n--doGetClass--\n";
$foo->doGetClass();
$bar->doGetClass();
$quux->doGetClass();
?>
OUTPUT:
--doMethod--
Foo::doMethod
Foo::doMethod
Quux::doMethod
--doGetClassThis--
Foo::doThat
Bar::doThat
Quux::doThat
--doGetClass--
Foo::doThat
Foo::doThat
Quux::doThat
ovidiu.bute [at] gmail.com ¶
14 years ago
If you are using namespaces this function will return the name of the class including the namespace, so watch out if your code does any checks for this. Ex:
namespace Shop;
<?php
class Foo
{
public function __construct()
{
echo "Foo";
}
}
//Different file
include('inc/Shop.class.php');
$test = new Shop\Foo();
echo get_class($test);//returns Shop\Foo
?>
Anonymous ¶
10 years ago
If you want the path to an file if you have i file structure like this
project -> system -> libs -> controller.php
project -> system -> modules -> foo -> foo.php
and foo() in foo.php extends controller() in controller.php like this
<?PHP
namespace system\modules\foo;
class foo extends \system\libs\controller {
public function __construct() {
parent::__construct();
}
}
?>
and you want to know the path to foo.php in controller() this may help you
<?PHP
namespace system\libs;
class controller {
protected function __construct() {
$this->getChildPath();
}
protected function getChildPath() {
echo dirname(get_class($this));
}
}
?>
<?PHP
$f = new foo(); // system\modules\foo
?>
ozana at omdesign dot cz ¶
13 years ago
Simplest way how to gets Class without namespace
<?php
namespace a\b\c\d\e\f;
class Foo {
public function __toString() {
$class = explode('\\', __CLASS__);
return end($class);
}
}
echo new Foo(); // prints Foo
?>
macnimble at gmail dot com ¶
12 years ago
Need a quick way to parse the name of a class when it's namespaced? Try this:
<?php
namespace Engine;
function parse_classname ($name)
{
return array(
'namespace' => array_slice(explode('\\', $name), 0, -1),
'classname' => join('', array_slice(explode('\\', $name), -1)),
);
}
final class Kernel
{
final public function __construct ()
{
echo '<pre>', print_r(parse_classname(__CLASS__),1), '</pre>';
// Or this for a one-line method to get just the classname:
// echo join('', array_slice(explode('\\', __CLASS__), -1));
}
}
new Kernel();
?>
Outputs:
Array
(
[namespace] => Array
(
[0] => Engine
)
[classname] => Kernel
)
Anonymous ¶
16 years ago
In Perl (and some other languages) you can call some methods in both object and class (aka static) context. I made such a method for one of my classes in PHP5, but found out that static methods in PHP5 do not 'know' the name of the calling subclass', so I use a backtrace to determine it. I don't like hacks like this, but as long as PHP doesn't have an alternative, this is what has to be done:
public function table_name() {
$result = null;
if (isset($this)) { // object context
$result = get_class($this);
}
else { // class context
$result = get_class();
$trace = debug_backtrace();
foreach ($trace as &$frame) {
if (!isset($frame['class'])) {
break;
}
if ($frame['class'] != $result) {
if (!is_subclass_of($frame['class'], $result)) {
break;
}
$result = $frame['class'];
}
}
}
return $result;
}
emmanuel dot antico at gmail dot com ¶
11 years ago
/**
* Obtains an object class name without namespaces
*/
function get_real_class($obj) {
$classname = get_class($obj);
if (preg_match('@\\\\([\w]+)$@', $classname, $matches)) {
$classname = $matches[1];
}
return $classname;
}
Edward ¶
16 years ago
The code in my previous comment was not completely correct. I think this one is.
<?
abstract class Singleton {
protected static $__CLASS__ = __CLASS__;
protected function __construct() {
}
abstract protected function init();
/**
* Gets an instance of this singleton. If no instance exists, a new instance is created and returned.
* If one does exist, then the existing instance is returned.
*/
public static function getInstance() {
static $instance;
$class = self::getClass();
if ($instance === null) {
$instance = new $class();
$instance->init();
}
return $instance;
}
/**
* Returns the classname of the child class extending this class
*
* @return string The class name
*/
private static function getClass() {
$implementing_class = static::$__CLASS__;
$original_class = __CLASS__;
if ($implementing_class === $original_class) {
die("You MUST provide a <code>protected static \$__CLASS__ = __CLASS__;</code> statement in your Singleton-class!");
}
return $implementing_class;
}
}
?>
RQuadling at GMail dot com ¶
10 years ago
With regard to getting the class name from a namespaced class name, then using basename() seems to do the trick quite nicely.
<?php
namespace Foo\Bar;
abstract class Baz
{
public function report()
{
echo
'__CLASS__ ', __CLASS__, ' ', basename(__CLASS__), PHP_EOL,
'get_called_class ', get_called_class(), ' ', basename(get_called_class()), PHP_EOL;
}
}
class Snafu extends Baz
{
}
(new Snafu)->report();
?>
produces output of ...
__CLASS__ Foo\Bar\Baz Baz
get_called_class Foo\Bar\Snafu Snafu
Hayley Watson ¶
7 years ago
Although you can call a class's static methods from an instance of the class as though they were object instance methods, it's nice to know that, since classes are represented in PHP code by their names as strings, the same thing goes for the return value of get_class():
<?php
$t->Faculty();
SomeClass::Faculty(); // $t instanceof SomeClass
"SomeClass"::Faculty();
get_class($t)::Faculty();
?>
The first is legitimate, but the last makes it clear to someone reading it that Faculty() is a static method (because the name of the method certainly doesn't).
dense ¶
8 years ago
well, if you call get_class() on an aliased class, you will get the original class name
<?php
class Person {}
class_alias('Person', 'User');
$me = new User;
var_dump( get_class($me) ); // 'Person'
?>
davidsch ¶
3 years ago
There are discussions below regarding how to create a singleton that allows subclassing. It seems with get_called_class there is now a cleaner solution than what is discussed below, that does not require overriding a method per subclass.
e.g.
<?php
abstract class MySuperclass {
static private $instances = array();
static public function getInstance(): ACFBlock {
$className = get_called_class();
if (!isset(self::$instances[$className])) {
self::$instances[$className] = new static();
}
return self::$instances[$className];
}
private function __construct() {
// Singleton
}
}
class MySubclass extends MySuperclass {
}
MySubclass::getInstance();