تسلسل الكائنات في PHP: دليل كامل
\n\nالتسلسل هو عملية تحويل هياكل البيانات المعقدة (الكائنات، المصفوفات) إلى سلسلة نصية أو تنسيق ثنائي يمكن حفظه في ملف، أو نقله عبر الشبكة، أو تخزينه مؤقتًا. في PHP، يتم تنفيذ هذه الآلية من خلال الدوال المدمجة serialize() و unserialize(). في هذه المقالة، سنشرح بالتفصيل كيفية عمل تسلسل الكائنات، وما هي المخاطر المحتملة، وكيفية استخدام الطرق السحرية لضبط العملية بدقة.
الدوال الأساسية للتسلسل
\n\nتوفر PHP دالتين رئيسيتين للعمل مع التسلسل:
\n\n- \n
serialize($value)— تحول القيمة (باستثناء resource) إلى سلسلة نصية مناسبة للتخزين. بالنسبة للكائنات، يتم حفظ اسم الفئة وجميع الخصائص (بما في ذلك الخصائص الخاصة والمحمية). \n unserialize($string)— تستعيد القيمة الأصلية من السلسلة النصية. بالنسبة للكائنات، يتم استدعاء مُنشئ الفئة تلقائيًا (إذا كان محددًا) ويتم تعيين الخصائص المحفوظة. \n
مثال بسيط لتسلسل كائن
\n\nلننظر إلى الفئة الأساسية User وتسلسلها:
<?php\nclass User {\n public $name;\n public $email;\n private $password;\n\n public function __construct($name, $email, $password) {\n $this->name = $name;\n $this->email = $email;\n $this->password = $password;\n }\n}\n\n$user = new User('إيفان', 'ivan@example.com', 'secret123');\n$serialized = serialize($user);\necho $serialized;\n// الإخراج: O:4:"User":3:{s:4:"name";s:8:"إيفان";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}\n?>\n\nلاحظ: الخاصية الخاصة $password تظهر في السلسلة النصية كـ \\0User\\0password — وهذا ترميز خاص للحقول الخاصة، حيث \\0 هو البايت الصفري.
استعادة الكائن من السلسلة النصية المسلسلة
\n\n<?php\n$serialized = 'O:4:"User":3:{s:4:"name";s:8:"إيفان";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}';\n$user = unserialize($serialized);\necho $user->name; // إيفان\necho $user->email; // ivan@example.com\n// الخاصية الخاصة password تم استعادتها أيضًا، لكنها غير متاحة بشكل مباشر\n?>\n\nهام: عند إلغاء التسلسل، يحاول PHP تحميل الفئة إذا لم تكن محددة بعد. إذا كانت الفئة غير موجودة، سيتم إنشاء مثيل من الفئة المدمجة __PHP_Incomplete_Class.
الطرق السحرية __sleep() و __wakeup()
\n\nللتحكم في عملية التسلسل، توفر PHP طريقتين سحريتين:
\n\n- \n
__sleep()— تُستدعى قبل التسلسل. يجب أن تعيد مصفوفة بأسماء الخصائص التي يجب تسلسلها. مفيدة لإغلاق الاتصالات بقاعدة البيانات، أو تحرير الموارد، أو إخفاء البيانات الحساسة. \n __wakeup()— تُستدعى فورًا بعد إلغاء التسلسل. تُستخدم لإعادة الاتصال بقاعدة البيانات، أو استعادة الموارد، أو التحقق من سلامة البيانات. \n
مثال مع __sleep() و __wakeup()
\n\n<?php\nclass DatabaseConnection {\n private $host;\n private $user;\n private $password;\n private $connection;\n\n public function __construct($host, $user, $password) {\n $this->host = $host;\n $this->user = $user;\n $this->password = $password;\n $this->connect();\n }\n\n private function connect() {\n // محاكاة الاتصال\n $this->connection = "مورد الاتصال بـ {$this->host}";\n }\n\n public function __sleep() {\n // لا نقوم بتسلسل مورد الاتصال، فقط البيانات اللازمة لإعادة الاتصال\n return ['host', 'user', 'password'];\n }\n\n public function __wakeup() {\n // استعادة