2017-02-19 22 views
2

當你繼承類,在子類中設置一些常量和父類有需要使用它們的靜態方法:在繼承PHP類使用常量

class some_helperclass { 

    public static function add_them() { 

     return self::some_c + self::another_c; 
    } 

}  

class mainclass extends some_helperclass { 

    const some_c = 1; 
    const another_c = 2; 

} 

我得到一個錯誤,當我嘗試執行此:

mainclass::add_them()

有沒有辦法得到這個工作?

+2

「錯誤」 - 好,這是不是很具體。想告訴任何人,或者你自己谷歌? – mario

回答

3

這是late static binding工作原理的一個很好的例子。

我不會重寫它的文檔,但TL; DR是self是指執行代碼的文字類。在你的例子中,它是mainclass,它定義了常量,但是some_helperclass讀取它們,所以它不能使用self

如果您更改爲使用static::CONST_NAMEwill work

此外 - 這是一個很好的做法,只命名大寫常量。

代碼示例:

<?php 

class some_helperclass { 

public static function add_them() { 

    return static::some_c + static::another_c; 
    } 

}  

class mainclass extends some_helperclass { 

    const some_c = 1; 
    const another_c = 2; 

} 

var_dump(mainclass::add_them()); 

輸出:int(3)

+0

eval.in正在拋出(內部)服務器錯誤(我肯定他們的錯誤是他們的結局)。我編輯 –

+0

謝謝弗雷德 - 它有時會這樣做:-) –

+0

太棒了!謝謝你們的幫助。 :) – zag2010