我有一个名为Foo
的类,带有构造函数,我想让它的一个变量作为子类的名称。
示例:
class Foo {
protected static $name;
protected static $something;
public function __construct( $something ) {
self::$something = $something;
self::$name = strtolower( __CLASS__ );
}
static public function hello() {
echo self::$name;
}
}
class Bar extends Foo {}
new Foo( 'lazy' );
Bar::hello();
结果将始终为foo()
,因为构造函数仅由new Foo()
调用。
那么,方式是什么?调用静态方法时是否有一个魔术方法?对不起解释不好。
答案 0 :(得分:0)
get_called_class()
代替__CLASS__
魔法常量。
http://php.net/manual/en/function.get-called-class.php
手册中的更多信息:late static binding
答案 1 :(得分:0)
正如@JesusTheHun所说,首先你要将__CLASS__
更改为get_called_class()
或static::class
(从PHP 5.5开始)。字符串__CLASS__
在编译时被读取,并且将始终引用它所指定的类。其他任何一个选项都将在运行时生效。
但是,通过在构造函数中设置静态类变量,您将为该类的所有实例(过去和现在)更改该变量,并为任何静态调用更改该变量。因此,无论何时实例化树中任何类的实例,以后对hello()的所有调用都将显示该类名,即
<?php
class Foo {
protected static $name;
protected static $something;
public function __construct() {
self::$name = strtolower( static::class );
}
static public function hello() {
echo self::$name;
}
}
class Bar extends Foo {}
class Baz extends Foo {}
new Foo;
Bar::hello(); // "foo"
new Baz;
Bar::hello(); // "baz"
这似乎不是你正在寻找的行为。如果您想要的是一个静态方法,它将回显调用它的类名,那么您可以使用上述方法之一,例如。
static public function hello() {
echo static::class;
}