неожиданный T_VARIABLE, ожидающий T_FUNCTION - PullRequest
19 голосов
/ 27 июня 2011

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

В скрипте PHP я получаю следующую ошибку:

Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in [path]/scripts/users/database_connection.php on line 4

Это происходит, когда мой скрипт для подключения к базе данных вызывается с include_once().Я сократил свой сценарий до самого базового кода (оставляя в том, что требуется другим кодом), и он все еще вызывает эту ошибку.

<?php
    class UserDatabaseConnection
    {
        $connection = sqlite_open("[path]/data/users.sqlite", 0666);
        public function lookupUser($username)
        {
            // rest of my code...
        }
    }

    $udb = new UserDatabaseConnection;
?>

Я боролся с этим некоторое время и просто удивилсяесли кто-то еще мог определить где-нибудь, я ошибся.

Ответы [ 4 ]

21 голосов
/ 27 июня 2011

Нельзя ставить

$connection = sqlite_open("[path]/data/users.sqlite", 0666);

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

16 голосов
/ 27 июня 2011

Вы не можете использовать вызовы функций в конструкции класса, вы должны инициализировать это значение в функции конструктора.

Из Руководства PHP по свойствам класса :

Это объявление может включать в себя инициализацию, но эта инициализация должна быть постоянным значением - то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для того, чтобыоцениваться.

Пример рабочего кода:

<?php
    class UserDatabaseConnection
    {
        public $connection;
        public function __construct()
        {
            $this->connection = sqlite_open("[path]/data/users.sqlite", 0666);
        }
        public function lookupUser($username)
        {
            // rest of my code...
            // example usage (procedural way):
            $query = sqlite_exec($this->connection, "SELECT ...", $error);
            // object oriented way:
            $query = $this->connection->queryExec("SELECT ...", $error);
        }
    }

    $udb = new UserDatabaseConnection;
?>

В зависимости от ваших потребностей, protected или private может быть лучшим выбором для $connection.Это защищает вас от случайного закрытия или путаницы с соединением.

5 голосов
/ 27 июня 2011

Использовать модификатор доступа перед определением элемента:

    private $connection;

Поскольку вы не можете использовать вызов функции в определении члена в PHP, сделайте это в конструкторе:

 public function __construct() {
      $this->connection = sqlite_open("[path]/data/users.sqlite", 0666);
 }
4 голосов
/ 27 июня 2011

поставить общедоступный, защищенный или приватный перед $ connection.

...