လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Serialize သုံးတဲ့အခါ Infinite Recursion ထောင်ချောက်များကိုရှောင်ပါ

Serialize သုံးတဲ့အခါ Infinite Recursion ထောင်ချောက်များကိုရှောင်ပါ

gitbox 2025-05-19

PHP ပရိုဂရမ်တွင် Serialize function ကိုအရာဝတ်ထုများသို့မဟုတ် arrays များကိုကြိုးများအဖြစ်ပြောင်းလဲရန်အသုံးပြုသည်။ သို့သော်အရာဝတ်ထုများကို 0 န်ဆောင်မှုပေးသည့်အခါအခြားအရာဝတ်ထုများကိုရည်ညွှန်းသည့်အရာဝတ်ထုတွင် attribute များရှိပြီးဤအရာဝတ်ထုများအကြားအပြန်အလှန်ရည်ညွှန်းကိုးကားသည့်ဆက်နွယ်မှုများရှိလျှင် (ဥပမာအားဖြင့် B နှင့် B တို့ကိုရည်ညွှန်းသည်။

PHP ၏ Serialize function ကိုအသုံးပြုသည့်အခါ Infinite Recursion ၏ထောင်ချောက်ကိုမည်သို့ရှောင်ရှားရမည်ကိုဤဆောင်းပါးတွင်လေ့လာပါမည်။

1 ။ serialization လုပ်ဆောင်ချက်များကိုအခြေခံအသုံးပြုမှု

PHP ရှိ Serialize function သည် PHP တန်ဖိုးများကိုသိမ်းဆည်းထားသည့်သို့မဟုတ်လွှဲပြောင်းနိုင်သောပုံစံသို့ပြောင်းလဲသည်။ များသောအားဖြင့်အရာဝတ်ထုများသို့မဟုတ် arrays ၏ persistent သိုလှောင်မှုအတွက်အသုံးပြုကြသည်။ ဥပမာအားဖြင့်:

 <?php
$array = array("name" => "GitBox", "url" => "https://gitbox.net");
$serialized = serialize($array);
echo $serialized;
?>

2 ။ အဆုံးမဲ့ရလာဒ်၏မျိုးဆက်

အရာဝတ်ထုများအကြားမြို့ပတ်ရထားရည်ညွှန်းချက်ရှိသည့်အခါအဆုံးမဲ့လှည့်ကွက်၏ထောင်ချောက်များမှာများသောအားဖြင့်ဖြစ်သည်။ ဥပမာအားဖြင့်:

 <?php
class Node {
    public $name;
    public $child;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function setChild($child) {
        $this->child = $child;
    }
}

$node1 = new Node("Node 1");
$node2 = new Node("Node 2");
$node1->setChild($node2);
$node2->setChild($node1);

$serialized = serialize($node1); // ဤသည်အဆုံးမဲ့ရိုးရိုး recursion ဖြစ်ပေါ်လိမ့်မယ်
?>

အထက်ဖော်ပြပါကုဒ်များတွင် $ node1 နှင့် $ node2 သည်တစ် ဦး ကိုတစ် ဦး ရည်ညွှန်းသည်။ Serialize ($ node1) ကိုခေါ်သည့်အခါ PHP သည် Nodeကလေး၏ ပိုင်ဆိုင်မှုကို 0 မ် းနည်းစေမည့် $ Node အမှတ်အသား ကိုစတင် 0 န်ထုတ်ပေးလိမ့်မည်။ ထို့နောက် PHP သည် $ node2 ကို 0 န်ဆောင်မှုပေးမည်ဖြစ်ပြီး၎င်းသည်အဆုံးမဲ့အားဖွင့်လှစ်နိုင်သည့် ဒေါ်လာ node11 သို့ပြန်သွားလိမ့်မည်။

3 ။ အဆုံးမဲ့ရလာဒ်ကိုဘယ်လိုရှောင်ရှားရမလဲ

မရေမတွက်နိုင်သောလှည့်စားမှုထောင်ချောက်ထဲမကျမိစေရန် Serialize ကို အသုံးပြုသောအခါအောက်ပါနည်းလမ်းများကိုကျွန်ုပ်တို့ယူနိုင်သည် -

3.1 __sleep Magic Method ကိုအသုံးပြုခြင်း

PHP သည် Magic Method __sleep ကို ထောက်ပံ့ပေးသည်။ အကယ်. အရာဝတ်ထု attribute သည် recursion ကိုဖြစ်ပေါ်စေပါကဤ attribute များကိုစစ်ထုတ်ရန် __SLEEP နည်းလမ်းကိုသုံးပါ။

 <?php
class Node {
    public $name;
    public $child;
    
    public function __construct($name) {
        $this->name = $name;
    }

    public function setChild($child) {
        $this->child = $child;
    }

    public function __sleep() {
        return ['name']; // သာ serialization $name ဉစ်စာပစ္စည်းများ,မြို့ပတ်ရထားကိုးကားခြင်းကိုရှောင်ပါ
    }
}

$node1 = new Node("Node 1");
$node2 = new Node("Node 2");
$node1->setChild($node2);
$node2->setChild($node1);

$serialized = serialize($node1); // ဤနေရာတွင်မည်သည့်အခါသမယထွက်ပေါက်မရှိပါ
echo $serialized;
?>

__Seep တွင် attribute များစာရင်းကိုပြန်ပို့ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် attribute များသည်မည်သည့် attributees များကို serialize ဖြစ်လိမ့်မည်, ထို့ကြောင့် recursion ကိုရှောင်ရှားနိုင်သည်။

3.2 အရာဝတ်ထုများကိုသိုလှောင်ရန် SpighloBonstorage ကို အသုံးပြုပါ

splocbjectstorage သည်အရာဝတ်ထုများကိုသိုလှောင်ရန်အထူးအသုံးပြုသောအတန်းအစားကိုအထူးအသုံးပြုသောအတန်းတစ်ခုဖြစ်ပြီးသိုလှောင်ထားသည့်အခါ Replicate objects ကြောင့်ဖြစ်ပေါ်လာသောပြ problems နာများကိုရှောင်ရှားနိုင်သည်။ Rearursion ပြ problems နာများကိုရှောင်ရှားရန်၎င်းကိုကျွန်ုပ်တို့အသုံးပြုနိုင်သည်။

 <?php
class Node {
    public $name;
    public $child;
    
    public function __construct($name) {
        $this->name = $name;
    }

    public function setChild($child) {
        $this->child = $child;
    }
}

$node1 = new Node("Node 1");
$node2 = new Node("Node 2");
$node1->setChild($node2);
$node2->setChild($node1);

$storage = new SplObjectStorage();
$storage->attach($node1);
$storage->attach($node2);

$serialized = serialize($storage); // ဤနေရာတွင်မည်သည့်အခါသမယထွက်ပေါက်မရှိပါ
echo $serialized;
?>

splocbjectstorage သည်အရာဝတ်ထုများကိုရည်ညွှန်းသည်။

3.3 စိတ်ကြိုက် __wakeup မှော်နည်းလမ်း

အချို့သောကိစ္စရပ်များတွင်ကျွန်ုပ်တို့သည် Serial Object ကိုပြန်လည်ထူထောင်သောအခါနောက်ထပ်စစ်ဆေးမှုများပြုလုပ်လိုပေမည်။ PHP သည် __WAKUP မှော်နည်းလမ်းကိုထောက်ပံ့ပေးသည်။

 <?php
class Node {
    public $name;
    public $child;
    
    public function __construct($name) {
        $this->name = $name;
    }

    public function setChild($child) {
        $this->child = $child;
    }

    public function __wakeup() {
        if ($this->child === $this) {
            $this->child = null; // deserialization စဉ်အတွင်းမြို့ပတ်ရထားကိုးကားတားဆီး
        }
    }
}

$node1 = new Node("Node 1");
$node2 = new Node("Node 2");
$node1->setChild($node2);
$node2->setChild($node1);

$serialized = serialize($node1); 
echo $serialized;

$unserialized = unserialize($serialized); // မြို့ပတ်ရထားရည်ညွှန်းချက်ကိုအလိုအလျှောက်ရှင်းလင်းလိမ့်မည်
?>

__wakeup နည်းလမ်းတွင်ကျွန်ုပ်တို့သည်လှည့်စားခြင်းခံရသောအခါပြန်လည်လှည့်မှုကိုရှောင်ရှားရန် loop ကိုရည်ညွှန်း။ ရှင်းလင်းပြတ်သားစွာရှာဖွေတွေ့ရှိသည်။


ဤနည်းလမ်းများမှတစ်ဆင့် PHP Serialization ကြောင့်ဖြစ်သော PHP Serialization ကြောင့်ဖြစ်ပေါ်လာသောအဆုံးမဲ့အားဖြင့်ရလာဒ်ပြ problems နာများကိုထိရောက်စွာရှောင်ရှားနိုင်သည်။ PHP တွင် Serialize လုပ်ဆောင်ချက်များကိုအသုံးပြုသည့်အခါ Realursive ထောင်ချောက်များကိုမည်သို့ရှောင်ရှားရမည်ကိုပိုမိုနားလည်ရန်ဤဆောင်းပါးသည်သင့်အားပိုမိုနားလည်ရန်ကူညီပေးပါ။ သင့်တွင်မေးခွန်းများရှိပါက ကျေးဇူးပြု. ဆက်လက်ဆွေးနွေးပါ။