الفرق بين المراجعتين ل"PHP/serialize"

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:الدالة <code>serialize()</code>‎ في PHP}}</noinclude>')
 
 
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:الدالة <code>serialize()</code>‎ في PHP}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:الدالة <code>serialize()</code>‎ في PHP}}</noinclude>
 +
(PHP 4, PHP 5, PHP 7)
 +
 +
تُولِّد الدالة <code>serialize()</code>‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ تمثيلًا قابلًا للتخزين لقيمة ما.
 +
 +
== الوصف ==
 +
<syntaxhighlight lang="php">
 +
string serialize ( mixed $value )
 +
</syntaxhighlight>تُولِّد‎‎‎‎‎‎‎‎‎‎ تمثيلًا قابلًا للتخزين لقيمة ما.
 +
 +
يُفيد هذا في تخزين وتمرير قيم PHP بدون خسارة نوعها وبنيتها.
 +
 +
نستخدم الدالة <code>[[PHP/unserialize|unserialize()]]</code>‎ لإرجاع السلسلة النصّيّة المتسلسلة إلى قيمة PHP مرّة أخرى.
 +
 +
== المعاملات ==
 +
 +
=== value ===
 +
القيمة المطلوب جعلها متسلسلة، تتعامل الدالة <code>serialize()</code>‎ مع كافة الأنواع عدا [[PHP/resource|الموارد]]، بإمكاننا حتى أن نستخدم <code>serialize()‎</code> على مصفوفات تحتوي على مراجع تُشير إلى هذه المصفوفة. تُخزَّن المراجع الموجودة داخل المصفوفة أو الكائن الذي تجري سَلسَلتُه، وتُفقَد أي مراجع أخرى.
 +
 +
تُحاوِل PHP عند سَلسَلة الكائنات أن تستدعي الدالة <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|sleep()‎__]]</code> قبل إجراء السَّلسَلة ممّا يسمح للكائن «بتنظيف» أخير قبل سلسلته، وبالمثل عند استعادة الكائن باستخدام الدالة <code>[[PHP/unserialize|unserialize()]]</code>‎ فستُستدعى الدالة العضو <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|wakeup()‎__]]</code>.
 +
 +
ملاحظة: تمتلك الأعضاء الخاصّة للكائن اسم الصّنف مُرفقًا مُسبقًا مع اسم العضو. تمتلك الأعضاء المحميّة القيمة <code>'*'</code> مُرفقةً مُسبقًا مع اسم العضو.
 +
 +
== القيم المعادة ==
 +
سلسلة نصّيّة تحتوي على تمثيل للمتغيّر ويُمكِن تخزينه في أي مكان.
 +
 +
لاحظ أنّها سلسلة نصّيّة بالنظام الثنائي وقد تتضمن بايتات null‏ (null bytes) وتحتاج إلى تخزينها والتعامل معها كذلك، فعلى سبيل المثال ينبغي بشكل عام تخزين خرج الدالة <code>serialize()</code>‎ في قاعدة البيانات في حقل <code>BLOB</code> بدلًا من حقل <code>CHAR</code> أو <code>TEXT</code>.
 +
 +
== أمثلة ==
 +
المثال 1: أمثلة على الدالة <code>serialize()‎‎</code>
 +
 +
في المثال التالي يحتوي المتغيّر <code>session_data‎$</code> على مصفوفة متعدّدة الأبعاد بمعلومات الجلسة للمستخدم الحالي. نستخدم الدالة <code>serialize()‎</code> لتخزينها في قاعدة البيانات عند نهاية الطّلب:<syntaxhighlight lang="php">
 +
<?php
 +
 +
$conn = odbc_connect("webdb", "php", "chicken");
 +
$stmt = odbc_prepare($conn,
 +
      "UPDATE sessions SET data = ? WHERE id = ?");
 +
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
 +
if (!odbc_execute($stmt, $sqldata)) {
 +
    $stmt = odbc_prepare($conn,
 +
    "INSERT INTO sessions (id, data) VALUES(?, ?)");
 +
    if (!odbc_execute($stmt, $sqldata)) {
 +
        // حدث خطأ ما...
 +
    }
 +
}
 +
?>
 +
 +
</syntaxhighlight>
 +
 +
== ملاحظات ==
 +
لاحظ أنّ العديد من الكائنات المُضمَّنة في PHP لا يُمكِن سَلسَلتها، ولكن تعتمد الكائنات التي تملك القدرة على ذلك الواجهة Serializable أو التوابع <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|sleep()‎__]]</code> و <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|wakeup()‎__]]</code>، إن لم يُحقِّق أحد الأصناف الداخلية أيٌ من هذه المتطلّبات فلا يُمكِن سَلسَلته.
 +
 +
