PHP:在静态变量中引用另一个静态变量

6

要么我太笨了,要么这在 中不可能实现(这在任何编程语言中都是基本功能...): 以下是我的问题示例:

class Test {
 private static $A = "test";
 private static $B = "This is a " . Test::$A . " to see if it works";
}

我期望的结果是变量$B的值为This is a test to see if it works

但不知何故,我收到了以下错误:

解析错误:语法错误,意外的'$A'(T_VARIABLE),期望标识符(T_STRING)或类(T_CLASS),位于/.../class.Test.php的第4行

这是无法完成的任务还是只是一个愚蠢的拼写错误?我已经花了一个小时找不到错误...

提前致谢


2
类属性不能具有动态值。这意味着你不能做你刚才做的事情。使用 __construct 为属性设置动态值。或者使用 setters,任选其一。 - Andrei
你用哪种编程语言做了你所做的事情?我认为你在任何一种编程语言中都做不到... - M. I.
在Java中,例如这样做没有问题。我不明白这些值如何是动态的。它显然是静态的。变量$A将始终具有相同的值,所以我无法理解为什么不能按照我提出的方式实现。但我对php还比较新,所以我会相信你这样做不可能(我只是有一个更多的理由在我可以的地方避免php :)) - azaryc2s
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

如果您不想再创建另一个类的话,另一个解决方案是

class TestStatic
{
    private static $A = 'test';
    private static $B;

    //if you want to instantiate the object
    public function __construct() {
        self::setB();
    }

    //if you don't want to instantiate the class 
    public static function getB() {
        self::setB();
       return self::$B;
    }

    private static function setB() {
       if (!isset(self::$B)) {
        self::$B = 'This is a '.self::$A.' to see if it works';
    }
}

}

echo TestStatic::getB();

1
谢谢!这已经很接近我想要的了。但仍然遗憾它不能按照我的方式工作 :) - azaryc2s

0
  1. 无法为类属性分配动态值。请参见手册

  2. 您可以尝试定义魔术 getter,但是getter 不能与静态属性一起使用。请参见手册

属性重载仅在对象上下文中起作用。这些魔术方法不会在静态上下文中触发。因此,这些方法不应声明为静态的。从 PHP 5.3.0 开始,如果其中一个魔术重载方法被声明为静态,则会发出警告。

在 PHP 5.3 中,已添加 __callStatic;但没有 __getStatic 或 __setStatic

  • 所以我只看到的选择是使用 __callStatic 并通过静态魔术方法访问您的属性。请参见下面的示例。

    class A {
    
       public static $A = 'A';
    
       public static function __callStatic($name, $arguments)
       {
          if ($name== 'B') {
             return B::$B;
          }
       }
    
    }
    
    class B {
        public static $B = 'B';
    }
    
    echo A::B(); // 返回 'B'
    

  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,