2016-05-12 67 views
0

我有一個叫做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

https://eval.in/569930 – splash58

+0

謝謝,但這解決不了。我需要將它存儲在一個變量中,而不是每次都調用該函數。你好需要只是一個變量的查看者,而不是一個虛假的二傳手。 – Grork

+0

*我需要將它存儲在一個變量中* - 如果您想要調用構造函數,將會如何? – splash58

回答

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; 
    } 
+0

恩,是的,我認爲這點很重要,但是我不需要每次都上課(所以避免新的巴茲)。我認爲沒有自動的方法。 – Grork

+0

@Grork我不知道那時我能理解。如果你想要一個靜態方法來回顯相應的類名,那麼在我的回答結尾處使用hello()方法。如果你想讓它返回其他東西,那麼這聽起來像你正在尋找的東西根本不是一個靜態方法。那麼, – iainn

+0

。你是對的。我想我會用這個。謝謝! – Grork