PHPのお勉強!

PHP TOP

get_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_classオブジェクトのクラス名を返す

説明

get_class(object $object = ?): string

指定した object のクラス名を取得します。

パラメータ

object

調べるオブジェクト。

注意: object に明示的に null を渡すことは、 PHP 7.2.0 以降許されなくなり、E_WARNING レベルの警告が発生します。 PHP 8.0.0 以降では、null を渡すと TypeError がスローされます。

戻り値

オブジェクト 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

up
69
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
up
30
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;
}
);
?>
up
17
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
up
7
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
?>
up
1
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
?>
up
1
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
?>
up
5
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
)
up
1
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;
}
up
2
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;
}
up
1
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;
}
}
?>
up
1
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
up
1
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).
up
0
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'

?>
up
-2
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();
up
0