<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Hier ist der Teil vor dem Code, der nicht mit dem Inhalt des Artikels zusammenhängt</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">"Dieser Code hat nichts mit dem Inhalt des Artikels zu tun,Nur als Beispiel"</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">/*
* Titel:strval Infinite Loop tritt auf, wenn Funktion Objekte konvertiert,Wie man dieses Problem lösen?
*
* existieren PHP Mitte,strval() Funktionen werden verwendet, um Variablen in Zeichenfolgen umzuwandeln。Beim Übergeben eines Objekts,
* Wenn das Objekt implementiert ist __toString() Magische Methode,strval() Diese Methode wird aufgerufen und die Zeichenfolge wird zurückgegeben。
*
* Aber wenn das interne Logikdesign des Objekts nicht richtig ist,Zum Beispiel __toString() 方法Mitte间接或Rufen Sie direkt an了 strval()
* Oder es wurde wieder genannt __toString(),Es kann eine unendliche Schleife verursachen,Dies führt zu einem Programmabsturz oder Speicherüberlauf。
*
* Dieser Artikel erläutert die Gründe für die unendliche Schleife,Und gemeinsame Lösungen geben。
*/</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">// Fehlerbeispiel:Hier gerufen strval($this) Wird unendliche Schleifen verursachen</span></span><span>
</span><span><span class="hljs-comment">// return strval($this);</span></span><span>
</span><span><span class="hljs-comment">// Die richtige Art, es zu tun:Eine String -Darstellung zurückgeben</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">// Rufen Sie direkt an strval() Wird auslösen __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">/*
* Warum unendliche Schleifen?
*
* Wann __toString() Mitte又调用 strval($this) Stunde,PHP Wird wieder anrufen __toString(),
* Bilden unendliche Rekursion。
*
* Lösung:
* 1. existieren __toString() Mitte避免调用会触发 __toString() Code,Zum Beispiel strval($this)。
* 2. Geben Sie eine Zeichenfolge direkt zurück,String -Konvertierung, die nicht von Objekten abhängt。
* 3. Wenn sich im Objekt eine komplexe Struktur befindet,避免existieren字符串转换Mitte访问会触发转换的属性或方法。
*
* Ein weiterer Fall ist, dass die Objekteigenschaft selbst eine Referenz auf das Objekt selbst ist,Verursacht recycelte Referenzen,
* 这Stunde序列化或者转换为字符串也可能陷入无限循环,Die Lösung besteht darin, eine klare Datenstruktur zu entwerfen,
* Oder implementieren Sie eine spezielle Methode, um den zyklischen Zugriff zu verhindern。
*/</span>
<span class="hljs-comment">/*
* Zusammenfassen:
* - verwenden strval() 转换对象Stunde,Stellen Sie die des Objekts sicher __toString() 实现不会间接或Rufen Sie direkt an strval($this)。
* - existieren __toString() Mitte只返回简单的字符串,Vermeiden Sie komplexe Logik。
* - 设计对象Stunde要注意避免循环引用,防止序列化或字符串转换Stunde无限递归。
*/</span>
</span></span>