【问题标题】:PHP function call in class property类属性中的 PHP 函数调用
【发布时间】:2013-02-02 18:33:07
【问题描述】:

为什么我不能在 PHP 中做到这一点?其中Database 是一个单例类,getInstance() 返回一个 PDO 对象。

<?php

class AnExample
{
    protected static $db = Database::getInstance();

    public static function doSomeQuery()
    {
        $stmt = static::$db->query("SELECT * FROM blah");
        return $stmt->fetch();
    }
}

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

http://php.net/manual/en/language.oop5.static.php

为什么?!

【问题讨论】:

  • 不要使用单例,问题解决了。
  • 用于初始化静态属性的表达式在编译期间被评估。你的表达式调用了一个函数,这意味着代码执行。

标签: php static pdo singleton


【解决方案1】:

http://php.net/language.oop5.properties

类成员变量称为“属性”。您可能还会看到使用“属性”或“字段”等其他术语来提及它们,但出于本参考的目的,我们将使用“属性”。它们是通过使用关键字 public、protected 或 private 之一来定义的,然后是一个普通的变量声明。 这个声明可能包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖运行时信息才能被评估。强>

重要的是

也就是说,它必须能够在编译时被评估

表达式是在运行时评估的,因此无法使用表达式来初始化属性:它们根本无法评估。

【讨论】:

    【解决方案2】:

    您不能执行代码来生成静态变量的值,因为根据定义,静态变量在编译时会受到影响,请参阅:

    获取变量的运行时值,或调用函数(也是运行时)不能在编译时完成,因为它们不会受到静态变量的影响。

    【讨论】:

      【解决方案3】:

      RTM ;)

      属性http://www.php.net/manual/en/language.oop5.properties.php见PHP文档第一段最后一句

      此声明可能 包括一个初始化,但这个初始化必须是一个常量 价值——也就是说,它必须能够在编译时被评估,并且 不得依赖运行时信息来进行评估。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2011-07-25
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        相关资源
        最近更新 更多