توجد بعض الاستثناءات التاريخيّة لهذه القاعدة حيث يُمكِن سلسلة كائنات داخليّة بدون اعتماد هذه الواجهة أو استخدام تلك التوابع، مثل الكائن [http://php.net/manual/en/class.arrayobject.php ArrayObject] قبل الإصدار PHP 5.2.0.
 +
 +
تحذير: عندما تُسَلسِل الدالةُ <code>serialize()‎</code> الكائنات، فلا تُضمَّن الشرطة المائلة الخلفية (backslash) في اسم الصّنف لتحقيق توافقيّة قصوى.
 +
 +
== انظر أيضًا ==
 +
* الدالة <code>[[PHP/unserialize|unserialize()]]</code>‎: إنشاء قيمة PHP من تمثيل مُخزَّن.
 +
* الدالة <code>[[PHP/var export|var_export()‎]]</code>‎: إعادة أو إخراج تمثيل سلسلة نصّيّة قابل للتحليل.
 +
* الدالة <code>[[PHP/json encode|json_encode()]]</code>‎: إعادة تمثيل بصيغة JSON لقيمة ما.
 +
* [[PHP/serialization|سلسلة الكائنات Serializing Objects]].
 +
* الدالة <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|sleep()‎__]]</code>: تستدعى عند سَلسَلة الكائن.
 +
* الدالة <code>[[PHP/magic#.E2.80.8E sleep.28.29.E2.80.8E .D9.88 .E2.80.8E wakeup.28.29.E2.80.8E|wakeup()‎__]]</code>: تستدعى عند إنشاء قيمة PHP من تمثيل مُخزَّن.
 +
 +
== مصادر ==
 +
* [http://php.net/manual/en/function.serialize.php صفحة الدالة serialize في توثيق PHP الرسمي].
 +
[[تصنيف:PHP]]
 +
[[تصنيف:PHP Function]]
 +
[[تصنيف:PHP Variable Handling]]

المراجعة الحالية بتاريخ 09:21، 18 أبريل 2018

(PHP 4, PHP 5, PHP 7)

تُولِّد الدالة serialize()‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ تمثيلًا قابلًا للتخزين لقيمة ما.

الوصف

string serialize ( mixed $value )

تُولِّد‎‎‎‎‎‎‎‎‎‎ تمثيلًا قابلًا للتخزين لقيمة ما.

يُفيد هذا في تخزين وتمرير قيم PHP بدون خسارة نوعها وبنيتها.

نستخدم الدالة unserialize()‎ لإرجاع السلسلة النصّيّة المتسلسلة إلى قيمة PHP مرّة أخرى.

المعاملات

value

القيمة المطلوب جعلها متسلسلة، تتعامل الدالة serialize()‎ مع كافة الأنواع عدا الموارد، بإمكاننا حتى أن نستخدم serialize()‎ على مصفوفات تحتوي على مراجع تُشير إلى هذه المصفوفة. تُخزَّن المراجع الموجودة داخل المصفوفة أو الكائن الذي تجري سَلسَلتُه، وتُفقَد أي مراجع أخرى.

تُحاوِل PHP عند سَلسَلة الكائنات أن تستدعي الدالة sleep()‎__ قبل إجراء السَّلسَلة ممّا يسمح للكائن «بتنظيف» أخير قبل سلسلته، وبالمثل عند استعادة الكائن باستخدام الدالة unserialize()‎ فستُستدعى الدالة العضو wakeup()‎__.

ملاحظة: تمتلك الأعضاء الخاصّة للكائن اسم الصّنف مُرفقًا مُسبقًا مع اسم العضو. تمتلك الأعضاء المحميّة القيمة '*' مُرفقةً مُسبقًا مع اسم العضو.

القيم المعادة

سلسلة نصّيّة تحتوي على تمثيل للمتغيّر ويُمكِن تخزينه في أي مكان.

لاحظ أنّها سلسلة نصّيّة بالنظام الثنائي وقد تتضمن بايتات null‏ (null bytes) وتحتاج إلى تخزينها والتعامل معها كذلك، فعلى سبيل المثال ينبغي بشكل عام تخزين خرج الدالة serialize()‎ في قاعدة البيانات في حقل BLOB بدلًا من حقل CHAR أو TEXT.

أمثلة

المثال 1: أمثلة على الدالة serialize()‎‎

في المثال التالي يحتوي المتغيّر session_data‎$ على مصفوفة متعدّدة الأبعاد بمعلومات الجلسة للمستخدم الحالي. نستخدم الدالة serialize()‎ لتخزينها في قاعدة البيانات عند نهاية الطّلب:

<?php

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
      "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
    $stmt = odbc_prepare($conn,
     "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, $sqldata)) {
        // حدث خطأ ما...
    }
}
?>

ملاحظات

لاحظ أنّ العديد من الكائنات المُضمَّنة في PHP لا يُمكِن سَلسَلتها، ولكن تعتمد الكائنات التي تملك القدرة على ذلك الواجهة Serializable أو التوابع sleep()‎__ و wakeup()‎__، إن لم يُحقِّق أحد الأصناف الداخلية أيٌ من هذه المتطلّبات فلا يُمكِن سَلسَلته.

توجد بعض الاستثناءات التاريخيّة لهذه القاعدة حيث يُمكِن سلسلة كائنات داخليّة بدون اعتماد هذه الواجهة أو استخدام تلك التوابع، مثل الكائن ArrayObject قبل الإصدار PHP 5.2.0.

تحذير: عندما تُسَلسِل الدالةُ serialize()‎ الكائنات، فلا تُضمَّن الشرطة المائلة الخلفية (backslash) في اسم الصّنف لتحقيق توافقيّة قصوى.

انظر أيضًا

مصادر