PHP 8 Syntax error, unexpected token "public"

Par kamelzagger, il y a 4 ans


Bonjour,

Depuis que je suis passé à la version 8 de PHP j'ai plusieurs bug.
J'ai réussi à corriger la plus part mais il m'en reste un sur le quel je restre bloqué.

Dans mes Class, pour les fonctions qui ont un public ou private devant j'ai bizarrement une erreur...

syntax error, unexpected token "public" syntax error, unexpected token "private"

Voici un exemples d'une de mes fonctions :

public function VerifEmail($field = 'email'){ $this->VerifEmailValid($field); $this->isEmpty($field); }

Si je retire le public je n'ai plus l'erreur, mais évidemment la fonction ne peu plus être appelé...

-> Call to undefined method

Auriez-vous une solution ?

6 réponses

quenti77, il y a 4 ans

Hello,

Peut-on avoir un peu plus de code pour avoir le contenu avant le public function ?

kamelzagger, il y a 4 ans

Re, merci pour ton aide,

C'est une Class Validator. Je sais pas si c'est vraiment utile par ce qu'elle a toujours fonctionné, en tout cas avec PHP 7.

Mais voila le début de la Class :

namespace Root\Form; use \Root\Data\Database; use \Root\Data\Data; use \Root\App\App; use \Root\HTML\HTML; use \Root\HTML\Bootstrap; use \Root\App\Date; use \Root\App\Securite; use Intervention\Image\ImageManagerStatic as Image; class Validator{ private $data; private $html; private $bootstrap; public $errors = []; function __construct($data){ $this->data = Securite::Bdd($data); $this->html = New HTML(); $this->bootstrap = New Bootstrap(); function getMessage($message = null,$default = NULL){ return $message ? $message : $default; } function getField($field){ if (!isset($this->data[$field])) { return null; } return $this->data[$field]; } function VerifEmail($field = 'email'){ $this->VerifEmailValid($field); $this->isEmpty($field); }

PS : C'est la version ou j'ai retiré les public pour tester...

quenti77, il y a 4 ans

Il te manque une "}" après

$this->bootstrap = New Bootstrap();

Du coup c'est bizarre que ça ne plante pas avant ?

Avec le code que tu donne il faudrait que ça ressemble à ça :

<?php namespace Root\Form; use \Root\Data\Database; use \Root\Data\Data; use \Root\App\App; use \Root\HTML\HTML; use \Root\HTML\Bootstrap; use \Root\App\Date; use \Root\App\Securite; use Intervention\Image\ImageManagerStatic as Image; class Validator { private $data; private $html; private $bootstrap; public $errors = []; public function __construct($data) { $this->data = Securite::Bdd($data); $this->html = new HTML(); $this->bootstrap = new Bootstrap(); } public function getMessage($message = null, $default = NULL) { return $message ? $message : $default; } public function getField($field) { if (!isset($this->data[$field])) { return null; } return $this->data[$field]; } public function VerifEmail($field = 'email') { $this->VerifEmailValid($field); $this->isEmpty($field); } }

En fait sans mettre le public avant fonction tu déclare une fonction à l'intérieur de la méthode construct. Sauf que si tu ajoute public forcément ce n'est plus valide. En gros tu as le droit de faire ceci :

<?php class Validator { public function check() { function verify() {} verify(); } } $validator = new Validator(); $validator->check();

Mais du coup verify n'est pas une méthode de Validator. C'est juste une fonction accessible que pour l'intérieur de la méthode check. Et comme tu as oublié l'accolade c'est ce que ça donne :)

quenti77, il y a 4 ans

Je pose la question dans un autre message car c'est plus pour informations : tu suis quel tutoriel ?

Je ddemande car j'ai un peu peur du code xD
Déjà le Secure::BDD j'ai l'impression que tu fais du traitement avant insertion en base (type htmlspecialchars) et ce n'est pas bon.

kamelzagger, il y a 4 ans

Re

Pour répondre à ta question j'avais suivi le tuto de grafikart en faite. La POO en PHP. Après j'ai aussi un peu adapté à mes besoin. Mais je vais prendre en compte ton conseil.

Sinon j'ai pas trop compris mon erreur.. J'ai toujours fait comme ça jusqu'a maintenant mes class sans avoir cette erreur.

kamelzagger, il y a 4 ans

C'est tout bon en fait ! Y'avait bien un soucis avec une accolade qui manquait. Rhaaa... on se prend la tête longtemps pour des choses bête parfois.

Merci pour ton aide !