创建子类的对象时,如何从基类获取子类的名称


How to get the name of child class from base class when an object of child class is created

我想在基类中获取子类的名称,以便每当创建子类的对象时,我都会获取基类中子类的名称。 像这样:

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 类常量,该常量返回应用它的类的类名。然后,您可以将其与 parentselfstatic 结合使用。请考虑以下代码:

<?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');
  }
}