<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// これが記事の内容に関係のない事前コードの部分です</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">"このコードは、記事の内容とは何の関係もありません,例としてのみ"</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">/*
* タイトル:strval 関数がオブジェクトを変換すると、無限ループが発生します,この問題を解決する方法?
*
* 存在する PHP 真ん中,strval() 関数は、変数を文字列に変換するために使用されます。オブジェクトを渡すとき,
* オブジェクトが実装されている場合 __toString() 魔法の方法,strval() この方法が呼び出され、文字列が返されます。
*
* しかし、オブジェクトの内部ロジック設計が適切でない場合,例えば __toString() 方法真ん中间接或直接電話してください了 strval()
* または、再び呼び出されました __toString(),無限のループを引き起こす可能性があります,これにより、プログラムのクラッシュまたはメモリオーバーフローが発生します。
*
* この記事では、無限のループの理由を説明します,共通のソリューションを提供します。
*/</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">// エラーの例:ここで呼ばれます strval($this) 無限ループを引き起こします</span></span><span>
</span><span><span class="hljs-comment">// return strval($this);</span></span><span>
</span><span><span class="hljs-comment">// それを行う正しい方法:文字列表現を返します</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">// 直接電話してください strval() トリガーします __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">/*
* なぜ無限のループ?
*
* いつ __toString() 真んもう一度呼び出されました strval($this) 時間,PHP もう一度電話します __toString(),
* 無限の再帰を形成します。
*
* 解決:
* 1. 存在する __toString() 真んコールがトリガーされることを避けます __toString() コード,例えば strval($this)。
* 2. 文字列を直接返します,オブジェクトに依存しない文字列変換。
* 3. オブジェクト内に複雑な構造がある場合,避免存在する字符串转换真ん中访问会触发转换的属性或方法。
*
* 別のケースは、オブジェクトプロパティ自体がオブジェクト自体への参照であることです,リサイクルされた参照を引き起こします,
* 这時間序列化或者转换为字符串也可能陷入无限循环,解決策は、明確なデータ構造を設計することです,
* または、周期的アクセスを防ぐための特別な方法を実装します。
*/</span>
<span class="hljs-comment">/*
* 要約します:
* - 使用 strval() 转换对象時間,オブジェクトを確認します __toString() 实现不会间接或直接電話してください strval($this)。
* - 存在する __toString() 真ん単純な文字列のみが返されます,複雑なロジックを避けてください。
* - 设计对象時間要注意避免循环引用,防止序列化或字符串转换時間无限递归。
*/</span>
</span></span>