【问题标题】:From the string name of a class, can I get a static variable?从类的字符串名称中,我可以得到一个静态变量吗?
【发布时间】:2011-03-22 05:50:11
【问题描述】:

给定 PHP 中一个类的字符串名称,我如何访问其中一个静态变量?

我想做的是:

$className = 'SomeClass'; // assume string was actually handed in as a parameter
$foo = $className::$someStaticVar;

...但是 PHP 给了我一个可爱的“解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM”,这显然是双冒号 (::) 的希伯来语名称。

更新:不幸的是,我必须为此使用 PHP 5.2.X。

更新 2:正如 MrXexxed 猜测的那样,静态变量是从父类继承的。

【问题讨论】:

    标签: php static


    【解决方案1】:

    反射会做到这一点

    一位同事刚刚向我展示了如何使用反射来做到这一点,它适用于 PHP 5(我们使用的是 5.2),所以我想我会解释一下。

    $className = 'SomeClass';
    
    $SomeStaticProperty = new ReflectionProperty($className, 'propertyName'); 
    echo $SomeStaticProperty->getValue();
    

    http://www.php.net/manual/en/class.reflectionproperty.php

    类似的技巧适用于方法。

    $Fetch_by_id = new ReflectionMethod($someDbmodel,'fetch_by_id');
    $DBObject = $Fetch_by_id->invoke(NULL,$id);
    // Now you can work with the returned object
    echo $DBObject->Property1;
    $DBObject->Property2 = 'foo';
    $DBObject->save();
    

    http://php.net/manual/en/class.reflectionmethod.phphttp://www.php.net/manual/en/reflectionmethod.invoke.php

    【讨论】:

      【解决方案2】:

      您正在运行哪个版本的 PHP?我相信在 5.3.x 以上是允许的,但在此之前是不允许的。

      编辑:从 PHP 5.3.0 开始,这是允许的 示例#2

      echo $classname::doubleColon(); // As of PHP 5.3.0
      

      编辑: 对于变量使用

      echo $classname::$variable; // PHP 5.3.0 +
      

      这是link

      编辑 3: 尝试this link 那里的答案似乎适用于您的情况。

      【讨论】:

      • () 是怎么回事?这是一个变量而不是一个方法。
      • 在页面上他们列出了方法,但变量也是一样的。对于变量,您还需要在名称前加上 $
      • 嗯。奇怪的是,在 5.2.X 中我可以做到 new $className() 但不能做到 $className::$staticVar。哦,好吧。
      • 感谢您为我指明正确的方向。事实证明,反射在 PHP 5 及更高版本中处理得很好!看我的回答。
      • 一个问题是如果你的类名是一个类的属性(例如$this->classname)你需要去$classname = $this->classname然后尝试访问你的新变量@987654330的静态属性或方法@.
      【解决方案3】:

      这只能在 PHP 5.3 及更高版本中使用late static bindings 实现。

      我首先想到的旧版本 PHP 的解决方法是——请不要伤害我——使用eval()

      if (class_exists($className))
      {
          eval('$foo = ' . $className . '::$someStaticVar;');
      }
      

      顺便说一句,访问静态变量时,需要变量名前的$,如$someStaticVar

      【讨论】:

      • 你是说不能访问 5.3 之前的静态变量?!
      • 不,我是说我们不能使用 $className::$someStaticVar 语法来访问 5.3 之前的变量类名的静态变量。
      • 我的意思是,如果 $className 是继承静态变量的类,他只需要担心后期静态绑定。如果 $className 是声明静态变量的类,那么 $className::$someStaticVar 是正确的语法,并且在 5.3 之前可以工作,因为不需要后期静态绑定。 (我要求更多的是我自己对这个问题的理解并澄清这一点。)
      • 刚刚发现反射适用于此 - 请参阅我的答案。 (其他人也这么说,但我想举一个明确的例子。)
      【解决方案4】:

      您可能必须使用反射类。 http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php

      或者使用简单的字符串 eval:print "{$className::$someStaticVar}",在查找 ::$someStaticVar 之前替换 $className。虽然不确定 PHP

      【讨论】:

        猜你喜欢
        • 2016-03-09
        • 1970-01-01
        • 2021-06-17
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        相关资源
        最近更新 更多