我希望在基类中获取子类的名称,这样每当创建子类的对象时,我都会在基类中获得子类的名称。像这样:
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
时,我希望构造函数为我提供创建对象的类的名称。
答案 0 :(得分:7)
是的,在一定程度上。在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
,通过Late Static Binding,将返回实际调用的方法的类名(D
)。
但是,请注意,如果不使用更高级的方法(通过C
或通过反射解析调用堆栈),则无法获取当前函数(debug_backtrace
)的直接子后代。< / p>
答案 1 :(得分:4)
当然可以使用基类中的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"
这称为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;
}
?>