2010-03-05 4 views
4

J'écris un contrôleur pour Codeigniter avec une méthode nommée "print". Le nom est important, car je voudrais être en mesure d'accéder à la page "".Méthode de classe PHP nommée print ... non autorisée?

Cependant, je ne peux pas faire cela parce qu'il est l'erreur de syntaxe:

Parse error: syntax error, unexpected T_PRINT, expecting T_STRING 

Y at-il une syntaxe spéciale pour rendre l'interpréteur PHP « pense » que quand je dis:

class MyClass extends Controller { 
    function print() { 
     // print method here 
    } 
} 

. .. que je parle d'une méthode avec un nom T_STRING de "print" et non le T_PRINT qu'il s'attend à être?

Répondre

10

Cela ne fonctionnera pas car l'impression est un language construct en php. Je sais qu'il ressemble à une fonction, mais il est traité de la même manière que (par exemple) function, while, include, et ainsi de suite.

4

Voir la liste de Reserved Keywords in PHP. Vous ne pouvez pas utiliser l'un d'entre eux en tant que constantes, noms de classes, noms de fonctions ou de méthodes.

2

Si vous appelez la fonction d'impression 'hardcopy()' par exemple, vous pouvez utiliser une règle de mod-rewrite pour accomplir la même chose. à savoir:

RewriteRule ^/MyController/print/MyController/copie papier [L]

2

Comme tout le monde l'a souligné, vous ne pouvez pas utiliser des constructions de langage en tant que noms de fonction.

Votre solution est probablement URI Routing afin que vous puissiez utiliser print dans votre URL mais quelquechose de sûr comme nom de méthode.

4

Je trouve que vous pouvez contourner la restriction de nommage pour quelques mots réservés à PHP 5.3 en utilisant la méthode magique __call.

public function __call($name, $arguments) 
{ 
    $fn = 'do_' . $name; 
    if (method_exists($this, $fn)) 
    { 
    return call_user_func_array(array($this, fn), $arguments); 
    } 
    else 
    { 
    throw new Exception('Method "' . $name . '" does not exist.'); 
    } 
} 

protected function do_print(/* $arg1, $arg2,...*/) 
{ 
    //whatever 
} 

Je suis pas dire que c'est nécessairement une bonne idée, mais il ne vous permet de faire un appel comme $foo->print().

Je ne vois vraiment aucune raison pourquoi les mots réservés ne peuvent pas être utilisés comme noms de méthodes pour les classes. Je n'ai pas été en mesure de présenter un cas ambigu qui aurait besoin d'être résolu.

Questions connexes