web-dev-qa-db-fra.com

T_VARIABLE inattendu, attend T_FUNCTION

Je m'attends à ce que ce soit une erreur de syntaxe de base que j'ai négligée, mais je ne peux pas le comprendre.

Dans un script PHP, je reçois toujours l'erreur suivante.

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

Cela se produit lorsque mon script de connexion à la base de données est appelé avec une include_once(). J'ai réduit mon script au code le plus basique (en laissant ce qui est requis par un autre code), et il appelle toujours cette erreur.

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

    $udb = new UserDatabaseConnection;
?>

J'ai lutté avec ça pendant un certain temps, et je me demandais simplement si quelqu'un d'autre pourrait repérer quelque part où je me suis trompé.

20
Ryan Leonard

Vous ne pouvez pas mettre

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

en dehors de la construction de classe. Vous devez mettre cette ligne à l'intérieur d'une fonction ou du constructeur mais vous ne pouvez pas la placer là où vous en avez maintenant.

22
Sabeen Malik

Vous ne pouvez pas utiliser d'appels de fonction dans une construction de classe, vous devez initialiser cette valeur dans la fonction constructeur.

Depuis le PHP Manual on class properties :

Cette déclaration peut inclure une initialisation, mais cette initialisation doit être une valeur constante - c'est-à-dire qu'elle doit pouvoir être évaluée au moment de la compilation et doit ne dépendent pas des informations d'exécution pour être évaluées.

Un exemple de code de travail:

<?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;
?>

Selon vos besoins, protected ou private peut être un meilleur choix pour $connection. Cela vous protège de la fermeture accidentelle ou de la confusion avec la connexion.

18
Lekensteyn

Utilisez le modificateur d'accès avant la définition de membre:

    private $connection;

Comme vous ne pouvez pas utiliser l'appel de fonction dans la définition de membre en PHP, faites-le dans le constructeur:

 public function __construct() {
      $this->connection = sqlite_open("[path]/data/users.sqlite", 0666);
 }
5
duri

mettre public, protected ou private avant la connexion $.

4
Stijn Leenknegt