【问题标题】:Access public static variable inside class in function php在函数php中访问类内的公共静态变量
【发布时间】:2014-09-04 09:16:37
【问题描述】:

我正在尝试在函数中访问类中的变量:

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
}

【问题讨论】:

  • outside: google_api_v3::$api_key 应该也可以吗?和内部使用:self::$api_key 或 static::$api_key
  • @RaphaelMüller 是的,正在工作。
  • @user3467855 顺便说一句,由于您似乎认为它与变量可见性有关,因此您的变量是公共的还是私有的这一事实与您的问题无关。我不明白 $this->api_key 是如何“只在私有上工作”的,它不应该工作。

标签: php class oop


【解决方案1】:

有很多方法可以做到这一点,没有人提到静态关键字

你可以在课堂上做:

static::$api_key

您还可以使用引用和关键字,例如 parent、self 或使用类名。

self 和 static 是有区别的。当您在类 self:: 中覆盖静态变量时,将指向调用它的类,而 static:: do 更明智,并将检查 ovverides。有一个用 cmets 编写的 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

【讨论】:

    【解决方案2】:

    使用值/方法(包括静态方法)的通用方式类是self::

    echo self::$api_key;
    

    【讨论】:

    • self 仅在扩展类并覆盖静态变量时才强制使用当前类,它会显示奇怪的结果。这就是为什么最好使用 static 关键字或者只指向你想从中获取静态变量的类名。
    • @Robert 在我写答案的那一刻,所有给定/暗示的解决方案都是'ClassName::field',我只是想给出另一个解决方案。我本可以坚持更多的通用词,但你的回答是做的工作,太棒了。
    • 是的 :) 但有时使用 self 可能会很棘手:P 例如在单例中,当您使用特征时 static:: 是唯一灵活的解决方案
    【解决方案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
    }
    

    【讨论】:

    • 如果我在 send_response() 函数内的 $api_key 中分配一个新值,我如何从类外的函数访问分配的值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多