<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ဤတွင်ဆောင်းပါး၏ပါဝင်မှုနှင့်မသက်ဆိုင်သောပ code Pre-code အပိုင်းဖြစ်သည်</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 Infinite loop သည် function ကိုအရာဝတ်ထုများကိုပြောင်းလဲသည့်အခါတွေ့ရှိရသည်,ဒီပြ problem နာကိုဘယ်လိုဖြေရှင်းရမလဲ?
*
* တည်နေ PHP အလယ်ပိုင်း,strval() variable တွေကို variable တွေကို string တွေကိုပြောင်းဖို့အသုံးပြုတယ်。အရာဝတ်ထုဖြတ်သန်းတဲ့အခါ,
* အရာဝတ်ထုအကောင်အထည်ဖော်လျှင် __toString() Magic နည်းလမ်း,strval() ဒီနည်းလမ်းကိုခေါ်ပါလိမ့်မည်။ string ကိုပြန်ပို့လိမ့်မည်。
*
* သို့သော်အရာဝတ်ထု၏အတွင်းပိုင်းယုတ္တိဗေဒဒီဇိုင်းစနစ်ကိုစနစ်တကျမပါလျှင်,ဥပမာအားဖြင့် __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">// လုပ်ဖို့မှန်ကန်သောနည်းလမ်း:တစ် ဦး string ကိုကိုယ်စားပြုမှုပြန်သွားပါ</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(),
* Infinite recurly ကိုဖွဲ့စည်းသည်。
*
* အဖေြ:
* 1. တည်နေ __toString() အလယ်ပိုင်း避免调用会触发 __toString() လုံးပေါင်းပြဌါန်းသည့်ဉပဒေ,ဥပမာအားဖြင့် strval($this)。
* 2. တိုက်ရိုက် string ကိုပြန်သွားပါ,အရာဝတ်ထုပေါ် မူတည်. မရှိတဲ့ string ပြောင်းလဲခြင်း。
* 3. အရာဝတ်ထုအတွင်းပိုင်းရှုပ်ထွေးသောဖွဲ့စည်းပုံရှိလျှင်,避免တည်နေ字符串转换အလယ်ပိုင်း访问会触发转换的属性或方法。
*
* နောက်အမှုတစ်ခုကအရာဝတ်ထုပိုင်ဆိုင်မှုကိုယ်နှိုက်ကအရာဝတ်ထုကိုယ်နှိုက်ကိုပြန်ရည်ညွှန်းခြင်းဖြစ်သည်,အကြောင်းရင်းများကိုပြန်လည်အသုံးပြု,
* 这နာရီ序列化或者转换为字符串也可能陷入无限循环,ဖြေရှင်းနည်းသည်ရှင်းလင်းသောအချက်အလက်ဖွဲ့စည်းပုံကိုဒီဇိုင်းဆွဲရန်ဖြစ်သည်,
* သို့မဟုတ်သိသိ access ကိုကာကွယ်တားဆီးဖို့အထူးနည်းလမ်းကိုအကောင်အထည်ဖော်ပါ。
*/</span>
<span class="hljs-comment">/*
* အကျဉ်းချုပ်:
* - အသုံးပြု strval() 转换对象နာရီ,အရာဝတ်ထုရဲ့သေချာ __toString() 实现不会间接或တိုက်ရိုက်ခေါ်ဆိုပါ strval($this)。
* - တည်နေ __toString() အလယ်ပိုင်း只返回简单的字符串,ရှုပ်ထွေးသောယုတ္တိဗေဒကိုရှောင်ကြဉ်ပါ。
* - 设计对象နာရီ要注意避免循环引用,防止序列化或字符串转换နာရီ无限递归。
*/</span>
</span></span>