php数据库类中的静态数组声明-语法错误


Static array declaration in php database class - incorrect syntax error?

我正在声明一个简单的数据库类,其中包括一个准备好的语句数组,但是对于我的生命,我在这里找不到语法错误。

class Database {
    private static $users_table = "users";
    private static $statements = array("username_available" => "SELECT COUNT(*) FROM " . self::$users_table . " WHERE Username='?'");
}

有什么帮助吗?

您不应该在参数的?周围加上引号。另外,不能将private static $statements声明为数组。相反,必须在构造函数中初始化它。

class Database {
    private static $users_table = "users";
    private static $statements;
    public function __construct() {
      $this->statements = array("username_available" => "SELECT COUNT(*) FROM " . self::$users_table . " WHERE Username='?'");
      // etc...
    }
}

在类变量声明中赋值时不能连接:只能赋一个标量值或另一个数组(如果我没记错的话,也可以赋一个对象)。

可以将表达式赋值到方法中,比如类构造函数,或者另一个静态方法

class Database {
    private static $users_table = "users";
    private static $statements = null;
    public function __construct(){
        if(self::$statements === null){
            self::$statements = array("username_available" => "SELECT COUNT(*) FROM " . self::$users_table . " WHERE Username=?");
        }
    }
}

这段代码应该在你的情况下工作。正如Michael所说,你应该去掉问号周围的引号

我不认为PHP喜欢通过连接声明静态类变量或其他需要计算的方法。也不能将静态变量设置为函数调用的结果:

private static $time = time(); # this will fail too. Value must be a literal value

换句话说,类定义中的属性值不能来自已求值的对象。

所以你必须硬编码$users_table字符串的值到$statements:

private static $statements = array("username_available" => "SELECT COUNT(*) FROM `users` WHERE Username=?");

设置类属性时需要求值,因此出现问题。

这是因为PHP类属性"必须能够在编译时求值,并且必须不依赖于运行时信息才能求值"。参见前面链接页面上的示例。

为了保持相同的格式,您可以使用一个静态方法,它只返回您想要的值:

<?php
class Database {
    private static $users_table = "users";
    private static function statements() {
           return array("username_available" => 
                 "SELECT COUNT(*) FROM " . self::$users_table . " WHERE Username=?");
    }
}
?>

工作示例