Mais enfin si c'est très explicite ....
Une des première phase c'est le découpage du programme en token ( un nom de variable, un opérateur, un nom de fonction, ...). Puis viens l'analyse lexicale dans laquelle php tente de voir si le programme que tu lui soumet est bien une phrase de sa grammaire.
Par exemple, tu ne peux pas avoir
for = { if echo ) ::
=> Ce n'est pas une phrase de PHP
Comment il le sait ? De manière très simple, il a un ensemble de règle dont la première est :
-> un programme PHP est un ensemble de texte ou de <?php code_php ?> répété autant de fois qu'on veux
ensuite, fatalement, on a une règle quelque part :
-> un element foreach, c'est le token "foreach", puis une expression puis le token "as", puis une de variable.
-> une variable c'est soit $xxx, soit un_nom_de_classe :: une_variable
Comme de manière évidente, ton code est réduit à utiliser un_nom_de_classe::une_variable, il trouve bien un_nom_de_classe et après ....
catastrophe : il trouve une ")" au lieu de "::" ... Comme c'est la dernière règle qu'il a essayé et qui n'a pas marché, il interromps brutalement
l'analyse et te dis ce qui c'est passé ....
Pour lire les message d'erreur, il y a un truc, tous ce qui commence par T_, c'est un token... Et comment on connait la liste des token ? ici ->
http://www.php.net/manual/fr/tokens.php
Par ailleurs, ne programmant pas en php objet, je vois mal comment je pourrais avoir un identificateur de classe...)
class objet {
public static $a;
}
$toto = array(1,2,3);
foreach($toto as objet::$a){
echo objet::$a;
}