【问题标题】:Accessing a static method in a static variable definition访问静态变量定义中的静态方法
【发布时间】:2014-04-01 22:06:13
【问题描述】:

我正在尝试访问静态类变量定义中的静态类方法。我尝试了几次,但无法编译代码。

天真的尝试:

<?php
class TestClass {
  private static $VAR = doSomething(array());

  private static function doSomething($input) {
    return null;
  }
}
?>

错误:

dev@box:~/php$ php -l TestClass.php 
PHP Parse error:  syntax error, unexpected '(', expecting ',' or ';' in TestClass.php on line 3
Errors parsing TestClass.php

直观的尝试:

<?php
class TestClass {
  private static $VAR = self::doSomething(array());

  private static function doSomething($input) {
    return null;
  }
}
?>

错误:

dev@box:~/php$ php -l TestClass.php 
PHP Parse error:  syntax error, unexpected '(', expecting ',' or ';' in TestClass.php on line 3
Errors parsing TestClass.php

逻辑尝试:

<?php
class TestClass {
  private static $VAR = static::doSomething(array());

  private static function doSomething($input) {
    return null;
  }
}
?>

错误:

dev@box:~/php$ php -l TestClass.php
PHP Fatal error:  "static::" is not allowed in compile-time constants in TestClass.php on line 3
Errors parsing TestClass.php

绝望的尝试:

<?php
class TestClass {
  private static $VAR = $this->doSomething(array());

  private static function doSomething($input) {
    return null;
  }
}
?>

错误:

dev@Dev08:~/php$ php -l TestClass.php 
PHP Parse error:  syntax error, unexpected '$this' (T_VARIABLE) in TestClass.php on line 3
Errors parsing TestClass.php

任务看起来很简单,使用静态方法来定义静态变量,但是我想不通在静态变量声明的上下文中如何正确访问静态方法。

如何在PHP v5.5.3的静态变量定义中调用静态方法?

【问题讨论】:

    标签: php class static-methods static-variables


    【解决方案1】:

    正确尝试:

    <?php
    class TestClass {
      private static $VAR = null;
    
      private static function doSomething($input) {
        return null;
      }
    
      public static function Construct(){
          self::$VAR = self::doSomething(array());
      }
    }
    TestClass::Construct();
    ?>
    

    您可以将静态初始化为标量和数组。您不能使用函数调用对其进行初始化。所以如果你需要私有的东西,你需要一个可以被调用来初始化静态的公共方法。

    如果它们是公开的,你可以这样做:

    TestClass::$VAR = TestClass::doSomething(array());
    

    在类声明之后或当你想实例化它时。

    证明

    与任何其他 PHP 静态变量一样,静态属性只能使用文字或常量进行初始化;不允许表达。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您不能将其初始化为另一个变量、函数返回值或对象。 from PHP.net/Static

    【讨论】:

    • 您能否参考“仅标量和数组”规范中的 PHP 文档?
    • @awashburn 说真的?!我认为您的 PHP 解释器向您展示了这一点。为什么你认为这些错误会弹出? --- 更新了答案。
    • 感谢您提供快速、正确、参考且格式正确的答案 :)
    • @awashburn 如果您想知道原因,主要是因为静态在解析时初始化,但表达式可能依赖于外部内容,因此要求您选择何时为静态完成初始化。跨度>
    • 有道理,我的印象是 PHP 的解释器不是那么健壮。
    猜你喜欢
    • 2015-07-22
    • 2012-06-29
    • 2017-01-13
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2015-02-18
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多