【问题标题】:Access to class variable from outside从外部访问类变量
【发布时间】:2014-02-28 17:05:21
【问题描述】:

如何在不创建新实例的情况下从外部访问类变量 PHP ?像这样的:

class foo
{
    public $bar;
}

echo foo::$bar;

是否有可能或者我必须创建将打印或返回此值并使用它或创建新实例($a = new foo; echo $a->$bar)的方法?

编辑:我不想创建稍后会更改的常量但经典变量。

【问题讨论】:

    标签: php class variables scope


    【解决方案1】:

    将此变量设为静态以在没有类对象的情况下访问它。

    如果你想通过方法改变静态变量的值,那么你需要使用静态方法

    你可以这样试试:

    class foo
    {
      public static $bar ="google";
      public static function changeVal($val){
       self::$bar=$val;
      }
    }
     foo::changeVal("changed :)");
     echo foo::$bar;
    

    输出:changed :)

    演示:https://eval.in/107138

    你也可以这样改,不用静态方法:

    foo::$bar = "changed";
    

    演示:https://eval.in/107139

    像这样:

    class foo
    {
      public static $bar ="google";
    }
    echo foo::$bar;
    

    输出:google

    演示:https://eval.in/107126

    【讨论】:

    • 这个我想使用但没有可见的输出。但是,如果我在方法内部更改它并在更改内部方法后使用 echo,我会得到正确的结果,但不是来自外部。
    • @JARDA001:你在我的演示链接中看到了吗?我还更新了我的答案以改变价值
    • 是的,我看到了,但我看到的只是默认值,没有改变。编辑:片刻,我试试这个。
    【解决方案2】:

    如果使用静态变量是有意义的:

    class foo{
        public static $bar = 'example';
    }
    

    可以这样访问:

    echo foo::$bar;
    

    【讨论】:

      【解决方案3】:

      如果值在运行时永远不会改变,那么您可能需要一个类常量 (http://www.php.net/oop5.constants)

      class foo {
          const bar = 'abc';
      }
      

      ...否则您需要一个公共静态变量 (http://www.php.net/manual/en/language.oop5.static.php)

       class foo {
          public static $bar = 'abc';
      }
      

      ...不管怎样,像这样访问它

      echo foo::bar;
      

      【讨论】:

        【解决方案4】:

        只有当变量标记为静态时,才能访问类变量而不创建实例:

        class foo
        {
          public static $bar;
        }
        

        【讨论】:

        • 我试试这个,但输出不正确。如果我将类内的变量设置为默认值(FALSE)并在方法内更改它并在同一个地方打印值,结果是正确的,但如果我想在外面打印值,结果不正确。
        【解决方案5】:

        这是你使用类变量的方式:

        // with instantiation
        class foo {
            // initialize on declare
            public $bar = 1;
            // or initialize in __construct()
            public function __construct(){
                $this->bar = 1;
            }
        }
        $foo = new foo();
        var_dump($foo->bar);
        
        // static way
        class static_foo {
            public static $bar = 1;
        }
        var_dump(static_foo::$bar);
        

        这就是你如何从一个随机的类名字符串变量实例化一个类。

        $foo = new foo();
        $random_class_name = $foo->bar;
        try {
            // following line throws if class is not found
            $rc = new \ReflectionClass($random_class_name);
            $obj = $rc->newInstance();
            // can be used with dynamic arguments
            // $obj = $rc->newInstance(...);
            // $obj = $rc->newInstanceArgs(array(...));
        } catch(\Exception $Ex){
            $obj = null;
        }
        if($obj){
            // you have a dynamic object
        }
        

        您的实际问题是什么?

        【讨论】:

          猜你喜欢
          • 2012-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多