من المحتمل أن يكون التسلسل عبارة عن تحويل بعض المتغيرات إلى دفق بايت من السلاسل، مما يسهل عملية النقل والتخزين. بالطبع، لا علاقة له بالنقل والتخزين. المفتاح هو أنه يمكن تحويله مرة أخرى إلى شكل سلسلة ويمكن الحفاظ على بنية البيانات الأصلية.
هناك العديد من وظائف التسلسل في PHP: serialize (). تقوم هذه الوظيفة بتحويل أي قيمة متغيرة (باستثناء متغيرات الموارد) إلى شكل سلسلة. يمكن حفظ السلسلة في ملف، أو تسجيلها كجلسة، أو حتى استخدام الضفيرة محاكاة GET/POST لنقل المتغيرات لتحقيق تأثير RPC.
إذا كنت تريد تحويل المتغيرات المتسلسلة إلى قيم متغيرات PHP الأصلية، فيمكنك استخدام الدالة unserialize().
1. التسلسل المتغير
لنأخذ مثالاً بسيطًا لتوضيح التسلسل وتنسيق تخزينه.
نوع العدد الصحيح:
$var = 23;
تسلسل
الصدى(
$
var);
نوع
النقطة العائمة:
$
var
= 1.23
;
تسلسل الصدى($var);
$var = "أنا متغير";
تسلسل الصدى($var);
s
:16:"هذه سلسلة";
s:8: "أنا متغير";
النوع المنطقي:
$var = true;
تسلسل الصدى($var);
$var = false;
تسلسل الصدى($var)
الإخراج:
b:1;
b:0
الوضع بعد التسلسل للأنواع الأساسية المذكورة أعلاه واضح جدًا، تنسيق التخزين بعد التسلسل هو:
نوع المتغير: [الطول المتغير:]
يمثل الحرف الأول نوع المتغير
؛يمثل التقسيم. الطول المتغير اختياري، أي أنه متوفر في نوع السلسلة ولكن ليس في الأنواع الأخرى. والأخير هو قيمة المتغير. تنتهي كل قيمة متسلسلة بـ ";".
على سبيل المثال، بعد أن يتم تسلسل الرقم الصحيح 23، فهو: i:23، ثم ليس له طول، فقط نوع وقيمة متغيرة، i يمثل عددًا صحيحًا، مفصولاً بنقطتين، ويتم حفظ قيمة العدد الصحيح 23 لاحقًا، بما في ذلك النقطة العائمة النوع (مزدوج) نوع البايت) هو نفسه. بالنسبة إلى القيمة المنطقية، يكون النوع b (منطقي) إذا كان صحيحًا، فإن القيمة المتسلسلة هي 1. وإذا كانت خاطئة، تكون القيمة 0.
بالنسبة لقيم
السلسلة
، ستكون هناك قيمة محفوظة إضافية في المنتصف، والتي تحفظ قيمة طول السلسلة، مثل السلسلة "هذه سلسلة"، ثم القيمة التسلسلية التي تم إنشاؤها هي s:16:"This is string" "؛ s عبارة عن سلسلة تمثل النوع. الرقم 16 في المنتصف هو طول السلسلة. إذا كانت صينية، فسيتم تخزين كل حرف صيني في حرفين. على سبيل المثال، السلسلة "أنا متغير"، القيمة المتسلسلة التي تم إنشاؤها هي :s:8:"أنا متغير"؛بعد ذلك نركز على تسلسل متغيرات المصفوفة.
متغير المصفوفة:
$var = array("abc", "def", "xyz", "123");
تسلسل الصدى($var);
الإخراج:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz"; i:3;s:3:"123";}
هي قيمة السلسلة التي تم الحصول عليها عن طريق إجراء تسلسل للمصفوفة $var. تتضمن مصفوفة $var الخاصة بنا 4 عناصر سلسلة، وهي "abc" و"def" و"xyz" و"123" ، دعنا نحلل البيانات المتسلسلة، من أجل البساطة، ندرج البيانات المتسلسلة بتنسيق مصفوفة:
a:4:
{
أنا:0;s:3:"abc";
أنا:1;ق:3:"def";
أنا:2;ق:3:"xyz";
أنا:3;ق:3:"123";
}
الترتيب أكثر وضوحًا، انظر إلى سلسلة البداية: a:4:{...} أولاً، الحرف الأول a يحفظ نوع المتغير، وهو نوع المصفوفة، والحرف 4 الثاني يحفظ عناصر المصفوفة. عدد ، هناك 4 في المجموع، ثم محتويات عناصر المصفوفة بين {}. على سبيل المثال، عنصر الصفيف الأول: i:0;s:3:"abc"; i يمثل أن نوع قيمة الفهرس لعنصر الصفيف الحالي هو عدد صحيح، والقيمة هي 0، ونوع قيمة العنصر هو s (سلسلة )، الرقم هو 3، والقيمة المحددة هي "abc"، وتنتهي بفاصلة منقوطة، وهكذا بالنسبة لعناصر المصفوفة التالية.
دعونا نلقي نظرة على ما يحدث إذا استخدمنا السلاسل كفهارس عناصر:
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4" = >"123");
تسلسل الصدى($var);
الإخراج:
a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6: "index3";s:3:"xyz";s:6:"index4";s:3:"123";}
بعد التغيير إلى نمط المصفوفة:
a:4:
{
s:6:"index1";s:3:"abc";
s:6:"index2";s:3:"def";
s:6:"index3";s:3:"xyz";
s:6:"index4";s:3:"123";
}
في الواقع، لا يختلف كثيرًا عما سبق، باستثناء أن فهرس البداية يتغير إلى شكل حفظ السلاسل، على سبيل المثال العنصر الأول: s:6: "index1"; العنصر الأول هو قيمة الفهرس: s:6:"index1"; s هو النوع، و6 هو طول سلسلة الفهرس، و"index1" هو قيمة الفهرس. ما يلي s:3:"abc"; هو قيمة العنصر، وهذا أمر سهل الفهم، لذا لن أخوض في التفاصيل.
مما سبق، لدينا فهم عام لتسلسل أنواع البيانات الأساسية. في الواقع، يمكننا بناء وظيفة التسلسل الخاصة بنا، أو التوسع من هذا المنظور وتطوير برنامج التسلسل الخاص بنا لتسهيل التبادل المتغير.
بالطبع، في الواقع، يمكننا أيضًا استخدام هذه الوظيفة لإجراء تسلسل لمصفوفة أو أي متغير آخر في سلسلة، ثم استخدام وظيفة الضفيرة لمحاكاة وظيفة GET/POST للحصول على البيانات من الخادم البعيد دون قيام المستخدم بتنفيذ أي إجراءات.
2. تسلسل الكائنات
يعد تسلسل الكائنات أيضًا وظيفة شائعة نسبيًا، حيث يمكنه إجراء تسلسل لكائن ما وتحويله إلى سلسلة يمكن حفظها أو نقلها.
دعونا نلقي نظرة على مثال أولاً:
فئة TestClass
{
فار $a;
فار $ ب؛
وظيفة TestClass()
{
$this->a = "هذا هو";
$this->b = "هذا ب";
}
الدالة getA()
{
إرجاع $this->a;
}
الدالة getB()
{
إرجاع $this->b;
}
}
$obj = new TestClass;
$str = تسلسل($obj);
echo $str;
نتيجة الإخراج:
O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b";}
دعونا نحلل السلسلة بعد تسلسل الكائن.
س:9:"فئة الاختبار":2:
{
s:1:"a";s:9:"هذا";
s:1:"b";s:9:"هذا ب";
}
انظر أولاً إلى محتوى الكائن نفسه: O:9:"TestClass":2:O يشير إلى أن هذا نوع كائن (كائن)، ثم يمثل 9 اسم الكائن، ويمثل 2 عدد الكائنات الموجودة ملكية. بالنظر إلى محتويات السمتين:
s:1:"a";s:9:"This is a"; في الواقع، إنه مشابه لمحتويات المصفوفة "؛ هو اسم سمة الوصف. العنصر الثاني s:9: "هذا هو"؛ يصف قيمة السمة. الخصائص التالية متشابهة.
اسمحوا لي أولاً أن أتحدث عن تطبيق تسلسل الكائنات. المحتوى التالي مأخوذ من دليل PHP، ولم يتم تغيير النص الأصلي.
تقوم الدالة serialize() بإرجاع سلسلة تحتوي على تمثيل دفق بايت لأي قيمة يمكن تخزينها في PHP. يمكن لـ unserialize() استخدام هذه السلسلة لإعادة بناء قيمة المتغير الأصلية. يؤدي حفظ كائن باستخدام التسلسل إلى حفظ كافة المتغيرات الموجودة في الكائن. لا يتم حفظ الوظائف الموجودة في الكائن، بل يتم حفظ اسم الفئة فقط.
لتتمكن من إلغاء تسلسل () كائن ما، يجب تحديد فئة الكائن. أي أنك إذا قمت بإجراء تسلسل للكائن $a من الفئة A في page1.php، فستحصل على سلسلة تشير إلى الفئة A وتحتوي على قيم جميع المتغيرات في $a. إذا كنت تريد إلغاء تسلسله في page2.php وإعادة بناء الكائن $a من الفئة A، فيجب أن يظهر تعريف الفئة A في page2.php. يمكن تحقيق ذلك، على سبيل المثال، عن طريق وضع تعريف الفئة A في ملف التضمين وتضمين هذا الملف في كل من page1.php وpage2.php.
<?php
// كلاسا.ينك:
فئة أ
{
فار $one = 1
;
{
صدى $this->one;
}
}
// page1.php:
"
);
$s = تسلسل($a);
// قم بتخزين $s في مكان ما حتى يتمكن page2.php من العثور عليه
$fp = fopen("store", "w");
fputs($fp, $s);
fClose($fp);
//page2.php:
// هذا السطر ضروري لإلغاء التسلسل العادي
"
);
$a = unserialize($s);
// الآن يمكنك استخدام الدالة show_one() للكائن $a
$a->show_one();
?>
إذا كنت تستخدم جلسة وتستخدم session_register() لتسجيل الكائنات، فسيتم إجراء تسلسل لهذه الكائنات تلقائيًا في نهاية كل صفحة PHP، وإلغاء تسلسلها تلقائيًا في كل صفحة لاحقة. ويعني هذا في الأساس أنه بمجرد أن تصبح هذه الكائنات جزءًا من الجلسة، فإنها يمكن أن تظهر على أي صفحة.
يوصى بشدة أن تتضمن كافة الصفحات تعريفات فئة لهذه الكائنات المسجلة، حتى إذا لم يتم استخدام هذه الفئات في جميع الصفحات. إذا لم يتم ذلك، وتم إلغاء تسلسل الكائن ولكن لم يتم تحديد فئته، فسوف يفقد فئته المرتبطة ويصبح كائن stdClass دون أي وظائف متاحة على الإطلاق، وهو أمر عديم الفائدة للغاية.
لذا، إذا أصبح $a جزءًا من الجلسة عن طريق تشغيل session_register("a") في المثال أعلاه، فيجب تضمين ملف classa.inc في جميع الصفحات، وليس فقط page1.php وpage2.php.
بالطبع، يمكن بالفعل تطبيق الكائنات المتسلسلة في العديد من الأماكن. بالطبع، يتم التعامل مع التسلسل بشكل مختلف في PHP 5. دعونا نلقي نظرة على ما يقوله الدليل:
يتحقق serialize() مما إذا كانت هناك وظيفة بالاسم السحري __sleep في الفصل الدراسي. إذا كان الأمر كذلك، سيتم تشغيل الوظيفة قبل إجراء أي تسلسل. يقوم بمسح الكائن ويجب أن يُرجع مصفوفة تحتوي على أسماء جميع المتغيرات في الكائن الذي يجب إجراء تسلسل له.
الغرض من استخدام __sleep هو إغلاق أي اتصالات بقاعدة البيانات قد يكون لدى الكائن، أو إرسال البيانات المعلقة، أو تنفيذ مهام تنظيف مماثلة. بالإضافة إلى ذلك، تعد هذه الوظيفة مفيدة أيضًا إذا كان لديك كائنات كبيرة جدًا ولا تحتاج إلى تخزينها بالكامل.
على العكس من ذلك، يتحقق unserialize() من وجود دالة بالاسم السحري __wakeup. يمكن لهذه الوظيفة إعادة بناء أي موارد قد يمتلكها الكائن، إذا كانت موجودة.
الغرض من استخدام __wakeup هو إعادة تأسيس أي اتصالات قاعدة بيانات قد تكون فقدت أثناء التسلسل ومعالجة مهام إعادة التهيئة الأخرى.