[英]Auto init of a static class that extends parent
我有一個帶有構造函數的名為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()
調用。
那么,怎么回事呢? 調用靜態方法時是否調用了魔術方法? 對不起,不好的解釋。
應該使用get_called_class()
代替__CLASS__
魔術常數。
http://php.net/manual/zh/function.get-drawn-class.php
手冊中的更多信息: 后期靜態綁定
正如@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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.