【问题标题】:Static property accesses static property in PHP静态属性访问 PHP 中的静态属性
【发布时间】:2018-04-18 22:48:34
【问题描述】:

在创建应用程序时,我遇到了一种情况,即我有一个静态变量。

假设它是:

public static name = "abdul ahad";

在某处,我有另一个名为 user 的静态变量,它访问上面定义的静态变量名称。

public static user = self::$name;

注意:这些属性是同一类的成员。

这样做会出现以下错误。

解析错误:语法错误,意外的'$XXX' (T_VARIABLE),在第 xx 行的 C:\xxxx\xxx\xxx.php 中需要标识符 (T_STRING) 或类 (T_CLASS)

同样的概念也适用于 Java,如下所示。

public static int i = 5;
public static int j = Main.i;   

public static void main(String[] args) {

    System.out.println(String.format("Static j was : %d", Main.j));

所以,我想知道在 PHP 中是否有可能以及我在语法上做错了什么。如果不是,那您愿意解释一下原因吗?

【问题讨论】:

  • 不,您不能基于 PHP 中的另一个属性来初始化一个属性。见stackoverflow.com/questions/477066/…
  • 我可以根据另一个属性初始化一个属性。这是正确的。像 int a = 5;诠释 b = a;这是允许的。但是静态变量会出现问题。
  • 您的主题链接不涉及静态内容。
  • 它是否是静态的并没有任何区别。类属性只能初始化为常量值或基本表达式(自 PHP 5.6 起)。您不能引用任何其他变量(全局变量、属性等)。
  • 不适用于 php 7.1

标签: java php parsing properties static


【解决方案1】:

静态声明是编译时评估的,因此您不能使用另一个变量初始化静态属性(不管它是否是静态的)。

来自documentation

与任何其他 PHP 静态变量一样,静态属性只能在 PHP 5.6 之前使用文字或常量进行初始化;不允许表达。在 PHP 5.6 及更高版本中,适用与 const 表达式相同的规则:一些有限的表达式是可能的,只要它们可以在编译时进行评估。

注意:您发布的错误消息很可能来自您未与我们共享的某些代码。此外,您的代码中还有另一个错误:

public static user = self::$name;
//            ^
// the actual error

它应该产生以下错误信息:

PHP 解析错误:语法错误,意外的“用户”(T_STRING),预期变量 (T_VARIABLE) 在 ...

PHP 中的每个变量都必须有 $(美元符号)前缀,因此正确的属性声明应如下所示:

public static $user = self::$name;

但是,正如我上面写的,您不能使用变量初始化静态属性,因此会产生以下错误:

PHP 致命错误:常量表达式在...中包含无效操作

只是为了比较,您帖子中的错误消息:

解析错误:语法错误,意外的 '$XXX' (T_VARIABLE),期待标识符 (T_STRING) 或类 (T_CLASS) 在 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2013-02-13
    • 2015-02-24
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多