<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Voici la partie pré-code qui n'est pas liée au contenu de l'article</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">dummyFunction</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"Ce code n'a rien à voir avec le contenu de l'article,Par exemple seulement"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
* titre:strval Une boucle infinie se produit lorsque la fonction convertit les objets,Comment résoudre ce problème?
*
* exister PHP milieu,strval() Les fonctions sont utilisées pour convertir les variables en chaînes。Lorsque vous passez un objet,
* Si l'objet est implémenté __toString() Méthode magique,strval() Cette méthode sera appelée et la chaîne sera retournée。
*
* Mais si la conception logique interne de l'objet n'est pas correctement,Par exemple __toString() 方法milieu间接或Appeler directement了 strval()
* Ou il a été appelé à nouveau __toString(),Cela peut provoquer une boucle infinie,Cela provoque un débordement de crash ou de mémoire du programme。
*
* Cet article expliquera les raisons de la boucle infinie,Et donner des solutions communes。
*/</span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">Example</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$value</span></span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->value = </span><span><span class="hljs-variable">$value</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__toString</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// Exemple d'erreur:Appelé ici strval($this) Provoquera des boucles infinies</span></span><span>
</span><span><span class="hljs-comment">// return strval($this);</span></span><span>
</span><span><span class="hljs-comment">// La bonne façon de le faire:Renvoyer une représentation de chaîne</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"Example value: "</span></span><span> . </span><span><span class="hljs-variable language_">$this</span></span><span>->value;
}
}
</span><span><span class="hljs-variable">$obj</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Example</span></span><span>(</span><span><span class="hljs-string">"Hello World"</span></span><span>);
</span><span><span class="hljs-comment">// Appeler directement strval() Va déclencher __toString()</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strval</span></span><span>(</span><span><span class="hljs-variable">$obj</span></span><span>) . PHP_EOL;
<span class="hljs-comment">/*
* Pourquoi des boucles infinies?
*
* quand __toString() milieu又调用 strval($this) heure,PHP Appellera à nouveau __toString(),
* Former une récursivité infinie。
*
* Solution:
* 1. exister __toString() milieu避免调用会触发 __toString() Code,Par exemple strval($this)。
* 2. Renvoie une chaîne directement,Conversion de chaîne qui ne dépend pas des objets。
* 3. S'il y a une structure complexe à l'intérieur de l'objet,避免exister字符串转换milieu访问会触发转换的属性或方法。
*
* Un autre cas est que la propriété de l'objet lui-même est une référence à l'objet lui-même,Provoque des références recyclées,
* 这heure序列化或者转换为字符串也可能陷入无限循环,La solution consiste à concevoir une structure de données claire,
* Ou implémenter une méthode spéciale pour empêcher l'accès cyclique。
*/</span>
<span class="hljs-comment">/*
* Résumer:
* - utiliser strval() 转换对象heure,Assurez-vous que l'objet __toString() 实现不会间接或Appeler directement strval($this)。
* - exister __toString() milieu只返回简单的字符串,Évitez la logique complexe。
* - 设计对象heure要注意避免循环引用,防止序列化或字符串转换heure无限递归。
*/</span>
</span></span>