我想在基类中获取子类的名称,以便每当创建子类的对象时,我都会获取基类中子类的名称。 像这样:
class Base_class {
function __construct() {
// Some code Here to get the name of the child class
}
}
class Child_class extends Base_Class {}
class Another_child_class extends Base_Class {}
$object = new Child_Class;
$object2 = new Another_child_class;
创建$object
时,我希望构造函数为我提供从中创建对象的类的名称。
是的,在某种程度上。在 PHP 5.5 中,添加了 ::class
类常量,该常量返回应用它的类的类名。然后,您可以将其与 parent
、 self
或 static
结合使用。请考虑以下代码:
<?php
class A {}
class B extends A
{
public function foo() {
echo parent::class . "'n"; // A
echo __CLASS__ . "'n"; // B
echo self::class . "'n"; // B
echo static::class . "'n"; // D
echo get_class($this) . "'n"; // D
}
}
class C extends B {}
class D extends C {}
(new D)->foo();
self::class
将返回与 __CLASS__
相同的内容,属于当前执行的函数的类(在本例中为 B
(。
parent::class
将返回方法的父类的名称 ( A
(。
static::class
,通过后期静态绑定,将返回实际调用的方法的类名(D
(。
但是请注意,如果不使用更高级的方法(通过debug_backtrace
或反射解析调用堆栈(,则无法获取当前函数(C
(的直接子后代。
这
当然可以在基类中使用static::class
(或get_class($this)
或get_called_class()
(来获取子级的名称(最初在运行时调用(:
<?php
class Foo
{
public function __construct()
{
var_dump(static::class, get_class($this), get_called_class());
}
}
class Bar extends Foo { }
class Baz extends Bar { }
new Foo();
new Bar();
new Baz();
生产:
string(3) "Foo"
string(3) "Foo"
string(3) "Foo"
string(3) "Bar"
string(3) "Bar"
string(3) "Bar"
string(3) "Baz"
string(3) "Baz"
string(3) "Baz"
这称为后期静态绑定。这是上述内容的演示。
您可以使用
get_class()
传递当前对象引用,如下所示:
class Base_class {
function __construct() {
$calledClassName = get_class($this);
}
}
编辑:您可以在PHP手册中找到有关get_class()
的更多信息 http://php.net/manual/en/function.get-class.php
好吧,然后明确传递它:
class BaseClass{
function __construct($tableName){
// do stuff w/ $tableName
}
}
class ChildClass extends BaseClass{
function __construct(){
parent::__construct('ChildClass');
}
}