4 votes

Puis-je "utiliser" un espace de noms d'un fichier requis/inclus dans le Shell interactif de PHP ?

Supposons que j'exécute la commande suivante dans un shell interactif PHP, nécessitant un fichier de fonction utilitaire avec tout le code sous l'espace de noms utils :

php > require_once __DIR__ . '/utils.php';
php > echo \utils\doubleMe(2);
4
php > use \utils as u;
php > echo u\doubleMe(2);
PHP Warning: Uncaught Error: Call to undefined function u\doubleMe() in php shell code: 1
Stack trace: ...
php >

Je peux appeler les fonctions en utilisant l'espace de noms pleinement qualifié sans problème. use /Les tentatives d'appel de fonctions sous l'espace de noms aliasé se soldent par une erreur, indiquant que la fonction n'est pas définie.

Comment dois-je use un espace de noms dans le Shell interactif de PHP ? Si ce n'est pas possible, y a-t-il une raison particulière à cela ?

3voto

iainn Points 11325

PHP use sont essentiellement des opérations de copier-coller effectuées par le compilateur sur l'ensemble du code contenu dans la mémoire tampon. Ainsi, les

use Foo\Bar\Baz as F;
new F();

devient juste

new \Foo\Bar\Baz();

avant d'être interprété.

Dans un flux standard, le compilateur travaille sur un seul fichier à la fois, de sorte qu'une instruction d'utilisation s'applique à tout le code du fichier en question. Mais avec un shell interactif, le tampon ne contient qu'une seule ligne. Je l'ai mentionné dans un commentaire, mais comme indiqué dans le document cette réponse en exécutant quelque chose comme

use \DateTime as D; echo (new D)->format('c');

dans un shell interactif fonctionnera correctement, et vous verrez quelque chose comme

2021-01-11T23:24:55+00:00

Mise en place d'un use sur sa propre ligne, cependant, ne fera pratiquement rien ; le compilateur essaie d'exécuter sa routine habituelle de "copier-coller", mais une fois que cela est terminé, rien au sujet de la déclaration n'est gardé en mémoire, de sorte que les lignes suivantes ne sont pas affectées.

C'est quelque chose qui, j'en suis sûr, pourrait être corrigé avec suffisamment de motivation de la part de l'équipe Internals, mais je ne trouve aucune discussion à ce sujet, ni dans le bug tracker, ni dans la page liste de diffusion internals et je ne pense pas que le shell interactif soit généralement au premier rang des priorités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X