<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>