လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> strval function သည်အရာဝတ်ထုတစ်ခုကိုပြောင်းလဲသည့်အခါအဆုံးမဲ့ကွင်းဆက်တစ်ခုတွေ့ရှိရသည်။ ဒီပြ problem နာကိုဘယ်လိုဖြေရှင်းရမလဲ။

strval function သည်အရာဝတ်ထုတစ်ခုကိုပြောင်းလဲသည့်အခါအဆုံးမဲ့ကွင်းဆက်တစ်ခုတွေ့ရှိရသည်။ ဒီပြ problem နာကိုဘယ်လိုဖြေရှင်းရမလဲ။

gitbox 2025-06-27
<span><span><span class="hljs-meta">&lt;?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">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?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>-&gt;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>-&gt;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>