【问题标题】:Static Function Variables and Concatenation in PHPPHP中的静态函数变量和连接
【发布时间】:2011-06-25 23:47:45
【问题描述】:

考虑以下几点:

$var = 'foo' . 'bar'; # Not a member of a class, free-standing or in a function.

一旦我将$var 标记为static,但是:

static $var = 'foo' . 'bar';

PHP(WAMP 设置上的 5.3.1)抱怨以下错误:

解析错误:语法错误,意外'.',期待','或';'

看来这里的罪魁祸首是字符串连接。


这里发生了什么?谁能给我解释一下静态变量的规则?

【问题讨论】:

    标签: php string concatenation static-variables


    【解决方案1】:

    我这样做:

    class MyClass {
    
      static $var1;
      static $var2;
      public static function _init() {
          self::$var1 = 'slkslk' . 'sksks' . 'arbitrary' ; 
          self::var2 = <<<EOT
              <root>
                <elem1>skjsksj</elem1>
              </root>
    EOT;
      }
    }
    MyClass::_init();
    

    【讨论】:

      【解决方案2】:

      你不能在初始化器中做表达式。但是,您可以这样做:

      define('FOOBAR', 'foo'.'bar');
      static $var = FOOBAR;
      echo $var;
      

      鲜为人知的事实是,即使初始化程序不能包含运行时表达式,它也可以包含可以在运行时定义和解析的常量。常量必须在首次使用$var 时定义,否则您将获得与常量相同的字符串(例如"FOOBAR")。

      【讨论】:

      • 意味着如果我需要连接任何东西,我必须将所有东西定义为常量?意味着每次初始化都需要 2 个步骤?
      • 不是每一个,只是那些你需要使用表达式的地方。
      【解决方案3】:

      手册指出,Variables scope

      尝试为这些作为表达式结果的 [静态] 变量赋值将导致解析错误。

      Static keyword中也提到了它:

      与任何其他 PHP 静态变量一样,静态属性只能使用文字或常量进行初始化;不允许表达。

      虽然应该注意,无论是否为静态属性,都不能使用表达式进行初始化。

      【讨论】:

      • 这是为什么呢?我该怎么做:public static $model_path=APP_PATH."/models/";
      • @Hafiz:你不能,因为这些是在编译时评估的。常量和字符串文字在编译时进行评估,因此 static $foo = "a";public $foo = CONSTANT; 有效。 public $foo = 1 + 2;static $foo = 'a' . 'b'; 等表达式在运行时进行评估。
      • 在您的情况下,您可以简单地定义一个 MODEL_PATH 常量。执行以下操作:define('MODEL_PATH', APP_PATH."models/"); 然后在您的类中使用此常量:class Foo { public static $model_path = MODEL_PATH; }。要么,要么在构造函数或初始化方法中初始化它们。
      • 感谢您的回复,但这样我每次都会在 2 个地方成为这样的路径:| .也许我应该在所有使用带有表达式的静态变量的地方使用常量。
      • 请注意“从 PHP 5.6 开始,您可以为这些变量赋值,这些变量是表达式的结果……一些有限的表达式是可能的,只要它们可以在编译时进行评估。”从 PHP 5.6 开始,可以使用 1 + 2'a' . 'b' 等表达式进行编译时评估。
      猜你喜欢
      • 2012-11-23
      • 1970-01-01
      • 2011-09-29
      • 2015-12-05
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多