Pourquoi les fonctions ne sont pas autorisées dans les attributs PHP
Lors de la tentative d'initialisation d'une propriété de classe avec un appel de fonction dans son attribut par défaut, PHP générera une erreur de syntaxe. Bien que ce comportement puisse sembler contre-intuitif, il découle de considérations de conception spécifiques dans le compilateur.
Flux de travail du compilateur
Sous la surface, le compilateur de PHP fonctionne en générant des opcodes qui dirigent le comportement de l'interprète. Ces opcodes sont créés lors de l'analyse du code d'entrée. Dans le cas de déclarations de propriétés de classe avec des scalaires statiques, le compilateur génère un tableau de valeurs dans le cadre d'un opcode ADD_STATIC_ARRAY_ELEMENT. Cependant, lorsqu'un appel de fonction est introduit dans la valeur par défaut, le compilateur crée à la place un opcode INIT_ARRAY, qui n'est pas valide pour les contextes scalaires statiques.
Environnement d'exécution
De plus , la possibilité d'évaluer les appels de fonction lors de l'initialisation des attributs pose un défi pour l'environnement d'exécution. La liaison précoce des définitions de classes et de fonctions est un aspect critique du processus de compilation de PHP. Tenter d'exécuter des appels de fonction pendant l'initialisation de l'attribut nécessiterait une approche différente de cette liaison, introduisant de la complexité et des problèmes potentiels de concurrence.
Raison d'être
La décision d'interdire les appels de fonction dans Les valeurs par défaut des attributs étaient probablement basées sur ces défis de mise en œuvre. Bien que d'autres langages dynamiques aient résolu ce scénario, cela nécessiterait des changements architecturaux importants dans le compilateur et l'environnement d'exécution de PHP.
Solutions potentielles
Lors de l'implémentation des appels de fonction dans les valeurs par défaut des attributs, Pour être réalisable, cela nécessiterait un nouvel opcode et une stratégie d'exécution soigneusement conçue. Les concepteurs du langage PHP n'ont peut-être pas considéré cette fonctionnalité comme une fonctionnalité hautement prioritaire étant donné les alternatives viables existantes, telles que l'initialisation de l'attribut dans le constructeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!