Объявление статического массива в классе базы данных php - неверный синтаксис? - PullRequest
0 голосов
/ 31 июля 2011

Я объявляю простой класс базы данных, который включает в себя массив подготовленных операторов, но я не могу найти здесь синтаксическую ошибку.

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

Любая помощь здесь?

Ответы [ 4 ]

1 голос
/ 31 июля 2011

Вы не должны иметь кавычки вокруг ? для вашего параметра.Кроме того, вы не можете объявить 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...
    }

}
0 голосов
/ 01 августа 2011

У вас проблемы из-за необходимости оценки при установке свойства класса.

Это потому, что свойство класса 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=?");
    }
}
?>

Рабочий пример

0 голосов
/ 01 августа 2011

Я не думаю, что 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=?");
0 голосов
/ 01 августа 2011

вы не можете объединить при назначении значений в объявлении переменных класса: вы можете назначить только скалярное значение или другой массив (или объект, если я правильно помню).

Вы можете назначать выражения в метод, например,конструктор класса или, возможно, другой статический метод

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=?");
        }
    }
}

Этот код должен работать в вашем случае.И, как сказал Майкл, вы должны удалить кавычки вокруг знака вопроса.

...