2014-09-04 106 views
2

我想一個類中訪問一個變量的函數:訪問公共靜態變量

class google_api_v3 { 

    public static $api_key = 'this is a string'; 

    function send_response() { 
    // access here $api_key, I tried with $this->api_key, but that works only on private and that variable I need also to access it outside the class that is why I need it public. 
    } 

} 

function outside_class() { 
    $object = new google_api_v3; 
    // works accessing it with $object::api_key 
} 
+1

外:google_api_v3 :: $ API_KEY也應努力?和內部使用:self :: $ api_key或static :: $ api_key – 2014-09-04 09:18:38

+0

@RaphaelMüller是的,工作。 – user3467855 2014-09-04 09:21:34

+0

@ user3467855順便說一句,因爲你似乎認爲它是關於可變的可見性,所以你的變量是公有的還是私有的這一事實與你的問題無關。我不明白「它只適用於私人」如何使用$ this-> api_key,它不應該工作。 – Sugar 2014-09-04 09:42:04

回答

3
class google_api_v3 { 

    public static $api_key = 'this is a string'; 

    function send_response() { 
    $key = google_api_v3::$api_key 
    } 

} 

function outside_class() { 
    $object = new google_api_v3; 
    // works accessing it with $object::api_key 
} 
+0

如果我在send_response()函數內的$ api_key中分配了一個新值,如何從類外的函數訪問指定的值? – suisied 2016-01-13 04:39:27

8

使用值/方法(包括靜態的)一個通用的方法裏面類是self::

echo self::$api_key; 
+0

只有當你擴展類並且你覆蓋靜態變量時它纔會自動強制使用當前類,它會顯示奇怪的結果。這就是爲什麼使用static關鍵字更好一些,或者只是指出你想獲得靜態變量的類名。 – Robert 2014-09-04 09:52:50

+0

@Robert在我寫答案的時候,所有給出/暗示的解決方案都是'ClassName :: field',我只是想給出另一個解決方案。我本可以堅持更通用的詞,但你的答案是做這項工作,很好。 – Sugar 2014-09-04 11:07:23

+0

是的:)但使用自我可能會有點棘手:P例如在使用特性的Singleton時,static ::是唯一靈活的解決方案 – Robert 2014-09-04 15:10:16

3

有很多方法可以做到這一點沒有人約static關鍵字提到

可以在裏面做類:

static::$api_key 

您也可以使用像父母,自己或使用類名稱引用和關鍵字。

自我和靜態之間存在差異。當你在類self中覆蓋靜態變量self ::將指向它被調用的類,而static :: does更明智,並將檢查ovverides。有從php.net方面的例子寫在評論我已經修改它有點只是爲了顯示差異。

<?php 

abstract class a 
{ 
    static protected $test="class a"; 

    public function static_test() 
    { 
     echo static::$test; // Results class b 
     echo self::$test; // Results class a 
     echo a::$test; // Results class a 
     echo b::$test; // Results class b 
    } 

} 

class b extends a 
{ 
    static protected $test="class b"; 
} 

$obj = new b(); 
$obj->static_test(); 

輸出:

class b 
class a 
class a 
class b 

更多:

http://php.net/manual/pl/language.oop5.static.php