الفرق بين المراجعتين لصفحة: «PHP/serialization»

من موسوعة حسوب
< PHP
ط استبدال النص - 'PHP\/([^|-]*)-([^|-]*)-([^|-]*)' ب'PHP/$1_$2_$3'
ط استبدال النص - 'PHP\/([^|-]*)-([^|-]*)' ب'PHP/$1_$2'
سطر 39: سطر 39:
</syntaxhighlight>
</syntaxhighlight>


إن كان التطبيق يستخدم الجلسات ويستخدم الدالة <code>[[PHP/session-register|session_register()‎]]</code> لتسجيل الكائنات، فإنّ هذه الكائنات تُسلسل بصورة تلقائية في نهاية كل صفحة PHP، وتلغى سلسلتها بصورة تلقائية أيضًا في كل صفحة من الصفحات اللاحقة. هذا يعني أنه يمكن لهذه الكائنات أن تظهر في جميع صفحات التطبيق بمجرد أن تصبح جزءًا من الجلسة، ولكن الدالة <code>[[PHP/session-register|session_register()]]</code>‎ قد حُذفت في الإصدار 5.4.0 من PHP.
إن كان التطبيق يستخدم الجلسات ويستخدم الدالة <code>[[PHP/session_register|session_register()‎]]</code> لتسجيل الكائنات، فإنّ هذه الكائنات تُسلسل بصورة تلقائية في نهاية كل صفحة PHP، وتلغى سلسلتها بصورة تلقائية أيضًا في كل صفحة من الصفحات اللاحقة. هذا يعني أنه يمكن لهذه الكائنات أن تظهر في جميع صفحات التطبيق بمجرد أن تصبح جزءًا من الجلسة، ولكن الدالة <code>[[PHP/session_register|session_register()]]</code>‎ قد حُذفت في الإصدار 5.4.0 من PHP.


يُنصح بشدّة أن يتضمّن التطبيق تعريف الصنف عند الحاجة إلى سلسلة الكائن واستخدامه في وقت لاحق ضمن التطبيق. قد يؤدي عدم القيام بذلك إلى إلغاء سلسلة كائن ما دون وجود تعريف الصنف، ممّا يؤدي باللغة إلى أن تمنح الكائن الصنف ‎<code>__PHP_Incomplete_Class_Name</code> والذي يكون خاليًا من التوابع وبهذا قد يصبح الكائن عديم الفائدة.
يُنصح بشدّة أن يتضمّن التطبيق تعريف الصنف عند الحاجة إلى سلسلة الكائن واستخدامه في وقت لاحق ضمن التطبيق. قد يؤدي عدم القيام بذلك إلى إلغاء سلسلة كائن ما دون وجود تعريف الصنف، ممّا يؤدي باللغة إلى أن تمنح الكائن الصنف ‎<code>__PHP_Incomplete_Class_Name</code> والذي يكون خاليًا من التوابع وبهذا قد يصبح الكائن عديم الفائدة.

مراجعة 03:46، 4 أبريل 2018

سلسلة الكائنات - الكائنات في الجلسات

تعيد الدالة serialize()‎‎ سلسلة نصية تتضمّن تمثيلًا لتدفق البايتات لأي قيمة يمكن تخزينها في PHP، ويمكن للدالة unseriazlie()‎ استخدام هذه السلسلة النصية لإعادة إنشاء القيمة الأصلية للمتغيّر. يؤدي تطبيق الدالة serialize()‎ على كائن ما لحفظ جميع المتغيرات الخاصة بذلك الكائن، أما التوابع فلا تحفظ وإنّما يحفظ اسم الصنف فقط.

يجب تعريف الصنف الخاص بالكائن حتى يكون بالإمكان تطبيق unserialize()‎ على الكائن، بمعنى أنّه لو كان لديك كائن للصنف A وأجريت عليه عملية السلسلة، فإنّك ستحصل على سلسلة نصية تعود إلى الصنف A وتتضمن قيم جميع المتغيرات الموجودة في ذلك الكائن. ولتكون قادرًا على إلغاء سلسلة هذا الكائن في ملف آخر، يجب أن يكون تعريف الصنف A موجودًا في ذلك الملف قبل البدء بإلغاء السلسلة. ويمكن القيام بذلك على سبيل المثال عن طريق تخزين تعريف الصنف A في ملف ثم تضمينه باستخدام التعبير include أو استخدام الدالة spl_autoload_register()‎.

<?php
// classa.inc:
  
  class A {
      public $one = 1;
    
      public function show_one() {
          echo $this->one;
      }
  }
  
// page1.php:

  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // store $s somewhere where page2.php can find it.
  file_put_contents('store', $s);

// page2.php:
  
  // هذا مطلوب لتتم عملية السلسلة بنجاح
  include("classa.inc");

  $s = file_get_contents('store');
  $a = unserialize($s);

  // now use the function show_one() of the $a object.  
  $a->show_one();
?>

إن كان التطبيق يستخدم الجلسات ويستخدم الدالة session_register()‎ لتسجيل الكائنات، فإنّ هذه الكائنات تُسلسل بصورة تلقائية في نهاية كل صفحة PHP، وتلغى سلسلتها بصورة تلقائية أيضًا في كل صفحة من الصفحات اللاحقة. هذا يعني أنه يمكن لهذه الكائنات أن تظهر في جميع صفحات التطبيق بمجرد أن تصبح جزءًا من الجلسة، ولكن الدالة session_register()‎ قد حُذفت في الإصدار 5.4.0 من PHP.

يُنصح بشدّة أن يتضمّن التطبيق تعريف الصنف عند الحاجة إلى سلسلة الكائن واستخدامه في وقت لاحق ضمن التطبيق. قد يؤدي عدم القيام بذلك إلى إلغاء سلسلة كائن ما دون وجود تعريف الصنف، ممّا يؤدي باللغة إلى أن تمنح الكائن الصنف ‎__PHP_Incomplete_Class_Name والذي يكون خاليًا من التوابع وبهذا قد يصبح الكائن عديم الفائدة.

لذا؛ إن إصبح المتغير ‎$a في المثال السابق جزءًا من جلسة وذلك بتنفيذ العبارة session_register("a")‎، يصبح من الواجب تضمين الملف classa.inc في جميع الصفحات وليس في الصفحتين page1.php و page2.php.

لاحظ أيضًا -بالإضافة إلى النصيحة أعلاه- أنّ بالإمكان الوصول إلى حدثي السلسلة وإلغاء السلسلة باستخدام التابعين ‎__sleep()‎‎ و ‎__wakeup()‎. ويتيح التابع ‎__sleep()‎ سَلسَلة جزء من خصائص التابع فقط.

مصادر