与其他PHP静态变量一样,在PHP5.6之前,静态属性只能使用文字或常量初始化;不允许使用表达式。在PHP 5.6及更高版本中,同样的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时被求值。 所以你不能用另一个变量初始化一个静态变量。将$appdata['id']替换为常量字符串或删除static属性。 这是因为***所有的静态声明都是在编译时解析的***,此时其他变量的内容是未知的(参见this other page of official doc)。
(额外信息:单例是一种设计模式,它限制你在整个程序中只有0或1个类的示例。有几种设计模式,我收集了115个,到目前为止in a single image)*
在你的例子中,代码看起来像这样:
class DataBaseConfig {
private static $instance;
private $dbname ;
private final function __construct() {
$this->$dbname = 'mydb_'.$appdata['id'];
}
public static function getName() {
if (!isset(self::$instance)) {
self::$instance = new DataBaseConfig();
}
return self::$instance->$dbname;
}
}
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new PhpStarter();
}
return self::$instance;
}
public function getName() {
return $this->$dbname;
}
6条答案
按热度按时间vuktfyat1#
来自official Php documentation:
与其他PHP静态变量一样,在PHP5.6之前,静态属性只能使用文字或常量初始化;不允许使用表达式。在PHP 5.6及更高版本中,同样的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时被求值。
所以你不能用另一个变量初始化一个静态变量。将
$appdata['id']
替换为常量字符串或删除static
属性。这是因为***所有的静态声明都是在编译时解析的***,此时其他变量的内容是未知的(参见this other page of official doc)。
dauxcl2d2#
除非你搞砸了反射,否则我能想到的唯一一种让静态私有/受保护类属性具有动态生成值的方法是在类外部计算它:
然而,在您的具体用例中,* 可能 * 根本没有理由将属性设置为静态属性。在这种情况下,它就像使用构造函数一样简单:
kd3sttzy3#
这是因为静态变量中包含一个常量值。但在你的情况下:
$appdata['id']
是动态的,可以在执行期间更改其值。这就是显示错误的原因。yeotifhr4#
我遇到了这个错误,我的解决方法是不在类属性数组中声明日期
g6ll5ycj5#
在我的例子中,这个问题的解决方案是创建一个单例类,这样变量的值只被初始化(计算)一次,并且在需要的时候仍然可以访问它。
在你的例子中,代码看起来像这样:
您可以像
DataBaseConfig::getName()
一样使用它来获得最短/最简单的版本。实际上,你有更复杂的类和函数,所以通过定义一个
getInstance()
函数,你将避免为你添加的每个函数重复-行。这是你需要的重构:
使用它就像
$db = DataBaseConfig::getInstance();
,然后$db->getName()
和$db->getSomethingElse()
用于其他函数。ppcbkaq56#
供您参考:-我得到了同样的错误,通过使用一些字符在一个常数表达式。
这就是导致错误的原因,我删除了此**||**这是字符串中的逻辑OR运算符字符,它起作用了。