2014-09-04 108 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