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

时间:2015-06-23 10:02:42

标签: php oop

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

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时,我希望构造函数为我提供创建对象的类的名称。

4 个答案:

答案 0 :(得分:7)

是的,在一定程度上。在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,通过Late Static Binding,将返回实际调用的方法的类名(D)。

但是,请注意,如果不使用更高级的方法(通过C或通过反射解析调用堆栈),则无法获取当前函数(debug_backtrace)的直接子后代。< / p>

答案 1 :(得分:4)

当然可以使用基类中的static::classget_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"

这称为late static binding。这是上面的demo

答案 2 :(得分:2)

您可以使用get_class()将当前对象引用传递给它,如下所示:

class Base_class {

    function __construct() {
        $calledClassName = get_class($this);
    }

}

编辑:您可以在PHP手册http://php.net/manual/en/function.get-class.php

中找到有关get_class()的更多信息

答案 3 :(得分:0)

好吧,然后明确地传递它:

<?php
$i=1;
while($i<50)
{
echo '<div id="'.$i.'">' . 'Anchor' . '</div>';
echo '<a href="#'.$i.'">' . 'Link-A ' . '</a>';
echo '<a href="#'.$i.'">' . 'Link-B ' . '</a>';
$i=$i+1;
}
?>