<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: PHP</title><link>https://academy.hsoub.com/programming/php/page/3/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: PHP</description><language>ar</language><item><title>&#x627;&#x644;&#x62C;&#x644;&#x633;&#x627;&#x62A; &#x648;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x62A;&#x639;&#x631;&#x64A;&#x641; &#x627;&#x644;&#x627;&#x631;&#x62A;&#x628;&#x627;&#x637; &#x648;&#x645;&#x643;&#x62A;&#x628;&#x629; cURL &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AC%D9%84%D8%B3%D8%A7%D8%AA-%D9%88%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A7%D9%84%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-curl-%D9%81%D9%8A-php-r1081/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/16.png.a10b483628f858f2039d7500db91d812.png" /></p>

<h2>
	الجلسات
</h2>

<h3>
	خيارات session_start()‎
</h3>

<p>
	يمكننا تمرير مصفوفة من خيارات الملف <a href="%E2%80%8Fhttps://www.php.net/manual/en/ini.list.php" rel="">php.ini</a> المعتمدة على الجلسة (session) إلى الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/session_start" rel=""><code>session_start</code></a>، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_7" style="">
<span class="pun">&lt;?</span><span class="pln">php
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">version_compare</span><span class="pun">(</span><span class="pln">PHP_VERSION</span><span class="pun">,</span><span class="pln"> </span><span class="str">'7.0.0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// php &gt;= 7 </span><span class="pln">
        session_start</span><span class="pun">([</span><span class="pln">
            </span><span class="str">'cache_limiter'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'private'</span><span class="pun">,</span><span class="pln">
            </span><span class="str">'read_and_close'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// php &lt; 7 </span><span class="pln">
        session_start</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تقدّم أيضًا هذه الميزة إعداد <code>php.ini</code> جديد يسمى <code>lazy_write</code> قيمته الافتراضية <code>true</code> ويعني أن بيانات الجلسة يُعاد كتابتها فقط إذا تغيرت.
</p>

<h3>
	قفل الجلسة
</h3>

<p>
	تكتب PHP بيانات الجلسة في ملف موجود على الخادم، عندما يُرسَل طلب لبدء الجلسة باستخدام <code>session_start()‎</code> إلى سكربت PHP تقفل PHP ملف الجلسة لمنع/انتظار طلبات أخرى قادمة لنفس <code>session_id</code> للمتابعة‌ وبسبب ذلك ستبقى الطلبات الأخرى عالقة عند <code>session_start()‎</code> حتى يُلغى قفل ملف الجلسة.
</p>

<p>
	يبقى ملف الجلسة مقفلًا حتى ينتهي السكربت أو تُغلق الجلسة يدويًا، لتجنب هذه الحالة أي تجنب منع تعطيل عدة طلبات يمكننا أن نبدأ الجلسة ونغلقها مما سيحرر القفل من ملف الجلسة ويسمح بمتابعة الطلبات الباقية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_9" style="">
<span class="com">// php &lt; 7.0</span><span class="pln">
</span><span class="com">// بدء الجلسة</span><span class="pln">
session_start</span><span class="pun">();</span><span class="pln">

</span><span class="com">// كتابة بيانات في ملف الجلسة</span><span class="pln">
$_SESSION</span><span class="pun">[</span><span class="str">'id'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</span><span class="pun">;</span><span class="pln">
</span><span class="com">// عندها يُقفل ملف الجلسة لذا تتعطل الطلبات</span><span class="pln">

</span><span class="com">// إغلاق الجلسة وتحرير القفل</span><span class="pln">
session_write_close</span><span class="pun">();</span></pre>

<p>
	قد تتساءل الآن كيف ستُقرأ قيم الجلسة إذا كانت الجلسة مغلقة؟ تبقى الجلسة متاحة حتى بعد إغلاقها لذا بإمكاننا قراءة بياناتها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_11" style="">
<span class="pln">echo $_SESSION</span><span class="pun">[</span><span class="str">'id'</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 123</span></pre>

<p>
	يتوفر بدءًا من الإصدار php 7.0 خيارات الجلسة <code>read_only</code> و<code>read_write</code> و<code>lazy_write</code> لذا من الممكن ألا نستخدم <code>session_write_close()‎</code>.
</p>

<h3>
	معالجة بيانات الجلسة
</h3>

<p>
	إنّ المتغير <code>‎$_SESSION</code> عبارة عن مصفوفة وبإمكانك استعادتها أو معالجتها مثل أي مصفوفة عادية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_13" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// بدء الجلسة</span><span class="pln">
session_start</span><span class="pun">();</span><span class="pln">

</span><span class="com">// تخزين قيمة في الجلسة</span><span class="pln">
$_SESSION</span><span class="pun">[</span><span class="str">'id'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">342</span><span class="pun">;</span><span class="pln">

</span><span class="com">// استخدام تقليدي لقيم جلسة ربما قد ضُبطت في جلسة سابقة</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_SESSION</span><span class="pun">[</span><span class="str">"login"</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Please login first"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">exit</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// login يمكننا الآن أن نستخدم</span><span class="pln">
$user </span><span class="pun">=</span><span class="pln"> $_SESSION</span><span class="pun">[</span><span class="str">"login"</span><span class="pun">];</span><span class="pln">

</span><span class="com">// PHP 7 في Null الحصول على قيمة من بيانات الجلسة أو القيمة الافتراضية باستخدام عامل تجميع</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> $_SESSION</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> </span><span class="str">'Anonymous'</span><span class="pun">;</span></pre>

<p>
	لاحظ أنّه إذا خزّنت كائن في الجلسة فيمكنك استعادته بأمان إذا كان لديك محمّل تلقائي للصنف أو إذا كنت قد حمّلت الصنف مسبقًا، وإلا سيخرج الكائن كالنوع <code>‎__PHP_Incomplete_Class</code> مما قد يسبب الأعطال لاحقًا.
</p>

<p>
	<strong>تحذير:</strong> يمكن أن تتعرض بيانات الجلسة لهجوم اختطاف الجلسة (session hijacking) وهذا موضّح في <a href="%E2%80%8Fhttps://books.google.com.au/books?id=EUc6NlZRDqcC&amp;pg=PA97#v=onepage&amp;q&amp;f=false" rel="">كتاب أمن PHP المتقدم: من مبادئ أمن التطبيق إلى تنفيذ حماية xss - الفصل السابع: منع هجوم اختطاف الجلسة</a> لذا يُنصح بعدم تخزين أي معلومات شخصية في المصفوفة <code>‎$_SESSION</code> وخاصةً أرقام بطاقات الائتمان والمعرّفات الحكومية وكلمات المرور إنما يمكن تخزين المعلومات الأقل خطرًا مثل الأسماء وعناوين البريد الإلكتروني وأرقام الهاتف وغيرها مما يسمح للمخترق بانتحال شخصية مستخدم شرعي. كقاعدة عامة استخدم الجلسة لتخزين المعلومات الشخصية قليلة الأهمية.
</p>

<h3>
	تدمير كامل الجلسة
</h3>

<p>
	يمكنك استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/session_destroy" rel=""><code>session_destroy()‎</code></a> لتدمير الجلسة، بفرض لدينا الجلسة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_15" style="">
<span class="typ">Array</span><span class="pun">([</span><span class="pln">firstname</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Jon</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">123</span><span class="pun">)</span></pre>

<p>
	ابدأ الجلسة أولًا بعدها يمكنك حذف كل القيم الموجودة في المتغير ذي النطاق العام العالي <code>SESSION</code>، إذا أهملت هذا الحذف فإنّ كل المتغيرات العامة المخزنة في المتغير <code>SESSION</code> ستبقى موجودة حتى لو دُمِّرت الجلسة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_17" style="">
<span class="pln">session_start</span><span class="pun">();</span><span class="pln">
$_SESSION </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// إذا كنت ترغب في تدمير الجلسة يجب حذف ملف ارتباط الجلسة أيضًا</span><span class="pln">
</span><span class="com">// الشيفرة التالية ستُدمر الجلسة وليس فقط بياناتها</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ini_get</span><span class="pun">(</span><span class="str">"session.use_cookies"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $params </span><span class="pun">=</span><span class="pln"> session_get_cookie_params</span><span class="pun">();</span><span class="pln">
    setcookie</span><span class="pun">(</span><span class="pln">session_name</span><span class="pun">(),</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">42000</span><span class="pun">,</span><span class="pln">
    $params</span><span class="pun">[</span><span class="str">"path"</span><span class="pun">],</span><span class="pln"> $params</span><span class="pun">[</span><span class="str">"domain"</span><span class="pun">],</span><span class="pln">
    $params</span><span class="pun">[</span><span class="str">"secure"</span><span class="pun">],</span><span class="pln"> $params</span><span class="pun">[</span><span class="str">"httponly"</span><span class="pun">]</span><span class="pln">
    </span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// يمكنك الآن تدمير الجلسة</span><span class="pln">
session_destroy</span><span class="pun">();</span></pre>

<p>
	إنّ استخدام <code>session_destroy()‎</code> مختلف عن استخدام <code>‎$_SESSION = array();‎</code> التي ستزيل كل القيم الموجودة في المتغير ذي النطاق العام العالي <code>SESSION</code> ولن تدمر نسخة الجلسة المخزّنة الفعلية.
</p>

<p>
	<strong>ملاحظة:</strong> نستخدم <code>‎$_SESSION = array();‎</code> بدلًا من <code>session_unset()‎</code> لأنّ توثيق PHP ينص على أنّ استخدام <code>session_unset()‎</code> فقط للشيفرة القديمة المهملة التي لا تستخدم <code>‎$_SESSION</code>.
</p>

<h3>
	بدء جلسة آمنة دون أخطاء
</h3>

<p>
	يواجه العديد من المطورين هذه المشكلة عند عملهم على مشاريع كبيرة خاصةً إذا كانوا يعملوا على إضافات أو مكونات لنظام إدارة محتوى مثلًا، عندها فإنّ الحل لبدء جلسة آمنة يكون أولًا في التحقق من أنّ إصدار PHP يغطي كل الإصدارات ثمّ التحقق من بداية الجلسة. إذا لم توجد الجلسة عندها يمكن بدء الجلسة بأمان وإذا وجدت الجلسة لا يحدث أي شيء.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_19" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">version_compare</span><span class="pun">(</span><span class="pln">PHP_VERSION</span><span class="pun">,</span><span class="pln"> </span><span class="str">'7.0.0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">session_status</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> PHP_SESSION_NONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        session_start</span><span class="pun">(</span><span class="pln">array</span><span class="pun">(</span><span class="pln">
            </span><span class="str">'cache_limiter'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'private'</span><span class="pun">,</span><span class="pln">
            </span><span class="str">'read_and_close'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">));</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">version_compare</span><span class="pun">(</span><span class="pln">PHP_VERSION</span><span class="pun">,</span><span class="pln"> </span><span class="str">'5.4.0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">session_status</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> PHP_SESSION_NONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        session_start</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">session_id</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">''</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        session_start</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن يساعدك هذا كثيرًا لتجنب خطأ <code>session_start</code>.
</p>

<h3>
	اسم الجلسة
</h3>

<p>
	<strong>التحقق من إنشاء ملفات تعريف ارتباط الجلسة</strong>
</p>

<p>
	اسم الجلسة هو الاسم الذي يستخدمه ملف تعريف الارتباط (cookie) لتخزين الجلسات، يمكنك أن تستخدم هذا لتفحص فيما إذا اُنشئت ملفات تعريف الارتباط لجلسة ما:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_21" style="">
<span class="kwd">if</span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="pln">session_name</span><span class="pun">()]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    session_start</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ هذه الطريقة لا تفيد بشكلٍ عام إلا إذا كنت لا تريد إنشاء ملفات تعريف الارتباط دون ضرورة.
</p>

<p>
	<strong>تغيير اسم الجلسة</strong>
</p>

<p>
	يمكنك استدعاء الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/session_name" rel=""><code>session_name()‎</code></a> لتغيير اسم الجلسة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_23" style="">
<span class="com">// ضبط اسم الجلسة</span><span class="pln">
session_name</span><span class="pun">(</span><span class="str">'newname'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// بدء الجلسة</span><span class="pln">
session_start</span><span class="pun">();</span></pre>

<p>
	إذا لم يُمرَّر وسيط إلى الدالة <code>session_name()‎</code> سيُرجع اسم الجلسة الحالي، يجب أن يحتوي الاسم على محارف أبْجَعَددية فقط وأن يكون قصيرًا ووصفيًا (للمستخدمين الذين مكّنوا تحذيرات ملفات تعريف الارتباط)، لا يمكن أن يحتوي الاسم على أرقام فقط إنما يجب وجود حرف واحد على الأقل وإلا سيُنشأ معرّف جلسة جديد في كل مرة.
</p>

<h2>
	ملفات تعريف الارتباط
</h2>

<p>
	تأخذ الدالة <code>setcookie()‎</code> المعاملات التالية:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table><tbody>
<tr>
<td>
				ا<strong>لمعامل</strong>
			</td>
			<td>
				<strong>التفاصيل</strong>
			</td>
		</tr>
<tr>
<td>
				name
			</td>
			<td>
				اسم ملف تعريف الارتباط وهو المفتاح الذي يمكنك استخدامه لاستعادة قيمة من المتغير <code>‎</code>$_COOKIE ذو النطاق العام العالي‏‏ وهذا المعامل الإلزامي الوحيد
			</td>
		</tr>
<tr>
<td>
				value
			</td>
			<td>
				القيمة التي تريد تخزينها في ملف تعريف الارتباط، هذه البيانات يمكن أن يصل إليها المتصفح لذا لا تحفظ أي بيانات حساسة
			</td>
		</tr>
<tr>
<td>
				expire
			</td>
			<td>
				طابع يونكس زمني‏ (Unix timestamp) يمثّل وقت انتهاء ملف تعريف الارتباط، إذا ضُبط إلى الصفر فستنتهي مدة ملف تعريف الارتباط مع نهاية الجلسة وإذا ضُبط إلى وقت أصغر من الوقت الحالي فستنتهي مدة الملف مباشرةً
			</td>
		</tr>
<tr>
<td>
				path
			</td>
			<td>
				نطاق ملف تعريف الارتباط، إذا عُيّنت قيمته / سيكون ملف تعريف الارتباط متوفرًا على كامل المجال وإذا عُيّنت قيمته /مسار معين/ فسيكون الملف متوفرًا في هذا المسار ومساراته الفرعية. قيمته الافتراضية هي مسار ملف تعريف الارتباط الحالي
			</td>
		</tr>
<tr>
<td>
				domain
			</td>
			<td>
				النطاق أو النطاق الفرعي المتوفر عليه ملف تعريف الارتباط، إذا ضُبط إلى النطاق ‏stackoverflow.com ‏فإنّ الملف سيكون متوفرًا في هذا النطاق ونطاقاته الفرعية وإذا ضُبط إلى النطاق الفرعي meta.stackoverflow.com فإنّ الملف سيكون متوفرًا في هذا النطاق الفرعي والنطاقات الفرعية منه
			</td>
		</tr>
<tr>
<td>
				secure
			</td>
			<td>
				‏إذا ضُبط إلى القيمة‏ TRUE فسيُضبط ملف تعريف الارتباط فقط إذا وُجد اتصال HTTPS آمن بين الخادم والعميل
			</td>
		</tr>
<tr>
<td>
				httponly
			</td>
			<td>
				يحدد فيما إذا كان ملف تعريف الارتباط يجب أن يتوفر عبر بروتوكول HTTP/S‏‏‏‏ ويجب ألا يتوفر للغات البرمجة من جهة العميل مثل جافاسكربت، وهذا الخيار متوفر من الإصدار 5.2 ومابعده‏‏
			</td>
		</tr>
</tbody></table>
<p>
	ملف تعريف ارتباط HTTP هو جزء بيانات صغير يُرسل من موقع ما ويُخزَّن على حاسوب المستخدم من قبل متصفح ويب العميل أثناء تصفح المستخدم لمواقع الإنترنت.
</p>

<h3>
	تعديل ملف تعريف الارتباط
</h3>

<p>
	يمكن أن تُعدَّل قيمة ملف تعريف الارتباط (cookie) بإعادة ضبط الملف، بفرض لدينا ملف تعريف ارتباط باسم "user":
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_25" style="">
<span class="pln">setcookie</span><span class="pun">(</span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">86400</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">);</span></pre>

<p>
	ملفات تعريف الارتباط هي جزء من ترويسة HTTP، لذا يجب أن تُستدعى <code>setcookie()‎</code> قبل أن يُرسل أي خرج إلى المتصفح.
</p>

<p>
	تأكد عند تعديل ملف الارتباط أنّ المعاملات <code>path</code> و<code>domain</code> للدالة <code>setcookie()‎</code> تطابق ملف تعريف الارتباط الموجود وإلا سيُنشأ ملف جديد.
</p>

<p>
	سيُشفَّر قسم القيمة من ملف تعريف الارتباط تلقائيًا عند إرساله وعندما يُستقبل سيُفك تشفيره ويُسند إلى متغير بنفس اسم الملف.
</p>

<h3>
	ضبط ملف تعريف الارتباط
</h3>

<p>
	يُضبط ملف تعريف الارتباط باستخدام الدالة <code>setcookie()‎</code>، وبما أنّ ملفات تعريف الارتباط جزء من ترويسة HTTP فيجب أن تُضبط قبل إرسال أي خرج إلى المتصفح، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_27" style="">
<span class="pln">setcookie</span><span class="pun">(</span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Tom"</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">86400</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">);</span></pre>

<p>
	الوصف:
</p>

<ul>
<li>
		أنشئ ملف تعريف ارتباط بالاسم <code>user</code>
	</li>
	<li>
		قيمة الملف <code>Tom</code> (معامل اختياري)
	</li>
	<li>
		ستنتهي صلاحية هذا الملف بعد يوم واحد (86400 ثانية) (معامل اختياري)
	</li>
	<li>
		يتوفر الملف على كامل الموقع <code>/</code> (معامل اختياري)
	</li>
	<li>
		يُرسل الملف عبر HTTPS فقط (معامل اختياري)
	</li>
	<li>
		لا يمكن للغات البرمجة من جهة العميل مثل جافاسكربت الوصول لهذا الملف (معامل اختياري)
	</li>
</ul>
<p>
	يمكن الوصول لملف تعريف الارتباط المُنشأ أو المُعدَّل في الطلبات اللاحقة فقط (عند تطابق المسار والمجال) لأنّ المتغير ذو النطاق العام العالي <code>‎$_COOKIE</code> لا يُملأ بالبيانات الجديدة مباشرةً.
</p>

<h3>
	التحقق من ضبط ملف تعريف ارتباط
</h3>

<p>
	يمكن استخدام الدالة <code>isset()‎</code> للمتغير ذو النطاق العام العالي <code>‎$_COOKIE</code> للتحقق من ضبط ملف تعريف ارتباط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_29" style="">
<span class="com">// PHP &lt;7.0</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ضُبط ملف تعريف الارتباط</span><span class="pln">
    echo </span><span class="str">'User is '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $_COOKIE</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لم يُضبط ملف تعريف الارتباط</span><span class="pln">
    echo </span><span class="str">'User is not logged in'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// PHP 7.0+</span><span class="pln">
echo </span><span class="str">'User is '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $_COOKIE</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> </span><span class="str">'User is not logged in'</span><span class="pun">;</span></pre>

<h3>
	حذف ملف تعريف ارتباط
</h3>

<p>
	يمكنك ضبط الختم الزمني لصلاحية ملف تعريف الارتباط إلى وقت ما في الماضي ليُحذف هذا الملف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_31" style="">
<span class="pln">setcookie</span><span class="pun">(</span><span class="str">'user'</span><span class="pun">,</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3600</span><span class="pun">,</span><span class="pln"> </span><span class="str">'/'</span><span class="pun">);</span></pre>

<p>
	تأكد عند حذف ملف تعريف ارتباط من توافق المعاملات <code>path</code> و<code>domain</code> للدالة <code>setcookie()‎</code> مع معلومات الملف الذي تريد حذفه وإلا سيُنشأ ملف تعريف ارتباط جديد تنتهي صلاحيته مباشرةً.
</p>

<p>
	ومن الجيّد أيضًا أن تلغي قيمة المتغير <code>‎$_COOKIE</code> في حال كانت الصفحة الحالية تستخدمه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_33" style="">
<span class="pln">unset</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">]);</span></pre>

<h3>
	استعادة ملف تعريف ارتباط
</h3>

<p>
	<strong>استعادة وعرض ملف تعريف ارتباط اسمه User</strong>
</p>

<p>
	يمكن أن نستعيد قيمة ملف تعريف ارتباط باستخدام المتغير العام <code>‎$_COOKIE</code>، فمثلًا إذا كان لدينا ملف تعريف ارتباط اسمه <code>user</code> نستعيده بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_35" style="">
<span class="pln">echo $_COOKIE</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">];</span></pre>

<h2>
	عميل بروتوكول SOAP (‏Simple Object Access Protocol)
</h2>

<p>
	المعاملات التي تأخذها الدالة <code>SoapClient</code> هي:
</p>

<table><tbody>
<tr>
<td>
				<strong>المعامل</strong>
			</td>
			<td>
				<strong>تفاصيل</strong>
			</td>
		</tr>
<tr>
<td>
				<code>‎</code>$wsdl
			</td>
			<td>
				رابط WSDL (اختصار إلى Web Services Description Language أو NULL إذا كنا نستخدم النمط non-WSDL
			</td>
		</tr>
<tr>
<td>
				<code>‎</code>$options
			</td>
			<td>
				مصفوفة خيارات للصنف SoapClient‏‏. يتطلب النمط Non-WSDL‎ ضبط كل من location و uri، وكل الخيارات الأخرى اختيارية
			</td>
		</tr>
</tbody></table>
<h3>
	النمط WSDL
</h3>

<p>
	ننشئ كائنًا جديدًا من الصنف <code>SoapClient</code> ونمرر رابط ملف WSDL ومصفوفة خيارات اختيارية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_37" style="">
<span class="com">// WSDL إنشاء كائن عميل جديد باستخدام رابط</span><span class="pln">
$soap </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SoapClient</span><span class="pun">(</span><span class="str">'https://example.com/soap.wsdl'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="com">// هذه المصفوفة وقيمها اختيارية</span><span class="pln">
    </span><span class="str">'soap_version'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> SOAP_1_2</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'compression'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> SOAP_COMPRESSION_ACCEPT </span><span class="pun">|</span><span class="pln">             SOAP_COMPRESSION_GZIP</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'cache_wsdl'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> WSDL_CACHE_BOTH</span><span class="pun">,</span><span class="pln">

    </span><span class="com"># تساعد هذه الخيارات في تنقيح الأخطاء</span><span class="pln">
    </span><span class="str">'trace'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> TRUE</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'exceptions'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> TRUE
</span><span class="pun">]);</span></pre>

<p>
	ثم نستخدم الكائن <code>‎$soap</code> لاستدعاء توابع SOAP.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_39" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> $soap</span><span class="pun">-&gt;</span><span class="pln">requestData</span><span class="pun">([</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">]);</span></pre>

<h3>
	النمط Non-WSDL
</h3>

<p>
	يشبه هذا النمط النمط السابق إلا أننا نمرر <code>NULL</code> مكان ملف WSDL ويجب أن نتأكد من ضبط الخيارات <code>location</code> و<code>uri</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_41" style="">
<span class="pln">$soap </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SoapClient</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'location'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'https://example.com/soap/endpoint'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'uri'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'namespace'</span><span class="pln">
</span><span class="pun">]);</span></pre>

<h3>
	خرائط الصنف (Classmaps)
</h3>

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

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_43" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyAddress</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $country</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $city</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $full_name</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $postal_code</span><span class="pun">;</span><span class="pln"> </span><span class="com">// or zip_code</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $house_number</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyBook</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $author</span><span class="pun">;</span><span class="pln">
    </span><span class="com">// SOAP بإضافة دوال مفيدة إلى الكائنات المُعادة من عمليات classmap يسمح لنا</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getShortDescription</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"{$this-&gt;name}, written by {$this-&gt;author}"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$soap_client </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SoapClient</span><span class="pun">(</span><span class="pln">$link_to_wsdl</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
</span><span class="com">// Other parameters</span><span class="pln">
    </span><span class="str">"classmap"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="com">// ‫ يعيد الصنف كسلسلة نصية ‎::class</span><span class="pln">
        </span><span class="str">"Address"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">MyAddress</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> 
        </span><span class="str">"Book"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">MyBook</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">]</span><span class="pln">
</span><span class="pun">]);</span></pre>

<p>
	بعد ضبط خريطة الصنف، عندما تجري عملية معينة تعيد النوع <code>Address</code> أو <code>Book</code> فإنّ <code>SoapClient</code> ينشئ نسخة من ذلك الصنف ويملأ الحقول بالبيانات ويعيده عند استدعاء العملية.
</p>

<p>
	بفرض لدينا التابع <code>getAddress(1234)‎</code> يعيد كائن <code>Address</code> وفقًا للمعرّف (ID) الموجود في قاعدة البيانات والتابع <code>getBook(1234)‎</code> يعيد كائن <code>Book</code> وفقًا للمعرّف (ID) الموجود في قاعدة البيانات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_45" style="">
<span class="pln">$address </span><span class="pun">=</span><span class="pln"> $soap_client</span><span class="pun">-&gt;</span><span class="pln">getAddress</span><span class="pun">(</span><span class="lit">1234</span><span class="pun">);</span><span class="pln">

</span><span class="com">// (1)</span><span class="pln">
echo $address</span><span class="pun">-&gt;</span><span class="pln">country</span><span class="pun">;</span><span class="pln">

$book </span><span class="pun">=</span><span class="pln"> $soap_client</span><span class="pun">-&gt;</span><span class="pln">getBook</span><span class="pun">(</span><span class="lit">124</span><span class="pun">);</span><span class="pln">

</span><span class="com">// (2)</span><span class="pln">
echo $book</span><span class="pun">-&gt;</span><span class="pln">getShortDescription</span><span class="pun">();</span><span class="pln">

</span><span class="com">// (3)</span><span class="pln">
$author </span><span class="pun">=</span><span class="pln"> $soap_client</span><span class="pun">-&gt;</span><span class="pln">getAuthor</span><span class="pun">(</span><span class="lit">1234</span><span class="pun">);</span><span class="pln">

</span><span class="com">// (4)</span><span class="pln">
echo $author</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span></pre>

<p>
	في الموضع (1) أصبح المتغير <code>‎$address‎</code> من النوع <code>MyAddress</code> وذلك حسب <code>classmap</code>. في الموضع (2) لا يمكننا استخدام دوال أخرى معرفة في الصنف <code>MyBook</code>. في الموضع (3) أي نوع معرف في WSDL غير معرف في <code>classmap</code> سيصبح كائن <code>StdClass</code> عادي. في الموضع (4) لا يوجد خريطة صنف للنوع <code>Author</code> لذا فإنّ <code>‎$author</code> هو <code>StdClass</code> عادي، أي لا يزال بإمكاننا الوصول للحقول لكن دون استكمال تلقائي ولا دوال مخصصة لتعريف الكائنات.
</p>

<h3>
	تتبع طلب ورد SOAP
</h3>

<p>
	قد نحتاج أحيانًا لتتبع ما الذي يُرسل ويُستقبل في طلب SOAP، تعيد التوابع التالية صيغة XML الموجودة في الطلب والرد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_47" style="">
<span class="typ">SoapClient</span><span class="pun">::</span><span class="pln">__getLastRequest</span><span class="pun">()</span><span class="pln">
</span><span class="typ">SoapClient</span><span class="pun">::</span><span class="pln">__getLastRequestHeaders</span><span class="pun">()</span><span class="pln">
</span><span class="typ">SoapClient</span><span class="pun">::</span><span class="pln">__getLastResponse</span><span class="pun">()</span><span class="pln">
</span><span class="typ">SoapClient</span><span class="pun">::</span><span class="pln">__getLastResponseHeaders</span><span class="pun">()</span></pre>

<p>
	لنفرض مثلًا أنه لدينا الثابت <code>ENVIRONMENT</code> وعندما تُضبط قيمته لتكون <code>DEVELOPMENT</code> فإننا نريد طباعة كل المعلومات إذا رمى استدعاء التابع <code>getAddress</code> خطأً، يمكن أن يكون الحل كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_49" style="">
<span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $address </span><span class="pun">=</span><span class="pln"> $soap_client</span><span class="pun">-&gt;</span><span class="pln">getAddress</span><span class="pun">(</span><span class="lit">1234</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">SoapFault</span><span class="pln"> $e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ENVIRONMENT </span><span class="pun">===</span><span class="pln"> </span><span class="str">'DEVELOPMENT'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        var_dump</span><span class="pun">(</span><span class="pln">
            $soap_client</span><span class="pun">-&gt;</span><span class="pln">__getLastRequestHeaders</span><span class="pun">()</span><span class="pln">
            $soap_client</span><span class="pun">-&gt;</span><span class="pln">__getLastRequest</span><span class="pun">(),</span><span class="pln">
            $soap_client</span><span class="pun">-&gt;</span><span class="pln">__getLastResponseHeaders</span><span class="pun">(),</span><span class="pln">
            $soap_client</span><span class="pun">-&gt;</span><span class="pln">__getLastResponse</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	خادم SOAP أساسي
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_51" style="">
<span class="kwd">function</span><span class="pln"> test</span><span class="pun">(</span><span class="pln">$x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $x</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span><span class="pln"> 

$server </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SoapServer</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'uri'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"http://test-uri/"</span><span class="pun">));</span><span class="pln"> $server</span><span class="pun">-&gt;</span><span class="pln">addFunction</span><span class="pun">(</span><span class="str">"test"</span><span class="pun">);</span><span class="pln"> 
$server</span><span class="pun">-&gt;</span><span class="pln">handle</span><span class="pun">();</span></pre>

<h2>
	استخدام مكتبة cURL
</h2>

<table><tbody>
<tr>
<td>
				<strong>المعامل</strong>
			</td>
			<td>
				<strong>تفاصيل</strong>
			</td>
		</tr>
<tr>
<td>
				curl_init
			</td>
			<td>
				يهيئ جلسة cURL
			</td>
		</tr>
<tr>
<td>
				url
			</td>
			<td>
				الرابط الذي سيُستخدم في طلب cURL
			</td>
		</tr>
<tr>
<td>
				curl_setopt
			</td>
			<td>
				يضبط خيارًا لنقل cURL
			</td>
		</tr>
<tr>
<td>
				ch
			</td>
			<td>
				مُعالج cURL (يعيد قيمة من curl_init()<code>‎</code>) ‏
			</td>
		</tr>
<tr>
<td>
				option
			</td>
			<td>
				خيارات CURLOPT_XXX التي تريد ضبطها، يمكنك الاطلاع على لائحة الخيارات من <a href="http://php.net/manual/en/function.curl-setopt.php" rel="external nofollow">هنا</a> والقيم المقبولة
			</td>
		</tr>
<tr>
<td>
				value
			</td>
			<td>
				القيمة التي ستُضبط على معالِج cURL‎‎ للخيار المُعطى
			</td>
		</tr>
<tr>
<td>
				curl_exec
			</td>
			<td>
				يؤدي جلسة cURL
			</td>
		</tr>
<tr>
<td>
				ch
			</td>
			<td>
				مُعالج cURL (يعيد قيمة من curl_init()‎) ‏
			</td>
		</tr>
<tr>
<td>
				curl_close
			</td>
			<td>
				يغلق جلسة cURL
			</td>
		</tr>
<tr>
<td>
				ch
			</td>
			<td>
				مُعالج cURL (يعيد قيمة من curl_init()‎) ‏
			</td>
		</tr>
</tbody></table>
<h3>
	الاستخدام الأساسي (طلبات GET)
</h3>

<p>
	تعد <code>cURL</code> أداة لنقل البيانات بصياغة رابط (URL)، وتدعم <code>HTTP</code> و<code>FTP</code> و<code>SCP</code> والعديد من البروتوكولات الأخرى (بدءًا من الإصدار 7.19.4). تذكر أنّك تحتاج إلى <a href="https://www.php.net/manual/en/curl.installation.php" rel="external nofollow">تنصيب وتمكين إضافة <code>cURL</code> لاستخدامها</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_54" style="">
<span class="com">// (1)</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">extension_loaded</span><span class="pun">(</span><span class="str">"curl"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">die</span><span class="pun">(</span><span class="str">"cURL extension not loaded! Quit Now."</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// بدء السكربت</span><span class="pln">
</span><span class="com">// (2)</span><span class="pln">
$curl </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">();</span><span class="pln">

</span><span class="com">// ضبط الرابط والخيارات الأخرى</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$curl</span><span class="pun">,</span><span class="pln"> CURLOPT_URL</span><span class="pun">,</span><span class="pln"> </span><span class="str">"http://www.example.com"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// تنفيذ وتمرير النتيجة إلى المتصفح</span><span class="pln">
curl_exec</span><span class="pun">(</span><span class="pln">$curl</span><span class="pun">);</span><span class="pln">

</span><span class="com">// cURL إغلاق مورد</span><span class="pln">
curl_close</span><span class="pun">(</span><span class="pln">$curl</span><span class="pun">);</span></pre>

<p>
	في الموضع (1) سكربت بسيط يفحص إن كانت إضافة <code>cURL</code> محمّلة أم لا. في الموضع (2) إنشاء مورد <code>cURL</code> جديد و<code>‎$curl</code> هو معالج المورد.
</p>

<h3>
	طلبات POST
</h3>

<p>
	يمكنك استخدام <code>cURL</code> إذا أردت محاكاة إجراء نموذج HTML يستخدم الطريقة <code>POST</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_56" style="">
<span class="com">// في مصفوفة POST بيانات</span><span class="pln">
$post </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'banana'</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// POST جديد مع رابط إلى cURL ننشئ مورد</span><span class="pln">
$ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">(</span><span class="str">'http://www.example.com'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// ليقرأ الخرج CURLOPT_RETURNTRANSFER نضبط المعامل</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_RETURNTRANSFER</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// POST نمرر بيانات</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_POSTFIELDS</span><span class="pun">,</span><span class="pln"> $post</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $response ننفذ الطلب ونحصل على الخرج في المتغير</span><span class="pln">
$response </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">

</span><span class="com">// نغلق الاتصال</span><span class="pln">
curl_close</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span></pre>

<h3>
	استخدام ملفات تعريف الارتباط
</h3>

<p>
	يمكن لمكتبة <code>cURL</code> أن تحافظ على ملفات تعريف الارتباط المستقبَلة في الردود للاستخدام مع الطلبات اللاحقة، نحقق هذا بسطر شيفرة واحد من أجل ملف تعريف ارتباط جلسة بسيط في الذاكرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_58" style="">
<span class="pln">curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_COOKIEFILE</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span></pre>

<p>
	في الحالات التي يكون مطلوب فيها الحفاظ على ملفات تعريف الارتباط بعدأن يُدمَّر مُعالِج <code>cURL</code> يمكنك وصف ملف لتخزينها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_60" style="">
<span class="pln">curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_COOKIEJAR</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/tmp/cookies.txt"</span><span class="pun">);</span></pre>

<p>
	وعندما تحتاج استخدامها ثانيةً تمررها كملف تعريف ارتباط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_62" style="">
<span class="pln">curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_COOKIEFILE</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/tmp/cookies.txt"</span><span class="pun">);</span></pre>

<p>
	ومع ذلك تذكر أنّك لا تحتاج هاتين الخطوتين إذا لم تكن تريد حمل ملفات تعريف الارتباط بين معالجات <code>cURL</code> المختلفة، إذ أنّ ما تحتاجه في معظم الحالات هو ضبط <code>CURLOPT_COOKIEFILE</code> إلى سلسلة فارغة.
</p>

<p>
	يمكن أن تستخدم معالجة ملف تعريف الارتباط لاستعادة موارد من موقع إنترنت يتطلب تسجيل دخول مثلًا، يكون هذا الإجراء من خطوتين عادةً، الأولى إرسال البيانات بالطريقة <code>POST</code> إلى صفحة تسجيل الدخول:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_64" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// cURL إنشاء معالج</span><span class="pln">
$ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">();</span><span class="pln">

</span><span class="com">// (curl_init() ضبط الرابط (أو يمكن تمريره إلى</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_URL</span><span class="pun">,</span><span class="pln"> </span><span class="str">"https://www.example.com/login.php"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// POST لتكون HTTP ضبط طريقة</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_POST</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// يمكّن ضبط هذا الخيار إلى سلسلة فارغة معالجة ملف تعريف الارتباط لكنه لا يحمّله من ملف</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_COOKIEFILE</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln">

</span><span class="com">// ضبط القيم التي نريد إرسالها</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_POSTFIELDS</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">"username"</span><span class="pun">=&gt;</span><span class="str">"joe_bloggs"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"password"</span><span class="pun">=&gt;</span><span class="str">"$up3r_$3cr3t"</span><span class="pun">,</span><span class="pln">
</span><span class="pun">));</span><span class="pln">

</span><span class="com">// إعادة جسم الرد</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_RETURNTRANSFER</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// إرسال الطلب</span><span class="pln">
$result </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span></pre>

<p>
	الخطوة الثانية (بعد انتهاء فحص الخطأ القياسي) عادةً هي رد <code>GET</code> بسيط، الشيء المهم هو إعادة استخدام معالِج <code>cURL</code> الموجود للطلب الثاني، يضمن هذا أنّ ملفات إعادة الارتباط من الرد الأول ستُضمَّن تلقائيًا في الطلب الثاني.
</p>

<p>
	لن نستدعي <code>curl_init()‎</code> في الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_66" style="">
<span class="com">// تغيير الرابط</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_URL</span><span class="pun">,</span><span class="pln"> </span><span class="str">"https://www.example.com/show_me_the_foo.php"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// GET تغيير الطريقة إلى</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_HTTPGET</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// إرسال الطلب</span><span class="pln">
$result </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">

</span><span class="com">// cURL النهاية مع</span><span class="pln">
curl_close</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $result تستطيع هنا إضافة الشيفرة التي تريدها لمعالجة</span></pre>

<p>
	الشيفرة السابقة هي مجرد مثال عن معالجة ملف تعريف ارتباط ?أما في التطبيقات العملية تكون الأمور أكثر تعقيدًا، يجب أن تنفّذ عادةً طلب <code>GET</code> أولي لصفحة تسجيل الدخول لتسحب مفتاح تسجيل الدخول الذي تحتاج تضمينه في طلب <code>POST</code>. قد تعطّل بعض المواقع عميل <code>cURL</code> المعتمد على سلسلة نصية لوكيل المستخدم مما يتطلب منك تغييرها.
</p>

<h3>
	استخدام multi_curl لإرسال عدة طلبات POST
</h3>

<p>
	قد نحتاج أحيانًا إجراء عدة طلبات <code>POST</code> لنقطة نهائية (endpoint) واحدة أو أكثر، يمكننا استخدام <code>multi_curl</code> للتعامل مع هذه الحالة.
</p>

<p>
	ننشئ في البداية عدد الطلبات الذي نحتاجه بنفس طريقة المثال البسيط السابق ونضعها في مصفوفة، نستخدم <code>curl_multi_init</code> ونضيف معالِج لكل منها.
</p>

<p>
	نستخدم في المثال التالي نقطتين نهائيتين:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_68" style="">
<span class="com">// POST مصفوفة بيانات لإرسالها بالطريقة</span><span class="pln">
$request_contents </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// مصفوفة روابط</span><span class="pln">
$urls </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// cURL مصفوفة معالجات</span><span class="pln">
$chs </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">//الأول $request_contents محتوى المصفوفة</span><span class="pln">
$request_contents</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'banana'</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// الثاني $request_contents محتوى المصفوفة</span><span class="pln">
$request_contents</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'fish'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'shrimp'</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// ضبط الروابط</span><span class="pln">
$urls</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'http://www.example.com'</span><span class="pun">;</span><span class="pln">
$urls</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'http://www.example2.com'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// multi_curl وإضافتهم إلى cURL إنشاء مصفوفة من معالجات</span><span class="pln">
$mh </span><span class="pun">=</span><span class="pln"> curl_multi_init</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$urls </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $url</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">(</span><span class="pln">$url</span><span class="pun">);</span><span class="pln">
    curl_setopt</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> CURLOPT_RETURNTRANSFER</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
    curl_setopt</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> CURLOPT_POST</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
    curl_setopt</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> CURLOPT_POSTFIELDS</span><span class="pun">,</span><span class="pln"> $request_contents</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]);</span><span class="pln">
    curl_multi_add_handle</span><span class="pun">(</span><span class="pln">$mh</span><span class="pun">,</span><span class="pln"> $chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعدها نستخدم <code>curl_multi_exec</code> لإرسال الطلبات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_70" style="">
<span class="com">// تنفيذ الطلبات</span><span class="pln">
$running </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    curl_multi_exec</span><span class="pun">(</span><span class="pln">$mh</span><span class="pun">,</span><span class="pln"> $running</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// الحصول على الردود</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">array_keys</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $key</span><span class="pun">){</span><span class="pln">
    $error </span><span class="pun">=</span><span class="pln"> curl_error</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]);</span><span class="pln">
    $last_effective_URL </span><span class="pun">=</span><span class="pln"> curl_getinfo</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> CURLINFO_EFFECTIVE_URL</span><span class="pun">);</span><span class="pln">
    $time </span><span class="pun">=</span><span class="pln"> curl_getinfo</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> CURLINFO_TOTAL_TIME</span><span class="pun">);</span><span class="pln">
    $response </span><span class="pun">=</span><span class="pln"> curl_multi_getcontent</span><span class="pun">(</span><span class="pln">$chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// get results</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$error</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"The request $key return a error: $error"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"The request to '$last_effective_URL' returned '$response' in $time seconds."</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    curl_multi_remove_handle</span><span class="pun">(</span><span class="pln">$mh</span><span class="pun">,</span><span class="pln"> $chs</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// إغلاق المعالِج الحالي</span><span class="pln">
curl_multi_close</span><span class="pun">(</span><span class="pln">$mh</span><span class="pun">);</span></pre>

<p>
	يمكن أن يعيد هذا المثال التالي:
</p>

<ul>
<li>
		يعيد الطلب إلى 'http://www.example.com' القيمة 'fruits' في ثانيتين.
	</li>
	<li>
		يعيد الطلب إلى 'http://www.example2.com' القيمة 'seafood' في 5 ثواني.
	</li>
</ul>
<h3>
	إرسال بيانات متعددة الأبعاد وعدة ملفات في طلب واحد باستخدام cURL
</h3>

<p>
	بفرض لدينا نموذج كما في الصورة، ونريد إرسال البيانات إلى خادم الويب الخاص بنا عبر <code>AJAX</code> ومن هناك إلى سكربت يُنفَّذ على خادم خارجي.
</p>

<p>
	لدينا مدخلات عادية وحقل متعدد الخيارات وحقل إرفاق ملف حيث يمكننا تحميل عدة ملفات.
</p>

<p>
	بفرض نجاح طلب <code>AJAX POST</code> نحصل على البيانات التالية في الموقع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_72" style="">
<span class="com">// print_r($_POST)</span><span class="pln">

</span><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">first_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">John</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">last_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Doe</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">activities</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
    </span><span class="pun">(</span><span class="pln">
        </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> soccer
        </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> hiking
    </span><span class="pun">)</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	وتبدو الملفات كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_74" style="">
<span class="com">// print_r($_FILES)</span><span class="pln">
</span><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">upload</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
    </span><span class="pun">(</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> my_photo</span><span class="pun">.</span><span class="pln">jpg
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> my_life</span><span class="pun">.</span><span class="pln">pdf
        </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">type</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> image</span><span class="pun">/</span><span class="pln">jpg
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> application</span><span class="pun">/</span><span class="pln">pdf
        </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">tmp_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">phpW5spji
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">phpWgnUeY
        </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">error</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">[</span><span class="pln">size</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(‎</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">647548</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">643223</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">)</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	نريد الآن إرسال هذه البيانات والملفات إلى خادم خارجي باستخدام <code>cURL</code> مع الصنف <code>CurlFile</code>، وبما أنّ <code>cURL</code> تقبل مصفوفة بسيطة فقط وليس مصفوفة متعددة الأبعاد فيجب أن نستخدم مصفوفة <code>‎$_POST</code> أولًا.
</p>

<p>
	نستخدم <a href="https://codereview.stackexchange.com/questions/14671/flaten-array-to-1d-and-assigning-associative-keynames-recursively/14685#14685" rel="external nofollow">هذه الدالة مثلًا</a> للقيام بذلك مما يعطيك الخرج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_76" style="">
<span class="com">// print_r($new_post_array)</span><span class="pln">

</span><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">first_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">John</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">last_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Doe</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">activities</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> soccer
    </span><span class="pun">[</span><span class="pln">activities</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> hiking
</span><span class="pun">)</span></pre>

<p>
	الخطوة التالية هي إنشاء كائنات <code>CurlFile</code> للملفات المحمّلة باستخدام الحلقة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_78" style="">
<span class="pln">$files </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"upload"</span><span class="pun">][</span><span class="str">"error"</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $error</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$error </span><span class="pun">==</span><span class="pln"> UPLOAD_ERR_OK</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $files</span><span class="pun">[</span><span class="str">"upload[$key]"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> curl_file_create</span><span class="pun">(</span><span class="pln">
        $_FILES</span><span class="pun">[</span><span class="str">'upload'</span><span class="pun">][</span><span class="str">'tmp_name'</span><span class="pun">][</span><span class="pln">$key</span><span class="pun">],</span><span class="pln">
        $_FILES</span><span class="pun">[</span><span class="str">'upload'</span><span class="pun">][</span><span class="str">'type'</span><span class="pun">][</span><span class="pln">$key</span><span class="pun">],</span><span class="pln">
        $_FILES</span><span class="pun">[</span><span class="str">'upload'</span><span class="pun">][</span><span class="str">'name'</span><span class="pun">][</span><span class="pln">$key</span><span class="pun">]</span><span class="pln">
        </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الدالة <code>curl_file_create</code> مساعدة للصنف <code>CurlFile</code> وتنشئ كائنات <code>CurlFile</code>، نحفظ هذه الكائنات في المصفوفة <code>‎$files</code> مع مفاتيح بالأسماء "upload[0]‎" و"upload[1]‎" لملفينا.
</p>

<p>
	نحتاج الآن لجمع المصفوفة المعدَّلة مع مصفوفة الملفات ونحفظها في <code>‎$data</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_80" style="">
<span class="pln">$data </span><span class="pun">=</span><span class="pln"> $new_post_array </span><span class="pun">+</span><span class="pln"> $files</span><span class="pun">;</span></pre>

<p>
	الخطوة الأخيرة هي إرسال طلب <code>cURL</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_82" style="">
<span class="pln">$ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">();</span><span class="pln">

curl_setopt_array</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    CURLOPT_POST </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    CURLOPT_URL </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"https://api.externalserver.com/upload.php"</span><span class="pun">,</span><span class="pln">
    CURLOPT_RETURNTRANSFER </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    CURLINFO_HEADER_OUT </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    CURLOPT_POSTFIELDS </span><span class="pun">=&gt;</span><span class="pln"> $data
</span><span class="pun">));</span><span class="pln">

$result </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">

curl_close </span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span></pre>

<p>
	بما أنّ <code>‎$data</code> هي مصفوفة بسيطة (مسطّحة) فإنّ <code>cURL</code> ترسل هذا الطلب بالطريقة <code>POST</code> مع نوع المحتوى <code>multipart/form-data</code> ويمكنك الحصول على المعلومات والملفات المرسلة مع <code>‎$_POST</code> و<code>‎$_FILES‎</code> في الملف <code>upload.php</code> على الخادم الخارجي كما تفعل عادةً.
</p>

<h3>
	إنشاء وإرسال طلب مع طريقة مخصصة
</h3>

<p>
	تدعم <code>cURL</code> افتراضيًا طلبات <code>GET</code> و<code>POST</code> ومن الممكن أيضًا إرسال طلبات بطرق مخصصة مثل <code>DELETE</code> أو<code>PUT</code> أو<code>PATCH</code> (أو حتى طرق غير معيارية) باستخدام المعامل <code>CURLOPT_CUSTOMREQUEST</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_84" style="">
<span class="com">// DELETE إنشاء طلب</span><span class="pln">
$method </span><span class="pun">=</span><span class="pln"> </span><span class="str">'DELETE'</span><span class="pun">;</span><span class="pln">

$ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">(</span><span class="pln">$url</span><span class="pun">);</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_RETURNTRANSFER</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_CUSTOMREQUEST</span><span class="pun">,</span><span class="pln"> $method</span><span class="pun">);</span><span class="pln">
$content </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">
curl_close</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span></pre>

<h3>
	ترويسات HTTP المخصصة Get وSet في PHP
</h3>

<p>
	<strong>إرسال ترويسة الطلب</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_86" style="">
<span class="pln">$uri </span><span class="pun">=</span><span class="pln"> </span><span class="str">'http://localhost/http.php'</span><span class="pun">;</span><span class="pln">

$ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">(</span><span class="pln">$uri</span><span class="pun">);</span><span class="pln">
curl_setopt_array</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    CURLOPT_HTTPHEADER </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'X-User: admin'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'X-Authorization: 123456'</span><span class="pun">),</span><span class="pln">
    CURLOPT_RETURNTRANSFER </span><span class="pun">=&gt;</span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
    CURLOPT_VERBOSE </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="pun">));</span><span class="pln">
$out </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">
curl_close</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">
</span><span class="com">// طباعة خرج الرد</span><span class="pln">
echo $out</span><span class="pun">;</span></pre>

<p>
	<strong>قراءة الترويسة المخصصة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_88" style="">
<span class="pln">print_r</span><span class="pun">(</span><span class="pln">apache_request_headers</span><span class="pun">());</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_90" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="typ">Host</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> localhost
    </span><span class="pun">[</span><span class="typ">Accept</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">*</span><span class="com">/*
    [X-User] =&gt; admin
    [X-Authorization] =&gt; 123456
    [Content-Length] =&gt; 9
    [Content-Type] =&gt; application/x-www-form-urlencoded
)</span></pre>

<p>
	يمكننا أيضًا إرسال الترويسة باستخدام الصياغة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5773_92" style="">
<span class="pln">curl </span><span class="pun">--</span><span class="pln">header </span><span class="str">"X-MyHeader: 123"</span><span class="pln"> www</span><span class="pun">.</span><span class="pln">google</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [SOAP Client - SOAP Server - Using cURL in PHP - Sessions - Cookies] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D9%81%D8%B6%D8%A7%D8%A1-%D8%A7%D9%84%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-namespaces-%D9%81%D9%8A-php-r1082/" rel="">فضاء الأسماء (namespaces) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%B3%D9%84%D8%A9-serialization-%D9%81%D9%8A-php-r1080/" rel="">السلسلة Serialization في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1081</guid><pubDate>Fri, 04 Dec 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x633;&#x644;&#x633;&#x644;&#x629; Serialization &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%B3%D9%84%D8%A9-serialization-%D9%81%D9%8A-php-r1080/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/15.png.60eae34ebf9ba2608a025c383c0c6325.png" /></p>

<p>
	الدالة <code>serialize()‎</code> في PHP لها الشكل العام التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_7" style="">
<span class="pln">serialize </span><span class="pun">(</span><span class="pln"> mixed $value </span><span class="pun">)</span></pre>

<p>
	يعبّر المعامل <code>value</code> عن القيمة التي نريد سَلسَلتها، تعالج الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/serialize%E2%80%8F" rel=""><code>serialize()‎</code></a> كل الأنواع، عدا <a href="https://www.php.net/manual/en/language.types.resource.php" rel="external nofollow">الأنواع الموردية</a> (resource-type)، كما يمكنك سَلسَلة المصفوفات التي تحتوي مراجع إلى نفسها، المراجع الدائرية داخل المصفوفة/الكائن التي تُسلسلها ستُخزَّن أيضًا وأي مرجع آخر سيُفقد. تحاول PHP عند سَلسَلة الكائن استدعاء الدالة <code>‎__sleep()‎</code> قبل القيام بالسَلسَلة وذلك للسماح للكائن بالقيام بالتنظيف حتى اللحظة الأخيرة قبل بدء السَلسَلة. وكذلك عند استعادة كائن باستخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/unserialize" rel=""><code>unserialize()‎</code></a> تُستدعى الدالة <code>‎__wakeup()‎</code>. يكون لأعضاء الكائن الخاصة اسم الصنف ملحقًا باسم العضو، وللأعضاء المحمية العلامة '*' ملحقًا باسم العضو. تحتوي هذه القيم المُلحقة على وحدات بايت فارغة على كلا الجانبين.
</p>

<h2>
	سَلسَلة أنواع مختلفة
</h2>

<p>
	تولّد تمثيلًا قابلًا للتخزين لقيمة ما، ويعدّ هذا مفيدًا لتخزين أو تمرير قيم PHP دون خسارة نوعها وبنيتها.
</p>

<p>
	نستخدم <code>unserialize()‎</code> لنعيد السلسلة النصية المُسَلسَلة إلى قيمة PHP من جديد.
</p>

<p>
	<strong>سَلسَلة سلسلة نصية</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_9" style="">
<span class="pln">$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello world"</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">);</span><span class="pln">

</span><span class="com">// s:11:"Hello world";</span></pre>

<p>
	<strong>سَلسَلة قيمة عشرية</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_11" style="">
<span class="pln">$double </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$double</span><span class="pun">);</span><span class="pln">

</span><span class="com">// d:1.5;</span></pre>

<p>
	<strong>سَلسَلة عدد صحيح</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_13" style="">
<span class="pln">$integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">65</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$integer</span><span class="pun">);</span><span class="pln">

</span><span class="com">// i:65;</span></pre>

<p>
	<strong>سَلسَلة قيمة منطقية</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_15" style="">
<span class="pln">$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$boolean</span><span class="pun">);</span><span class="pln">

</span><span class="com">// b:1;</span><span class="pln">

$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$boolean</span><span class="pun">);</span><span class="pln">

</span><span class="com">// b:0;</span></pre>

<p>
	<strong>سَلسَلة القيمة null</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_17" style="">
<span class="pln">$null </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$null</span><span class="pun">);</span><span class="pln">

</span><span class="com">// N;</span></pre>

<p>
	<strong>سَلسَلة مصفوفة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_19" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="lit">25</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'String'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'Array'</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Multi Dimension'</span><span class="pun">,</span><span class="str">'Array'</span><span class="pun">],</span><span class="pln">
    </span><span class="str">'boolean'</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
    </span><span class="com">// ‫‎⁢$obj من المثال في الأعلى</span><span class="pln">
    </span><span class="str">'Object'</span><span class="pun">=&gt;</span><span class="pln">$obj</span><span class="pun">,</span><span class="pln">
    </span><span class="kwd">null</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">3.445</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
سيرمي هذا خطأً فادحًا 
$array['function'] = function() { return "function"; };
*/</span><span class="pln">

echo serialize</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="com">// a:7:{i:0;i:25;i:1;s:6:"String";s:5:"Array";a:2:{i:0;s:15:"Multi</span><span class="pln">
</span><span class="typ">Dimension</span><span class="str">";i:1;s:5:"</span><span class="typ">Array</span><span class="str">";}s:7:"</span><span class="kwd">boolean</span><span class="str">";b:1;s:6:"</span><span class="typ">Object</span><span class="str">";O:3:"</span><span class="pln">abc</span><span class="str">":1:{s:1:"</span><span class="pln">i</span><span class="str">";i:1;}i:2;N;i:3;d:3.4449999999999998;}</span></pre>

<p>
	<strong>سَلسَلة كائن</strong>
</p>

<p>
	تحاول PHP عند سَلسَلة كائن استدعاء الدالة <code>‎__sleep()‎</code> قبل القيام بالسَلسَلة وذلك للسماح للكائن بالقيام بالتنظيف حتى اللحظة الأخيرة قبل بدء السَلسَلة. وكذلك عند استعادة كائن باستخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/unserialize" rel="">unserialize()‎</a> تُستدعى الدالة <code>‎__wakeup()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_21" style="">
<span class="kwd">class</span><span class="pln"> abc </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> $i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'hello world'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> abc</span><span class="pun">();</span><span class="pln">
echo serialize</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">);</span><span class="pln">

</span><span class="com">// O:3:"abc":1:{s:1:"i";i:1;}</span></pre>

<p>
	<strong>لاحظ أنّه لا يمكن سَلسَلة المغلِّفات (Closures)</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_23" style="">
<span class="pln">$function </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> echo </span><span class="str">'Hello World!'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
$function</span><span class="pun">();</span><span class="pln"> </span><span class="com">// prints "hello!"</span><span class="pln">
$serializedResult </span><span class="pun">=</span><span class="pln"> serialize</span><span class="pun">(</span><span class="pln">$function</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">// Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'</span></pre>

<h2>
	مشاكل الحماية مع فك السَلسَلة
</h2>

<p>
	يمكن أن يكون استخدام الدالة <code>unserialize</code> لفك سَلسَلة دخل المستخدم خطيرًا.
</p>

<p>
	<strong>تحذير: </strong>لا تمرّر دخل المستخدم غير الموثوق به للدالة <code>unserialize</code>، يمكن أن يؤدي فك السَلسَلة إلى تحميل التعليمات البرمجية وتنفيذها بسبب استنساخ الكائن والتحميل التلقائي وقد يتمكن المستخدم الضار من استغلال ذلك. استخدم تنسيق تبادل بيانات قياسي مثل <code>JSON</code> (باستخدام json_decode()‎ وjson_encode()‎) إذا كنت تحتاج إلى تمرير بيانات مسَلسَلة إلى المستخدم.
</p>

<p>
	<strong>الهجمات الممكنة: حقن كائن PHP</strong>
</p>

<p>
	ثغرة على مستوى التطبيق يمكن أن تسمح للمهاجم بأداء أنواع مختلفة من الهجمات الخبيثة مثل حقن الشيفرة وحقن SQL واجتياز المسار (Path Traversal) وتطبيق حجب الخدمة (Denial of Service) بالاعتماد على السياق. تحدث الثغرة عندما لا يُعقَّم دخل المستخدم قبل تمريره إلى دالة <code>unserialize</code>. بما أنّ PHP تسمح بسَلسَلة الكائن، يمكن للمهاجمين تمرير سلاسل نصية مسَلسَلة مخصصة إلى استدعاء الدالة <code>unserialize</code> المعرضة للخطر مما يؤدي إلى حقن كائن (أو كائنات) PHP عشوائي في نطاق التطبيق.
</p>

<p>
	يجب تحقيق شرطين لاستغلال ثغرة حقن كائن PHP بنجاح:
</p>

<ul>
<li>
		أن يكون للتطبيق صنف ينفّذ تابع PHP سحري (مثل <code>‎__wakeup</code> أو <code>‎__destruct</code>) يمكن أن يُستخدم لتنفيذ هجمات ضارة أو بدء سلسلة POP (‏Property Oriented Programming).
	</li>
	<li>
		أن يُصرَّح عن جميع الأصناف المستخدمة خلال الهجوم عند استدعاء الدالة <code>unserialize</code> المعرضة للخطر وإلا يجب دعم التحميل التلقائي للصنف لمثل هذه الكائنات.
	</li>
</ul>
<p>
	<strong>مثال1 - هجوم اجتياز المسار (Path Traversal Attack):</strong>
</p>

<p>
	يظهر المثال التالي صنف PHP مع تابع <code>‎__destruct</code> القابل للاستغلال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_25" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Example1</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $cache_file</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ‫بعض الشيفرة هنا...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> __destruct</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $file </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/var/www/cache/tmp/{$this-&gt;cache_file}"</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">))</span><span class="pln"> </span><span class="lit">@unlink</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// ‫بعض الشيفرة هنا…</span><span class="pln">

$user_data </span><span class="pun">=</span><span class="pln"> unserialize</span><span class="pun">(</span><span class="pln">$_GET</span><span class="pun">[</span><span class="str">'data'</span><span class="pun">]);</span><span class="pln">

</span><span class="com">// ‫بعض الشيفرة هنا...</span></pre>

<p>
	قد يكون المهاجم في هذا المثال قادرًا على حذف ملف عشوائي عبر هجوم اجتياز المسار مثل طلب المسار التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_27" style="">
<span class="pln">http</span><span class="pun">:</span><span class="com">//testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}</span></pre>

<p>
	<strong>مثال2 - هجوم حقن الشيفرة (Code Injection attack):</strong>
</p>

<p>
	يظهر المثال التالي صنف PHP مع تابع <code>‎__wakeup</code> القابل للاستغلال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_29" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Example2</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $hook</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ‫بعض الشيفرة هنا...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> __wakeup</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">hook</span><span class="pun">))</span><span class="pln"> </span><span class="kwd">eval</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">hook</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// ‫بعض الشيفرة هنا…</span><span class="pln">

$user_data </span><span class="pun">=</span><span class="pln"> unserialize</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="str">'data'</span><span class="pun">]);</span><span class="pln">

</span><span class="com">// ‫بعض الشيفرة هنا...</span></pre>

<p>
	يمكن أن يكون المهاجم في هذا المثال قادرًا على القيام بهجوم حقن الشيفرة بإرسال طلب <code>HTTP</code> مثل الطلب التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_31" style="">
<span class="pln">GET </span><span class="pun">/</span><span class="pln">vuln</span><span class="pun">.</span><span class="pln">php HTTP</span><span class="pun">/</span><span class="lit">1.0</span><span class="pln">
</span><span class="typ">Host</span><span class="pun">:</span><span class="pln"> testsite</span><span class="pun">.</span><span class="pln">com
</span><span class="typ">Cookie</span><span class="pun">:</span><span class="pln">
data</span><span class="pun">=</span><span class="pln">O</span><span class="pun">%</span><span class="lit">3A8</span><span class="pun">%</span><span class="lit">3A</span><span class="pun">%</span><span class="lit">22Example2</span><span class="pun">%</span><span class="lit">22</span><span class="pun">%</span><span class="lit">3A1</span><span class="pun">%</span><span class="lit">3A</span><span class="pun">%</span><span class="lit">7Bs</span><span class="pun">%</span><span class="lit">3A14</span><span class="pun">%</span><span class="lit">3A</span><span class="pun">%</span><span class="lit">22</span><span class="pun">%</span><span class="lit">00Example2</span><span class="pun">%</span><span class="lit">00hook</span><span class="pun">%</span><span class="lit">22</span><span class="pun">%</span><span class="lit">3Bs</span><span class="pun">%</span><span class="lit">3A10</span><span class="pun">%</span><span class="lit">3A</span><span class="pun">%</span><span class="lit">22phpinfo</span><span class="pun">%</span><span class="lit">28</span><span class="pun">%</span><span class="lit">29</span><span class="pun">%</span><span class="pln">
</span><span class="lit">3B</span><span class="pun">%</span><span class="lit">22</span><span class="pun">%</span><span class="lit">3B</span><span class="pun">%</span><span class="lit">7D</span><span class="pln">
</span><span class="typ">Connection</span><span class="pun">:</span><span class="pln"> close</span></pre>

<p>
	حيث أُنشئ معامل ملف تعريف الارتباط "data" من قِبل السكربت التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_33" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Example2</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $hook </span><span class="pun">=</span><span class="pln"> </span><span class="str">"phpinfo();"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> urlencode</span><span class="pun">(</span><span class="pln">serialize</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Example2</span><span class="pun">));</span></pre>

<h2>
	سَلسَلة/ فك سَلسَلة كائن
</h2>

<p>
	تعيد الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/serialize" rel=""><code>serialize()‎</code></a> سلسلة نصية تتضمن تمثيل مجرى بايتات لأي قيمة يمكن تخزينها في PHP. يمكنك استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/unserialize%E2%80%8F" rel=""><code>unserialize()‎</code></a> لإعادة تكوين قيمة المتغير الأصلية.
</p>

<p>
	نكتب الشيفرة التالية لسَلسَلة (serialize) كائن:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_35" style="">
<span class="pln">serialize</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">);</span></pre>

<p>
	نكتب الشيفرة التالية لفك سَلسَلة (Unserialize) كائن:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_37" style="">
<span class="pln">unserialize</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">)</span></pre>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_39" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"a"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"b"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"c"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Baz"</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"d"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Wom"</span><span class="pun">;</span><span class="pln">

$serializedArray </span><span class="pun">=</span><span class="pln"> serialize</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo $serializedArray</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*
a:4:{s:1:"a";s:3:"Foo";s:1:"b";s:3:"Bar";s:1:"c";s:3:"Baz";s:1:"d";s:3:"Wom";}
*/</span></pre>

<h2>
	الواجهة القابلة للسَلسَلة
</h2>

<p>
	لم تعد الأصناف التي تنفّذ هذه الواجهة تدعم التوابع السحرية <code>‎__sleep()‎</code> و<code>‎__sleep()‎</code>. يُستدعى تابع السَلسَلة عندما يحتاج كائن إلى السَلسَلة، وهذا لا يشغّل التابع <code>‎__destruct()‎</code> وليس له آثار جانبية أخرى ما لم يُبرمج داخل تابع السَلسَلة، عند فك سَلسَلة البيانات يُعرف الصف ويُستدعى تابع <code>unserialize()‎</code> المناسب كبانٍ بدلًا من استدعاء <code>‎__construct()‎</code>. إذا كنت تحتاج إلى تنفيذ الباني القياسي فيمكنك القيام بذلك في التابع.
</p>

<p>
	<strong>الاستخدام الأساسي</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7970_41" style="">
<span class="kwd">class</span><span class="pln"> obj </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Serializable</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $data</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">data </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My private data"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> serialize</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> serialize</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> unserialize</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">data </span><span class="pun">=</span><span class="pln"> unserialize</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getData</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> obj</span><span class="pun">;</span><span class="pln">
$ser </span><span class="pun">=</span><span class="pln"> serialize</span><span class="pun">(</span><span class="pln">$obj</span><span class="pun">);</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$ser</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// string(38) "C:3:"obj":23:{s:15:"My private data";}"</span><span class="pln">

$newobj </span><span class="pun">=</span><span class="pln"> unserialize</span><span class="pun">(</span><span class="pln">$ser</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$newobj</span><span class="pun">-&gt;</span><span class="pln">getData</span><span class="pun">());</span><span class="pln"> 
</span><span class="com">// string(15) "My private data"</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Object Serialization - Serialization] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AC%D9%84%D8%B3%D8%A7%D8%AA-%D9%88%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A7%D9%84%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-curl-%D9%81%D9%8A-php-r1081/" rel="">الجلسات وملفات تعريف الارتباط ومكتبة cURL في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-classes-%D9%88%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%81%D9%8A-php-r1079/" rel="">الأصناف (Classes) والكائنات (Objects) في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1080</guid><pubDate>Tue, 01 Dec 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x635;&#x646;&#x627;&#x641; (Classes) &#x648;&#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A; (Objects) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-classes-%D9%88%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%81%D9%8A-php-r1079/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/14.png.4aacf207d5e185e3149bbd567b3744fc.png" /></p>

<p>
	تستخدم الأصناف والكائنات لجعل الشيفرة أكثر فعالية وأقل تكرارًا عن طريق تجميع الوظائف المتشابهة.
</p>

<p>
	يستخدم الصنف لتعريف الوظائف وبنى المعطيات المستخدمة لإنشاء كائنات، ثم تُنشأ الكائنات باستخدام البنية المعرّفة مسبقًا.
</p>

<h2>
	ثوابت الصنف
</h2>

<p>
	توفر ثوابت الصنف (Class constants) آلية لحمل القيم الثابتة في البرنامج، أي أنّها توفر طريقة لإعطاء اسم (وتربطه بالتحقق وقت التصريف) لقيمة ما مثل <code>3.14</code> أو <code>"Apple"</code>، يمكن أن تُعرَّف ثوابت الصنف باستخدام الكلمة المفتاحية <code>const</code> فقط ولا يمكن استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/define" rel="">define</a> لهذا الغرض.
</p>

<p>
	فمثلًا قد يكون من المناسب أن يكون لديك تمثيل مختصر للقيمة <code>π</code> في برنامجك، إليك الصنف التالي مع قيم <code>const</code> يوفر طريقة بسيطة لحمل مثل هذه القيم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_6" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MathValues</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> PI </span><span class="pun">=</span><span class="pln"> M_PI</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> PHI </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.61803</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$area </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MathValues</span><span class="pun">::</span><span class="pln">PI </span><span class="pun">*</span><span class="pln"> $radius </span><span class="pun">*</span><span class="pln"> $radius</span><span class="pun">;</span></pre>

<p>
	يمكن الوصول لثوابت الصنف مثل المتغيرات الساكنة باستخدام عامل العمود المزدوج <code>::</code> (الذي يسمى عامل دقة النطاق) على الصنف، لكن على عكس المتغيرات الساكنة فإنّ متغيرات الصنف لها قيم ثابتة وقت التصريف ولا يمكن إعادة إسناد قيم لها، (أي أنّ إضافة <code>MathValues::PI = 7</code> للشيفرة السابقة ستنتج خطأً فادحًا).
</p>

<p>
	تفيد ثوابت الصنف أيضًا في تعريف الأشياء الداخلية للصنف التي قد تحتاج للتغيير لاحقًا (لكن لا تتغير بشكلٍ مستمر بما يكفي لتخزينها في قاعدة بيانات مثلًا)، يمكن الرجوع إليها داخليًا باستخدام عامل تحليل النطاق (Scope Resolution Operator) ‏<code>self</code> الذي يعمل في التنفيذات الساكنة والمستنسخة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_8" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Labor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// الوقت اللازم لبناء عنصر مقدّرًا بالساعات</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LABOR_UNITS </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.26</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// المبلغ الذي يتقاضاه العمّال في الساعة</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LABOR_COST </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12.75</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getLaborCost</span><span class="pun">(</span><span class="pln">$number_units</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">self</span><span class="pun">::</span><span class="pln">LABOR_UNITS </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">LABOR_COST</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> $number_units</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن تحتوي ثوابت الصنف في إصدارات <a href="https://wiki.hsoub.com/PHP" rel="external">PHP </a>السابقة للإصدار 5.6 على قيم عددية فقط، بينما يمكننا استخدام التعابير مع الثوابت بدءًا من الإصدار 5.6 أي أنّه يمكننا استخدام التعليمات الرياضية والسلاسل النصية مع الربط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_10" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Labor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="com">/** ندفع للعمال في الساعة: الأجر في الساعة * عدد الساعات لإنجاز العمل */</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LABOR_COSTS </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12.75</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.26</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getLaborCost</span><span class="pun">(</span><span class="pln">$number_units</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">LABOR_COSTS </span><span class="pun">*</span><span class="pln"> $number_units</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بدءًا من الإصدار PHP 7.0، يمكن للثوابت المعرّفة باستخدام <code>define</code> أن تحتوي مصفوفات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_12" style="">
<span class="pln">define</span><span class="pun">(</span><span class="str">"BAZ"</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'baz'</span><span class="pun">));</span></pre>

<p>
	تعدّ ثوابت الصنف مفيدة ليس فقط لتخزين المفاهيم الرياضية، فمثلًا إذا كنت تحضّر شطيرة قد يكون من المناسب أن يكون لديك صنف <code>Pie</code> واحد قادر على أخذ أنواع مختلفة من الفاكهة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_14" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Pie</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $fruit</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">fruit </span><span class="pun">=</span><span class="pln"> $fruit</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعدها يمكننا استخدام الصنف <code>Pie</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_16" style="">
<span class="pln">$pie </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Pie</span><span class="pun">(</span><span class="str">"strawberry"</span><span class="pun">);</span></pre>

<p>
	المشكلة التي تظهر هنا هي أنّه عند استنساخ الصنف <code>Pie</code> لا يوجد إرشادات للقيم المقبولة، فمثلًا عند صنع شطيرة "boysenberry" قد تُكتب مع خطأ إملائي "boisenberry"، بالإضافة إلى ذلك قد لا تريد دعم صنع شطيرة خوخ. لذا سيكون من المفيد أن يكون لدينا قائمة معرّفة مسبقًا تحوي أنواع الفاكهة المقبولة موجودة في مكان ما بحيث يمكن ملاحظتها وليكن صنف نسميه <code>Fruit</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_18" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Fruit</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> APPLE </span><span class="pun">=</span><span class="pln"> </span><span class="str">"apple"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> STRAWBERRY </span><span class="pun">=</span><span class="pln"> </span><span class="str">"strawberry"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> BOYSENBERRY </span><span class="pun">=</span><span class="pln"> </span><span class="str">"boysenberry"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$pie </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Pie</span><span class="pun">(</span><span class="typ">Fruit</span><span class="pun">::</span><span class="pln">STRAWBERRY</span><span class="pun">);</span></pre>

<p>
	يوفر وضع القيم المقبولة في قائمة ثوابت الصنف دليلًا للقيم التي يقبلها التابع، كما يضمن أن لا يقبل المصرّف الأخطاء الإملائية التي قد تحدث، فبينما يقبل المصرّف <code>new Pie('aple')‎</code> و<code>new Pie('apple')‎</code> ستنتج الشيفرة <code>new Pie(Fruit::APLE)‎</code> خطأ تصريف (compiler error).
</p>

<p>
	كما إنّ استخدام ثوابت الصنف يعني أنّ القيمة الفعلية للثابت يمكن تعديلها في مكان واحد وأيّ شيفرة تستخدم هذا الثابت ستتأثر بهذا التغيير تلقائيًا.
</p>

<p>
	إنّ الطريقة الشائعة للوصول إلى ثابت الصنف هي <code>MyClass::CONSTANT_NAME</code>، لكن يمكن الوصول إليها بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_20" style="">
<span class="pln">echo </span><span class="typ">MyClass</span><span class="pun">::</span><span class="pln">CONSTANT</span><span class="pun">;</span><span class="pln">
$classname </span><span class="pun">=</span><span class="pln"> </span><span class="str">"MyClass"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// PHP 5.3.0 بدءًا من</span><span class="pln">
echo $classname</span><span class="pun">::</span><span class="pln">CONSTANT</span><span class="pun">;</span><span class="pln"> </span></pre>

<p>
	تسمى عادةً ثوابت الصنف بأحرف كبيرة مع استخدام الشرطة السفلية <code>_</code> للفصل بين الكلمات، بالرغم من أنّه يمكن استخدام أي تسمية صحيحة لتسمية ثابت الصنف.
</p>

<p>
	بدءًا من الإصدار PHP 7.1 يمكن تعريف ثوابت الصنف بمرئيات مختلفة عن النطاق العام الافتراضي، أي يمكن تعريف ثوابت صنف خاصة (private) ومرئية (protected) لمنعها من التسرّب غير الضروري إلى النطاق العام، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_22" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Something</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> PUBLIC_CONST_A </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> PUBLIC_CONST_B </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> PROTECTED_CONST </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> PRIVATE_CONST </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>define مقابل ثوابت الصنف</strong>
</p>

<p>
	بالرغم من أنّ هذه البنية صحيحة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_24" style="">
<span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'BAR'</span><span class="pun">,</span><span class="pln"> bar</span><span class="pun">());</span></pre>

<p>
	لكن سيظهر خطأ إذا حاولت القيام بذلك مع ثوابت الصنف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_26" style="">
<span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> BAR </span><span class="pun">=</span><span class="pln"> bar</span><span class="pun">();</span><span class="pln"> 
    </span><span class="com">// Constant expression contains invalid operations</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لكن يمكنك كتابة التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_28" style="">
<span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

define</span><span class="pun">(</span><span class="str">'BAR'</span><span class="pun">,</span><span class="pln"> bar</span><span class="pun">());</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> BAR </span><span class="pun">=</span><span class="pln"> BAR</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>استخدام ‎::class‎ للحصول على اسم الصنف</strong>
</p>

<p>
	قدمت PHP 5.5 الصياغة <code>‎::class</code> للحصول على اسم الصنف الكامل?? مع مراعاة نطاق فضاء الاسم وتعليمات <code>use</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_30" style="">
<span class="kwd">namespace</span><span class="pln"> foo</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">use</span><span class="pln"> bar\Bar</span><span class="pun">;</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="typ">Bar</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "bar\\Bar"</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="typ">Foo</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "foo\\Foo"</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">\Foo</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "Foo"</span></pre>

<p>
	تعمل الشيفرة السابقة بشكلٍ صحيح حتى لو لم تُعرَّف الأصناف، وتعدّ هذه الصياغة مفيدة للدوال التي تتطلّب اسم صنف فيمكن استخدامها مع الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/class_exists" rel="">class_exists</a> مثلًا للتحقق من أنّ صنف ما معرّف. لن تظهر أخطاء في الشيفرة التالية بغض النظر عن القيمة المعادة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_32" style="">
<span class="pln">class_exists</span><span class="pun">(</span><span class="typ">ThisClass</span><span class="pln">\Will\NeverBe\Loaded</span><span class="pun">::</span><span class="kwd">class</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span></pre>

<h2>
	الأصناف المجردة
</h2>

<p>
	الصنف المجرد (abstract class) هو الصنف الذي لا يمكن استنساخه، ويمكن له أن يعرّف توابعًا مجردة أي توابع لها تعريف فقط من دون جسم:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_34" style="">
<span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyAbstractClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن توسَّع الأصناف المجردة بصنف ابن يحقق تنفيذ هذه التوابع المجردة، إذ أنّ الهدف الأساسي للصنف المجرد هو تعريف قالب يسمح للأصناف الأبناء بالوراثة منه وفق بنية معينة، إليك المثال التالي الذي ننفذ فيه واجهة <code>Worker</code> بعد تعريفها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_36" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Worker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> run</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لتسهيل تطوير المزيد من تطبيقات الواجهة <code>Worker</code> ننشئ الصنف المجرد <code>worker</code> المزود بالتابع <code>‎run()‎</code> من الواجهة ويحدد بعض التوابع المجردة لتُملأ في الأصناف الأبناء:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_38" style="">
<span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">AbstractWorker</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Worker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $pdo</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $logger</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">PDO $pdo</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> $logger</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">pdo </span><span class="pun">=</span><span class="pln"> $pdo</span><span class="pun">;</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">logger </span><span class="pun">=</span><span class="pln"> $logger</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> run</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">setMemoryLimit</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">getMemoryLimit</span><span class="pun">());</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Preparing main"</span><span class="pun">);</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">prepareMain</span><span class="pun">();</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Executing main"</span><span class="pun">);</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">main</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Throwable</span><span class="pln"> $e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// تلتقط وتعيد رمي كل الأخطاء حتى يتمكن العامل من تسجيلها</span><span class="pln">
            $this</span><span class="pun">-&gt;</span><span class="pln">logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Worker failed with exception: {$e-&gt;getMessage()}"</span><span class="pun">);</span><span class="pln">
            </span><span class="kwd">throw</span><span class="pln"> $e</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> setMemoryLimit</span><span class="pun">(</span><span class="pln">$memoryLimit</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        ini_set</span><span class="pun">(</span><span class="str">'memory_limit'</span><span class="pun">,</span><span class="pln"> $memoryLimit</span><span class="pun">);</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Set memory limit to $memoryLimit"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getMemoryLimit</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> prepareMain</span><span class="pun">();</span><span class="pln">

    </span><span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> main</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وضعنا في البداية تابعًا مجردًا <code>getMemoryLimit()‎</code>، يحتاج أي صنف يرث الصنف <code>AbstractWorker</code> أن ينفذ هذا التابع ويعيد قيد الذاكرة. ثم يضبط <code>AbstractWorker</code> قيد الذاكرة ويسجّله.
</p>

<p>
	يستدعي الصنف <code>AbstractWorker</code> بعد ذلك التوابع <code>prepareMain()‎</code> و<code>main()‎</code>، ثم تُجمّع كل استدعاءات التوابع هذه في كتلة <code>try-catch</code> فإذا رمى أي من التوابع المجردة المعرفة من الصنف الابن استثناءً سنلتقط هذا الاستثناء ونسجّله ونعيد رميه، وهذا يمنع كل الأصناف الأبناء من الاضطرار إلى تنفيذ هذا الإجراء.
</p>

<p>
	لنعرّف صنف ابن يوسّع الصنف <code>AbstractWorker</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_40" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">TranscactionProcessorWorker</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">AbstractWorker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $transactions</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getMemoryLimit</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"512M"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> prepareMain</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $stmt </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">pdo</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM transactions WHERE processed = 0 LIMIT 500"</span><span class="pun">);</span><span class="pln">
        $stmt</span><span class="pun">-&gt;</span><span class="pln">execute</span><span class="pun">();</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">transactions </span><span class="pun">=</span><span class="pln"> $stmt</span><span class="pun">-&gt;</span><span class="pln">fetchAll</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> main</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">transactions </span><span class="kwd">as</span><span class="pln"> $transaction</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// (1)</span><span class="pln">
        $stmt </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">pdo</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"UPDATE transactions SET processed = 1 WHERE id ={$transaction['id']} LIMIT 1"</span><span class="pun">);</span><span class="pln">
        $stmt</span><span class="pun">-&gt;</span><span class="pln">execute</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قد يُرمى استثناء <code>PDO</code> أو <code>MYSQL</code> في الموضع (1) لكن يُعالج من قبل <code>AbstractWorker</code>.
</p>

<p>
	كما تلاحظ فإنّ <code>TransactionProcessorWorker</code> كان سهل التنفيذ حيث كان علينا فقط تحديد قيد الذاكرة والقلق بشأن الإجراءات الفعلية التي نحتاج القيام بها. لا نحتاج إلى معالجة الأخطاء في <code>TransactionProcessorWorker</code> لأنّها تُعالج في الصنف <code>AbstractWorker</code>.
</p>

<p>
	<strong>ملاحظة مهمة:</strong> عند الوراثة من صنف مجرد فإنّ كل التوابع المجردة الموجودة في الصنف الأب يجب أن يعرّفها الابن (أو يعيد التصريح عنها بأنّها توابع مجردة)، كما يجب تعريف هذه التوابع بنفس المرئية (أو بمرئية أقل تحديدًا)، فمثلًا إذا عُرِّف التابع المجرد أنه محمي فإنّ تنفيذه يجب أن يعرّف أنّه محمي أو عام (ولا يمكن تعريفه أنّه خاص).
</p>

<p>
	سيُرمى خطأً فادحًا إذا لم تعرّف توابع الأصناف الآباء المجردة في الصنف الابن كالخطأ التالي:
</p>

<pre class="ipsCode">
Fatal error: Class X contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (X::x) in
</pre>

<h2>
	الربط الساكن المتأخر
</h2>

<p>
	يمكن استخدام <a href="https://wiki.hsoub.com/PHP/late_static_bindings" rel="external">الربط الساكن المتأخر</a> بدءًا من الإصدار PHP 5.3 للتحكم في الصنف الذي اُستدعيت منه خاصيّة ساكنة أو تابع ساكن. وأُضيف للتغلب على مشكلة عامل تحليل النطاق <code>‎self::‎</code>، إليك الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_43" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Horse</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> whatToSay</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'Neigh!'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> speak</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">whatToSay</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MrEd</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Horse</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> whatToSay</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'Hello Wilbur!'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قد تتوقع أنّ الصنف <code>MrEd</code> سيعيد تعريف الدالة <code>whatToSay()‎</code> في الصنف الأب لكن عند التنفيذ ستكون النتيجة غير متوقعة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_45" style="">
<span class="typ">Horse</span><span class="pun">::</span><span class="pln">speak</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Neigh!</span><span class="pln">
</span><span class="typ">MrEd</span><span class="pun">::</span><span class="pln">speak</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Neigh!</span></pre>

<p>
	المشكلة هي أنّ <code>self::whatToSay();‎</code> يمكن أن يشير إلى الصنف <code>Horse</code> فقط أي أنّه لن يتأثر بالصنف <code>MrEd</code>، لن نواجه هذه المشكلة إذا بدلنا إلى عامل تحليل النطاق <code>static::‎</code>، وبهذه الطريقة سيتأثر الصنف بالنسخة التي تستدعيه فنحصل على الوراثة التي نتوقعها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_47" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Horse</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> whatToSay</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'Neigh!'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> speak</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ربط ساكن متأخر</span><span class="pln">
        </span><span class="kwd">static</span><span class="pun">::</span><span class="pln">whatToSay</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">Horse</span><span class="pun">::</span><span class="pln">speak</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Neigh!</span><span class="pln">
</span><span class="typ">MrEd</span><span class="pun">::</span><span class="pln">speak</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Hello Wilbur!</span></pre>

<h2>
	فضاء التسمية والتحميل التلقائي
</h2>

<p>
	يعمل التحميل التلقائي (Autoloading) تقنيًا بتنفيذ رد نداء عندما يُطلب صنف PHP ولا يُعثر عليه، عادةً ما تحاول ردود النداء تحميل هذه الأصناف.
</p>

<p>
	يمكن أن يُفهم التحميل التلقائي بشكلٍ عام أنّه محاولة لتحميل ملفات PHP (خاصةً ملفات الصنف حيث يكون الملف المصدري مخصصًا لصنف معين) من المسارات المناسبة حسب الاسم الكامل المؤهل (FQN) عند الحاجة إلى الصنف.
</p>

<p>
	بفرض لدينا الأصناف التالية: ملف الصنف <code>application\controllers\Base</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_49" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">namespace</span><span class="pln"> application\controllers </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Base</span><span class="pln"> </span><span class="pun">{...}</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	ملف الصنف <code>application\controllers\Control</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_51" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">namespace</span><span class="pln"> application\controllers </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Control</span><span class="pln"> </span><span class="pun">{...}</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	ملف الصنف <code>application\models\Page</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_53" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">namespace</span><span class="pln"> application\models </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Page</span><span class="pln"> </span><span class="pun">{...}</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	تتوضع هذه الأصناف في المجلد المصدر وفقًا لأسمائها الكاملة المؤهلة كالتالي:
</p>

<ul>
<li>
		المجلد المصدر
		<ul>
<li>
				applications
				<ul>
<li>
						controllers
						<ul>
<li>
								Base.php
							</li>
							<li>
								Control.php
							</li>
						</ul>
</li>
					<li>
						models
						<ul>
<li>
								Page.php
							</li>
						</ul>
</li>
				</ul>
</li>
		</ul>
</li>
</ul>
<p>
	تجعل هذه الطريقة من الممكن الحصول على مسار ملف الصنف برمجيًا وفق الاسم الكامل المؤهل (FQN) باستخدام هذه الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_55" style="">
<span class="kwd">function</span><span class="pln"> getClassPath</span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $sourceFolder</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> $className</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> $extension </span><span class="pun">=</span><span class="pln"> </span><span class="str">".php"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $sourceFolder </span><span class="pun">.</span><span class="pln"> </span><span class="str">"/"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> str_replace</span><span class="pun">(</span><span class="str">"\\"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $extension</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ <code>/</code> هو الفاصل بين المجلدات في ويندوز.
</p>

<p>
	تسمح لنا الدالة <code>spl_autoload_register</code> بتحميل الصنف الذي نحتاجه باستخدام دالة معرفة من قبل المستخدم:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_57" style="">
<span class="kwd">const</span><span class="pln"> SOURCE_FOLDER </span><span class="pun">=</span><span class="pln"> __DIR__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">"/src"</span><span class="pun">;</span><span class="pln">

spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $file </span><span class="pun">=</span><span class="pln"> getClassPath</span><span class="pun">(</span><span class="pln">SOURCE_FOLDER</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">is_readable</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">))</span><span class="pln"> require_once $file</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	يمكن لهذه الدالة أن توسَّع لاستخدام توابع قيم تراجعية (fallback) للتحميل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_59" style="">
<span class="kwd">const</span><span class="pln"> SOURCE_FOLDERS </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">__DIR__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">"/src"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/root/src"</span><span class="pun">]);</span><span class="pln">
spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">SOURCE_FOLDERS </span><span class="kwd">as</span><span class="pln"> $folder</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $extensions </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
            </span><span class="com">// ؟src/Foo/Bar.php5_int64 هل يوجد لدينا</span><span class="pln">
            </span><span class="str">".php"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_MAJOR_VERSION </span><span class="pun">.</span><span class="pln"> </span><span class="str">"_int"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="pln">PHP_INT_SIZE </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">),</span><span class="pln">

            </span><span class="com">// ؟src/Foo/Bar.php7 هل يوجد لدينا</span><span class="pln">
            </span><span class="str">".php"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_MAJOR_VERSION</span><span class="pun">,</span><span class="pln">

            </span><span class="com">// ؟src/Foo/Bar.php_int64 هل يوجد لدينا</span><span class="pln">
            </span><span class="str">".php"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"_int"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="pln">PHP_INT_SIZE </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">),</span><span class="pln">

            </span><span class="com">// ؟src/Foo/Bar.phps هل يوجد لدينا</span><span class="pln">
            </span><span class="str">".phps"</span><span class="pln">

            </span><span class="com">// ؟src/Foo/Bar.php هل يوجد لدينا</span><span class="pln">
            </span><span class="str">".php"</span><span class="pln">
        </span><span class="pun">];</span><span class="pln">

        </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$extensions </span><span class="kwd">as</span><span class="pln"> $ext</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            $path </span><span class="pun">=</span><span class="pln"> getClassPath</span><span class="pun">(</span><span class="pln">$folder</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">,</span><span class="pln"> $extension</span><span class="pun">);</span><span class="pln">
            </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">is_readable</span><span class="pun">(</span><span class="pln">$path</span><span class="pun">))</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> $path</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	لاحظ أنّ PHP لا تحاول تحميل الصنف كلما حُمِّل ملف يستخدمه، فقد تحمّله في وسط السكربت أو عند توقف الدوال وهذا إحدى الأسباب التي تجعل المطورين، خاصة الذين يستخدمون التحميل التلقائي، يتجنبوا استبدال ملفات المصدر التنفيذية في وقت التنفيذ خاصةً في ملفات <code>phar</code>.
</p>

<h2>
	مرئية التوابع والخاصيّات
</h2>

<p>
	لدينا ثلاث أنواع للمرئية يمكن استخدامها للتوابع (دوال الصنف/الكائن) والخاصيّات (متغيرات الصنف/الكائن) داخل الصنف مما يوفر تحكم بالوصول لهذه التوابع والخاصيّات.
</p>

<h3>
	public: المرئية العامة
</h3>

<p>
	يعني التصريح عن تابع أو خاصيّة بأنّهما <code>public</code> أنّه يمكن الوصول إليهما من الصنف الذي صرّح عنهما والأصناف التي ترثه وأيّ كائنات أو أصناف خارجية أو شيفرة خارج هرمية الصنف، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_61" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// خاصيّة</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $myProperty </span><span class="pun">=</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// تابع</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> myMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">myProperty</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
echo $obj</span><span class="pun">-&gt;</span><span class="pln">myMethod</span><span class="pun">();</span><span class="pln">
</span><span class="com">// test</span><span class="pln">

echo $obj</span><span class="pun">-&gt;</span><span class="pln">myProperty</span><span class="pun">;</span><span class="pln">
</span><span class="com">// test</span></pre>

<h3>
	Protected: المرئية المحمية
</h3>

<p>
	يعني التصريح عن تابع أو خاصيّة بأنّهما <code>protected</code> أنّه يمكن الوصول إليهما من الصنف الذي صرّح عنهما والأصناف التي ترثه، ولا يمكن الوصول إليهما من الكائنات أو الأصناف الخارجية أو الشيفرة خارج هرمية الصنف. إذا استخدمتهما شيفرة لا تملك إمكانية الوصول إليهما سيُرمى خطأ. مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_63" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $myProperty </span><span class="pun">=</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> myMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">myProperty</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> run</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo $this</span><span class="pun">-&gt;</span><span class="pln">myMethod</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pun">();</span><span class="pln">
</span><span class="com">// MyClass::myMethod(); يستدعي السطر التالي</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">run</span><span class="pun">();</span><span class="pln"> 
</span><span class="com">// test</span><span class="pln">

$obj</span><span class="pun">-&gt;</span><span class="pln">myMethod</span><span class="pun">();</span><span class="pln"> </span><span class="com">// خطأ</span><span class="pln">
</span><span class="com">// Fatal error: Call to protected method MyClass::myMethod() from context ''</span></pre>

<p>
	يوضح المثال السابق أنّه يمكن الوصول إلى العناصر المحمية من ضمن نطاقها، أي "الذي يوجد في المنزل يمكن الوصول إليه من داخل المنزل فقط".
</p>

<h3>
	Private: المرئية الخاصة
</h3>

<p>
	يعني التصريح عن تابع أو خاصيّة بأنّهما <code>private</code> أنّه يمكن الوصول إليهما من الصنف الذي صرّح عنهما فقط (ولا يمكن الوصول إليهما من الأصناف الفرعية).
</p>

<p>
	لاحظ أنّ الكائنات من نفس النوع ستصل إلى العناصر الخاصة والمحمية لبعضها لبعض حتى لو لم تكن نفس النسخ.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_65" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $myProperty </span><span class="pun">=</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> myPrivateMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">myProperty</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> myPublicMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">myPrivateMethod</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> modifyPrivatePropertyOf</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pln"> $anotherInstance</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $anotherInstance</span><span class="pun">-&gt;</span><span class="pln">myProperty </span><span class="pun">=</span><span class="pln"> </span><span class="str">"new value"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> run</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo $this</span><span class="pun">-&gt;</span><span class="pln">myPublicMethod</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> runWithPrivate</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo $this</span><span class="pun">-&gt;</span><span class="pln">myPrivateMethod</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pun">();</span><span class="pln">
$newObj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pun">();</span><span class="pln">

$obj</span><span class="pun">-&gt;</span><span class="pln">run</span><span class="pun">();</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
</span><span class="com">// test</span><span class="pln">

$obj</span><span class="pun">-&gt;</span><span class="pln">modifyPrivatePropertyOf</span><span class="pun">(</span><span class="pln">$newObj</span><span class="pun">);</span><span class="pln">

$newObj</span><span class="pun">-&gt;</span><span class="pln">run</span><span class="pun">();</span><span class="pln">
</span><span class="com">// new value</span><span class="pln">

echo $obj</span><span class="pun">-&gt;</span><span class="pln">myPrivateMethod</span><span class="pun">();</span><span class="pln"> </span><span class="com">// خطأ</span><span class="pln">
</span><span class="com">// Fatal error: Call to private method MyClass::myPrivateMethod() from context ''</span><span class="pln">

echo $obj</span><span class="pun">-&gt;</span><span class="pln">runWithPrivate</span><span class="pun">();</span><span class="pln"> </span><span class="com">// خطأ</span><span class="pln">
</span><span class="com">// Fatal error: Call to private method MyClass::myPrivateMethod() from context 'MySubClass'</span></pre>

<p>
	في الموضع (1) سيُستدعى <code>MyClass::myPublicMethod()‎</code> ثم <code>MyClass::myPrivateMethod()‎</code>.
</p>

<p>
	كما تلاحظ يمكن الوصول إلى التابع/الخاصيّة الخاصة فقط من الصنف الذي عرفهما.
</p>

<h2>
	الواجهات
</h2>

<p>
	الواجهات (Interfaces) هي تعريفات لواجهة برمجة التطبيقات (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) العامة ويجب أن تنفذها الأصناف، فهي تعمل "كعقود" تحدد ما الذي يجب أن تفعله الأصناف دون تحديد كيفية فعله.
</p>

<p>
	يشبه تعريف الواجهة تعريف الصنف لكن نستبدل كلمة <code>interface</code> بكلمة <code>class</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_67" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن تحتوي الواجهات توابع و/أو ثوابت ولكن ليس سمات، ثوابت الواجهة لها نفس قيود ثوابت الصنف، وتوابع الواجهة مجردة ضمنيًّا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_69" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> BAR </span><span class="pun">=</span><span class="pln"> </span><span class="str">'BAR'</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">,</span><span class="pln"> $param2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ملاحظة: يجب ألا تصرّح الواجهات عن بواني (constructors) أو هوادم (destructors) لأن تفاصيل التنفيذ هذه على مستوى الصنف.
</p>

<h3>
	التطبيق
</h3>

<p>
	أي صنف يحتاج لتنفيذ واجهة يجب أن يستخدم الكلمة المفتاحية <code>implements</code>، للقيام بذلك يحتاج الصنف أن يوفر تنفيذًا لكل تابع مصرَّح عنه في الواجهة مع الحفاظ على نفس البصمة، ويمكن للصنف الواحد أن ينفذ أكثر من واجهة واحدة في نفس الوقت.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_71" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">,</span><span class="pln"> $param2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doAnotherThing</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Baz</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">,</span><span class="pln"> $param2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doAnotherThing</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا تحتاج الأصناف المجردة عندما تنفذ الواجهات إلى تنفيذ كل التوابع، وأي تابع لا يُنفَّذ في الصنف الأساسي يجب تنفيذه في الصنف الذي يوسّعه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_73" style="">
<span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">AbstractBaz</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// تنفيذ جزئي للواجهة المطلوبة...</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">,</span><span class="pln"> $param2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Baz</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">AbstractBaz</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doAnotherThing</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ تطبيق الواجهة ميزة موروثة، عند توسيع صنف ينفذ واجهة فأنت لا تحتاج لإعادة التصريح عنها في الصنف الابن لأنّ هذا محقق ضمنيًّا.
</p>

<p>
	ملاحظة: قبل الإصدار PHP 5.3.9 لم يكن بإمكان الصنف أن ينفذ واجهتين بهما تابع بنفس الاسم لأنّ هذا قد يسبب التباسًا، بينما تسمح الإصدارات الأحدث بذلك طالما أنّ التوابع المكررة ليس لها نفس البصمة.
</p>

<h3>
	الوراثة
</h3>

<p>
	يمكن إنشاء علاقة وراثة بين الواجهات مثل الأصناف باستخدام الكلمة المفتاحية <code>extends</code>، الفرق الأساسي هو أنّ الوراثة المتعددة مسموحة في الواجهات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_75" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Baz</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	أمثلة
</h3>

<p>
	إليك مثال بسيط لواجهة مركبة، يمكن للمركبات أن تتحرك إلى الأمام والخلف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_77" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">VehicleInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> forward</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> reverse</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bike</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">VehicleInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> forward</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">pedal</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> reverse</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">backwardSteps</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> pedal</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> backwardSteps</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">VehicleInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $gear </span><span class="pun">=</span><span class="pln"> </span><span class="str">'N'</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> forward</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">setGear</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">pushPedal</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> reverse</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">setGear</span><span class="pun">(</span><span class="str">'R'</span><span class="pun">);</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">pushPedal</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> setGear</span><span class="pun">(</span><span class="pln">$gear</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">gear </span><span class="pun">=</span><span class="pln"> $gear</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> pushPedal</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم ننشئ صنفين ينفذان الواجهة: الدراجة والسيارة، يوجد اختلاف كبير داخليًا بين الدراجة والسيارة لكن كلّ منهما مركبة ويجب أن تنفذ نفس التوابع العامة التي توفرها واجهة المركبة <code>VehicleInterface</code>.
</p>

<p>
	تسمح ميزة التلميح عن النوع (Typehinting) للتوابع والدوال أن تطلب واجهات. بفرض أنّه لدينا صنف مرآب للسيارات يحتوي كل أنواع المركبات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9723_79" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">ParkingGarage</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $vehicles </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> addVehicle</span><span class="pun">(</span><span class="typ">VehicleInterface</span><span class="pln"> $vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">vehicles</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $vehicle</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بما أنّ الدالة <code>addVehicle</code> تتطلب متغيرًا <code>‎$vehicle</code> من النوع واجهة <code>VehicleInterface</code> - ليس تنفيذ حقيقي - يمكننا أن نجعل الدخل من النوع دراجة أو سيارة مما يمكّن الصنف <code>ParkingGarage</code> من معالجتها واستخدامها.
</p>

<h2>
	الكلمة المفتاحية Final
</h2>

<p>
	تمنع الكلمة المفتاحية <code>Final</code> الأصناف الأبناء من إعادة تعريف تابع مسبوقة بالكلمة <code>final</code>، إذا عُرِّف الصنف أنّه نهائي (final) فلا يمكن توسيعه.
</p>

<h3>
	التابع النهائي
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_6" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">BaseClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"BaseClass::test() called\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> moreTesting</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"BaseClass::moreTesting() called\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ChildClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">BaseClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> moreTesting</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"ChildClass::moreTesting() called\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// Fatal error: Cannot override final method BaseClass::moreTesting()</span></pre>

<h3>
	الصنف النهائي
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_8" style="">
<span class="kwd">final</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">BaseClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"BaseClass::test() called\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// من غير الهام هنا إن عُرِّفت الدالة أنّها نهائية أو لم تُعرَّف</span><span class="pln">
    </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> moreTesting</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"BaseClass::moreTesting() called\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ChildClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">BaseClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// Fatal error: Class ChildClass may not inherit from final class (BaseClass)</span></pre>

<h3>
	الثوابت النهائية
</h3>

<p>
	لا تستخدم الكلمة المفتاحية <code>final</code> لثوابت الصنف في PHP، على عكس لغة Java. ويمكن استخدام الكلمة المفتاحية <code>const</code> بدلًا منها.
</p>

<h3>
	لماذا يجب أن أستخدم الكلمة المفتاحية final؟
</h3>

<ul>
<li>
		منع حدوث سلسلة وراثة ضخمة.
	</li>
	<li>
		تشجيع التكوّن
	</li>
	<li>
		إجبار المطور على التفكير بواجهة برمجة التطبيقات العامة للمستخدم
	</li>
	<li>
		إجبار المطور على تقليص واجهة برمجة التطبيقات العامة للكائن
	</li>
	<li>
		يمكن أن نجعل الصف المعرّف أنّه <code>final</code> موسِّعًا
	</li>
	<li>
		تحطم الكلمة المفتاحية <code>extends</code> التغليف
	</li>
	<li>
		لا تحتاج إلى المرونة
	</li>
	<li>
		بإمكانك تغيير الشيفرة بحريّة
	</li>
</ul>
<h3>
	لماذا يجب أن أتجنب استخدام الكلمة المفتاحية final؟
</h3>

<p>
	تعمل الأصناف النهائية بشكلٍ فعال فقط في وجود الافتراضات التالية:
</p>

<ul>
<li>
		يوجد تجريد (واجهة) ينفذه الصنف النهائي
	</li>
	<li>
		كل واجهة برمجة التطبيقات العامة للصنف النهائي هي جزء من تلك الواجهة
	</li>
</ul>
<h2>
	التحميل التلقائي
</h2>

<p>
	‏بالطبع أنت لا ترغب في استخدام <code>include</code> و<code>require</code> في كل مرة تريد استخدام صنف أو وراثته، لأنّ هذا قد يكون سيئًا وسهل النسيان لذا وفرت PHP التحميل التلقائي (autoloading).
</p>

<h3>
	ما هو التحميل التلقائي بالضبط؟
</h3>

<p>
	يعني التحميل التلقائي أنّك لا تحتاج للحصول على الملف المخزّن فيه الصنف المطلوب إنّما تقوم PHP "تلقائيًا" بتحميله.
</p>

<h3>
	كيف يمكن أن أقوم بالتحميل التلقائي في PHP دون شيفرة من طرف ثالث؟
</h3>

<p>
	يمكننا استخدام الدالة <a href="http://%E2%80%8Fhttps://www.php.net/manual/en/function.autoload.php" rel="external nofollow">‎_autoload‎_</a> للقيام بالتحميل التلقائي لكن يفضّل استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/autoloading" rel="">spl</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/autoloading" rel="">autoload_register</a>، تستخدم PHP هذه الدوال عندما لا تجد صنف ما معرفًا ضمن النطاق المعطى. إنّ إضافة التحميل التلقائي إلى مشروع موجود لا يشكل مشكلة بما أنّ الأصناف المعرّفة (باستخدام <code>require</code>) ستعمل كما في السابق. ستستخدم الأمثلة التالية دوال مجهولة فإذا كنت تستخدم إصدار PHP ‎‎&lt; 5.3 يمكنك تعريف الدالة وتمرير اسمها كوسيط للدالة <code>spl_autoload_register</code>.
</p>

<h3>
	أمثلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_12" style="">
<span class="pln">spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $path </span><span class="pun">=</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="str">'%s.php'</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$path</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        include $path</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// الملف غير موجود</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	تحاول الشيفرة السابقة تضمين اسم الملف الذي هو نفس اسم الصنف ومضافًا إليه اللاحقة "‎.php" باستخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/sprintf" rel="">sprintf</a>، إذا احتجنا لتحميل <code>FooBar</code> فإنّها تبحث عن <code>FooBar.php</code> وتضمّنه. وبالطبع يمكن توسيع هذه الشيفرة لتناسب احتياجات مشروعنا، إذا اُستخدمت <code>_</code> في اسم الصف للتجميع مثل <code>User_Post</code> و<code>User_Image</code> فمن الممكن تخزين هذه الأصناف في مجلد اسمه "User" كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_14" style="">
<span class="pln">spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// استبدال بالمحرف / أو \ وذلك حسب نظام التشغيل</span><span class="pln">
    $path </span><span class="pun">=</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="str">'%s.php'</span><span class="pun">,</span><span class="pln"> str_replace</span><span class="pun">(</span><span class="str">'_'</span><span class="pun">,</span><span class="pln"> DIRECTORY_SEPARATOR</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$path</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        include $path</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// الملف غير موجود</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	سيُحمّل الصنف <code>User_Post</code> الآن من المسار "User/Post.php" وهكذا.
</p>

<p>
	يمكن أن تتناسب الدالة <code>spl_autoload_register</code> مع الاحتياجات المختلفة، فإذا كانت كل ملفات أصنافك مُسمّاة بالشكل "class.CLASSNAME.php" ستوجد تداخلات مختلفة (User<em>Post</em>Content =&gt; "User/Post/Content.php"‎).
</p>

<p>
	إذا كنت تريد تقنية تحميل تلقائي أكثر تفصيلًا ولا تريد استخدام composer يمكنك أن تعمل دون إضافة مكتبات من طرف ثالث.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_16" style="">
<span class="pln">spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$className</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $path </span><span class="pun">=</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="str">'%1$s%2$s%3$s.php'</span><span class="pun">,</span><span class="pln">
        realpath</span><span class="pun">(</span><span class="pln">dirname</span><span class="pun">(</span><span class="pln">__FILE__</span><span class="pun">)),</span><span class="pln">
        DIRECTORY_SEPARATOR</span><span class="pun">,</span><span class="pln">
        strtolower</span><span class="pun">(</span><span class="pln">
            </span><span class="com">// استبدال بالمحرف / أو \ وذلك حسب نظام التشغيل</span><span class="pln">
            str_replace</span><span class="pun">(</span><span class="str">'_'</span><span class="pun">,</span><span class="pln"> DIRECTORY_SEPARATOR</span><span class="pun">,</span><span class="pln"> $className</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">);</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$path</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        include $path</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Exception</span><span class="pun">(</span><span class="pln">
        sprintf</span><span class="pun">(</span><span class="str">'Class with name %1$s not found. Looked in %2$s.'</span><span class="pun">,</span><span class="pln">
                $className</span><span class="pun">,</span><span class="pln">
                $path
            </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	في الشيفرة السابقة <code>‎%1$s</code> للحصول على المسار المطلق و<code>‎%2$s</code> إما <code>/</code> أو <code>\</code> وذلك حسب نظام التشغيل و<code>‎%3$s</code> لعدم الاهتمام فيما إذا كانت الأحرف صغيرة أو كبيرة عند إنشاء الملفات.
</p>

<p>
	باستخدام المحمّلات التلقائية مثل هذه يمكنك كتابة الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_18" style="">
<span class="com">// spl_autoload_register المكان الذي عُرِّف فيه</span><span class="pln">
require_once </span><span class="str">'./autoload.php'</span><span class="pun">;</span><span class="pln"> 

$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Foo_Bar</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Hello_World</span><span class="pun">());</span></pre>

<p>
	استخدام الأصناف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_20" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo_Bar</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Hello_World</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Demo_Classes</span><span class="pln"> </span><span class="pun">{}</span></pre>

<p>
	ستضمّن هذه الأمثلة الأصناف من <code>foo/bar.php</code>، <code>‏foo.php</code>، <code>‏hello/world.php</code> و<code>demo/classes.php</code>.
</p>

<h2>
	‎استدعاء باني أب عند استنساخ ابن
</h2>

<p>
	من المشاكل الشائعة للأصناف الأبناء هي أنّه إذا احتوى كل من الأب والابن تابعًا بانيًا <code>‎__construct()‎</code> فسيُنفَّذ باني الصنف الابن فقط، قد تحتاج أحيانًا إلى تنفيذ باني الصنف الأب من داخل الصنف الابن عندها يمكنك استخدام عامل تحليل النطاق <code>‎::parent</code> بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_22" style="">
<span class="pln">parent</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">();</span></pre>

<p>
	إليك مثالًا واقعيًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_24" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'parent'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bar</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        parent</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">(</span><span class="pln">$args</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيؤدي تنفيذ الشيفرة السابقة إلى تنفيذ باني الصنف الأب وبالتالي ستُنفَّذ تعليمة <code>echo</code>.
</p>

<h2>
	الربط الديناميكي
</h2>

<p>
	يعدّ الربط الديناميكي (ويسمىّ أيضًا إعادة تعريف التابع) مثالًا للتعددية الشكلية وقت التنفيذ والتي تحدث عندما تحتوي عدة أصناف على تنفيذات مختلفة لنفس التابع لكن الكائن الذي سيستدعيه التابع لا يُعرف حتى وقت التنفيذ، ويعد هذا مفيدًا إذا حدد شرط معين أيّ صنف سيُستخدم لأداء وظيفة ما حيث هذه الوظيفة لها نفس الاسم في كلا الصنفين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_26" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> makeNoise</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Cat</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> makeNoise
    </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">meow</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Dog</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> makeNoise </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">bark</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> CAT </span><span class="pun">=</span><span class="pln"> </span><span class="str">'cat'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> DOG </span><span class="pun">=</span><span class="pln"> </span><span class="str">'dog'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $petPreference</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $pet</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> isCatLover</span><span class="pun">():</span><span class="pln"> </span><span class="kwd">bool</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">petPreference </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">CAT</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> isDogLover</span><span class="pun">():</span><span class="pln"> </span><span class="kwd">bool</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">petPreference </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">DOG</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> setPet</span><span class="pun">(</span><span class="typ">Animal</span><span class="pln"> $pet</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">pet </span><span class="pun">=</span><span class="pln"> $pet</span><span class="pun">;</span><span class="pln">
</span><span class="pun">‏</span><span class="pln">    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getPet</span><span class="pun">():</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">pet</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$person</span><span class="pun">-&gt;</span><span class="pln">isCatLover</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $person</span><span class="pun">-&gt;</span><span class="pln">setPet</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Cat</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$person</span><span class="pun">-&gt;</span><span class="pln">isDogLover</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $person</span><span class="pun">-&gt;</span><span class="pln">setPet</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dog</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$person</span><span class="pun">-&gt;</span><span class="pln">getPet</span><span class="pun">()-&gt;</span><span class="pln">makeNoise</span><span class="pun">();</span></pre>

<p>
	في المثال السابق لا يُعرف الصنف <code>Animal</code> ‏(Dog|Cat) الذي سينفذ التابع <code>makeNoise</code> إلى وقت التنفيذ وفقًا للخاصيّة ضمن الصنف <code>User</code>.
</p>

<h2>
	‎$this، ‏self، ‏static ونمط المفردة (singleton)
</h2>

<p>
	نستخدم <code>‎$this</code> للإشارة إلى الكائن الحالي و<code>self</code> للإشارة إلى الصنف الحالي، وبمعنى آخر نستخدم <code>‎$this-&gt;member</code> للعناصر غير الساكنة و<code>self::$member‎</code> للعناصر الساكنة.
</p>

<p>
	لاحظ الفرق في المثال التالي الذي تستخدم فيه الدالة <code>sayHello()‎</code> <code>‏‎$this</code> وتستخدم الدالة <code>‎sayGoodbye()‎</code> <code>‏self</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_28" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getTitle</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">getName</span><span class="pun">().</span><span class="str">" the person"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> sayHello</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"Hello, I'm "</span><span class="pun">.</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">getTitle</span><span class="pun">().</span><span class="str">"&lt;br/&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> sayGoodbye</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"Goodbye from "</span><span class="pun">.</span><span class="kwd">self</span><span class="pun">::</span><span class="pln">getTitle</span><span class="pun">().</span><span class="str">"&lt;br/&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Geek</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        parent</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getTitle</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">getName</span><span class="pun">().</span><span class="str">" the geek"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$geekObj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Geek</span><span class="pun">(</span><span class="str">"Ludwig"</span><span class="pun">);</span><span class="pln">
$geekObj</span><span class="pun">-&gt;</span><span class="pln">sayHello</span><span class="pun">();</span><span class="pln">
$geekObj</span><span class="pun">-&gt;</span><span class="pln">sayGoodbye</span><span class="pun">();</span></pre>

<p>
	تشير الكلمة المفتاحية <code>static</code> إلى أي صنف في الهرمية تستدعي عليه التابع، وتسمح بإعادة استخدام أفضل لخصائص الصنف الساكنة عندما تورَّث الأصناف.
</p>

<p>
	إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_30" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'unknown'</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> brand</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">$brand</span><span class="pun">.</span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Mercedes</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Mercedes'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> BMW </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'BMW'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span><span class="pln">
echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> BMW</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span><span class="pln">
echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Mercedes</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span></pre>

<p>
	نتيجة الشيفرة السابقة:
</p>

<pre class="ipsCode">
unknown
unknown
unknown
</pre>

<p>
	وذلك لأنّ <code>self</code> تشير إلى الصنف <code>Car</code> بغض النظر من أين اُستدعت <code>brand()‎</code>، لذا فأنت تحتاج لاستخدام <code>static</code> للإشارة إلى الصنف الصحيح وذلك بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_32" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'unknown'</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> brand</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">static</span><span class="pun">::</span><span class="pln">$brand</span><span class="pun">.</span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Mercedes</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Mercedes'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> BMW </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Car</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $brand </span><span class="pun">=</span><span class="pln"> </span><span class="str">'BMW'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span><span class="pln">
echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> BMW</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span><span class="pln">
echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Mercedes</span><span class="pun">)-&gt;</span><span class="pln">brand</span><span class="pun">();</span></pre>

<p>
	ستنتج هذه الشيفرة الخرج المطلوب والذي هو:
</p>

<pre class="ipsCode">
unknown
BMW
Mercedes
</pre>

<h3>
	نمط المفردة (singleton)
</h3>

<p>
	إذا كان لديك كائن مكلّف بإنشاء اتصال مع مورد خارجي أو يمثّل اتصال إلى مورد خارجي معين فأنت تحتاج إلى إعادة استخدام اتصال بقاعدة البيانات حيث لا يوجد تجمّع اتصال أو مقبس إلى نظام آخر، عندها يمكنك أن تستخدم الكلمات المفتاحية <code>static</code> و<code>self</code> في الصنف ليصبح بنمط المفردة. يوجد آراء مختلفة حول نمط المفردة فيما إذا كان يجب استخدامه أو لا ولكن يبقى له استخداماته.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_34" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $instance </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getInstance</span><span class="pun">(){</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isset</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">::</span><span class="pln">$instance</span><span class="pun">)){</span><span class="pln">
            </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">$instance </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">$instance</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">….</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عرّفنا في الشيفرة السابقة خاصيّة ساكنة خاصة <code>‎$instance</code> لتحمل مرجعية الكائن، وبما أنّها ساكنة فستُشارك بين كل كائنات هذا النوع.
</p>

<p>
	يستخدم التابع <code>getInstance()‎</code> طريقة التهيئة المُرجأة (lazy instantiation) لتأخير إنشاء الكائنات إلى آخر لحظة ممكنة لأنك لا تريد أن تمتلئ الذاكرة بكائنات غير مستخدمة، وأيضًا تحافظ على الوقت وعلى المعالج عند تحميل الصفحة إذ لا تُحمَّل كائنات غير ضرورية. يتحقق التابع فيما إذا ضُبط الكائن وأُنشئ أم لا وتعيده وهذا يضمن إنشاء كائن واحد فقط من هذا النوع.
</p>

<p>
	كما عرّفنا الباني أنه خاص (private) حتى نضمن أنه من غير الممكن إنشاؤه من الخارج باستخدام الكلمة المفتاحية <code>new</code>. إذا كنت تحتاج للوراثة من هذا الصنف فقط غيّر الكلمات المفتاحية <code>private</code> إلى <code>protected</code>.
</p>

<p>
	لاستخدام هذا الكائن تكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_36" style="">
<span class="pln">$singleton </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">();</span></pre>

<h2>
	تعريف صنف أساسي
</h2>

<p>
	يتألف الكائن في PHP من متغيرات ودوال، وتنتمي الكائنات إلى صنف يعرّف المتغيرات والدوال التي تحتويها كل كائنات هذا الصنف، صياغة تعريف الصنف هي كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_38" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Shape</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $sides </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> description</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"A shape with $this-&gt;sides sides."</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عندما يُعرَّف صنف يمكنك الاستنساخ منه بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_40" style="">
<span class="pln">$myShape </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">();</span></pre>

<p>
	يمكن الوصول لمتغيرات ودوال الكائن بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_42" style="">
<span class="pln">$myShape </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">();</span><span class="pln">
$myShape</span><span class="pun">-&gt;</span><span class="pln">sides </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> $myShape</span><span class="pun">-&gt;</span><span class="pln">description</span><span class="pun">();</span><span class="pln"> 
</span><span class="com">// A shape with 6 sides</span></pre>

<h3>
	الباني
</h3>

<p>
	يمكن أن تعرّف الأصناف تابع باني خاص <code>‎__construct()‎</code> يُنفَّذ كجزء من إنشاء الكائن، ويستخدم عادةً لإعطاء القيم الابتدائية لكائن:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_44" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Shape</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $sides </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$sides</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">sides </span><span class="pun">=</span><span class="pln"> $sides</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> description</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"A shape with $this-&gt;sides sides."</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$myShape </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Shape</span><span class="pun">(</span><span class="lit">6</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $myShape</span><span class="pun">-&gt;</span><span class="pln">description</span><span class="pun">();</span><span class="pln">
</span><span class="com">// A shape with 6 sides</span></pre>

<h3>
	توسيع صنف آخر
</h3>

<p>
	يمكن لتعريفات الصنف أن توسّع تعريفات صنف موجود وتضيف المزيد من المتغيرات والدوال وتعدّل في المتغيرات والدوال المعرفة في الصنف الأب، إليك صنف يوسّع الصنف في المثال السابق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_46" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Square</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Shape</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $sideLength </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$sideLength</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        parent</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">sideLength </span><span class="pun">=</span><span class="pln"> $sideLength</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> perimeter</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">sides </span><span class="pun">*</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">sideLength</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> area</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">sideLength </span><span class="pun">*</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">sideLength</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يتضمن الصنف <code>Square</code> متغيرات ودوال لكل من الصنفين <code>Square</code> و<code>Shape</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_48" style="">
<span class="pln">$mySquare </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $mySquare</span><span class="pun">-&gt;</span><span class="pln">description</span><span class="pun">()/</span><span class="pln"> </span><span class="com">// A shape with 4 sides</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $mySquare</span><span class="pun">-&gt;</span><span class="pln">perimeter</span><span class="pun">()</span><span class="pln"> </span><span class="com">// 40</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $mySquare</span><span class="pun">-&gt;</span><span class="pln">area</span><span class="pun">()</span><span class="pln"> </span><span class="com">// 100</span></pre>

<h2>
	الأصناف المجهولة
</h2>

<p>
	قُدِّمت الأصناف المجهولة في الإصدار PHP 7 لتمكين إنشاء نسخة واحدة بسيطة من الصنف، ويمكن لها أن تأخذ وسائط الباني وتوسّع أصناف أخرى وتنفّذ واجهات وتستخدم السمات (traits) مثل الأصناف العادية تمامًا، والنموذج الأساسي لها كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_50" style="">
<span class="kwd">new</span><span class="pln"> </span><span class="kwd">class</span><span class="pun">(</span><span class="str">"constructor argument"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$param</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        var_dump</span><span class="pun">(</span><span class="pln">$param</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln"> </span><span class="com">// string(20) "constructor argument"</span></pre>

<p>
	لا يوفر تداخل صنف مجهول ضمن صنف آخر إمكانية الوصول إلى التوابع أو الخاصيّات الخاصة أو المحمية للصنف الخارجي، يمكن الوصول إلى الخاصيات والتوابع المحمية للصنف الخارجي بتوسيعه من قِبل صنف مجهول ويمكن الوصول إلى الخاصيات والتوابع الخاصة للصنف الخارجي بتمريرها إلى باني الصنف المجهول. مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3716_52" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Outer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $prop </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $prop2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> func1</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> func2</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="com">// الخاصة $this-&gt;prop التمرير عبر الخاصيّة</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">class</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">prop</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Outer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">private</span><span class="pln"> $prop3</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$prop</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                $this</span><span class="pun">-&gt;</span><span class="pln">prop3 </span><span class="pun">=</span><span class="pln"> $prop</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> func3</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// (1)</span><span class="pln">
                </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">prop2 </span><span class="pun">+</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">func1</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">prop3</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">};</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Outer</span><span class="pun">)-&gt;</span><span class="pln">func2</span><span class="pun">()-&gt;</span><span class="pln">func3</span><span class="pun">();</span><span class="pln"> </span><span class="com">// 6</span></pre>

<p>
	في الموضع (1) الوصول إلى الخاصيّة المحمية <code>Outer::$prop2</code> والتابع المحمي <code>Outer::func1()‎</code> والخاصية المحلية <code>self::$prop3</code> الخاصة من <code>Outer::$prop</code>.
</p>

<p>
	ترجمة -وبتصرف- للفصل [Classes and Objects] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%B3%D9%84%D8%A9-serialization-%D9%81%D9%8A-php-r1080/" rel="">السلسلة Serialization في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%B5%D9%8A%D8%BA%D8%A9-json-%D9%88xml-%D9%81%D9%8A-php-r1078/" rel="">صيغة JSON وXML في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1079</guid><pubDate>Sun, 29 Nov 2020 13:00:00 +0000</pubDate></item><item><title>&#x635;&#x64A;&#x63A;&#x629; JSON &#x648;XML &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%B5%D9%8A%D8%BA%D8%A9-json-%D9%88xml-%D9%81%D9%8A-php-r1078/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/13.png.af707a6beee07fced9093773d3df2ef9.png" /></p>

<p>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_encode" rel="">json_encode</a> تأخذ المعاملات التالية:
</p>

<table><tbody>
<tr>
<td>
				<strong>المعامل</strong>
			</td>
			<td>
				<strong>تفاصيل</strong>
			</td>
		</tr>
<tr>
<td>
				value
			</td>
			<td>
				القيمة المطلوب ترميزها، يمكن أن تكون من أي نوع عدا الموارد ويجب ترميز جميع بيانات السّلاسل UTF-8 النصيّة بصيغة
			</td>
		</tr>
<tr>
<td>
				options
			</td>
			<td>
				<p>
					خيارات على شكل قناع بتي وهي:
				</p>

				<ul>
<li>
						JSON_HEX_AMP
					</li>
					<li>
						JSON_HEX_APOS
					</li>
					<li>
						JSON_HEX_QUOT
					</li>
					<li>
						JSON_HEX_TAG
					</li>
					<li>
						JSON_NUMERIC_CHECK
					</li>
					<li>
						JSON_PRETTY_PRINT
					</li>
					<li>
						JSON_UNESCAPED_SLASHES
					</li>
					<li>
						JSON_FORCE_OBJECT
					</li>
					<li>
						JSON_PRESERVE_ZERO_FRACTION
					</li>
					<li>
						JSON_UNESCAPED_UNICODE
					</li>
					<li>
						JSON_PARTIAL_OUTPUT_ON_ERROR
					</li>
				</ul>
<p>
					ويوجد وصف لسلوك هذه الثوابت في صفحة <a href="https://www.php.net/manual/en/json.constants.php" rel="external nofollow">JSON ثوابت‎</a>
				</p>
			</td>
		</tr>
<tr>
<td>
				depth
			</td>
			<td>
				يحدد العمق الأقصى، ويجب أن يكون أكبر من الصّفر
			</td>
		</tr>
</tbody></table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<p>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_decode" rel="">json_decode</a> فتأخذ المعاملات التالية:
</p>

<table><tbody>
<tr>
<td>
				المعامل
			</td>
			<td>
				تفاصيل
			</td>
		</tr>
<tr>
<td>
				json
			</td>
			<td>
				السلسلة النصية المُراد فك ترميزها بصيغة ‏ فقط UTF-8 تعمل هذه الدّالّة مع سلاسل نصّيّة مُرمَّزة بترميز JSON
			</td>
		</tr>
<tr>
<td>
				assoc
			</td>
			<td>
				تُحوَّل الكائنات المُعادة من الدالة إلى مصفوفات ترابطية عندما تكون قيمته TRUE
			</td>
		</tr>
<tr>
<td>
				options
			</td>
			<td>
				خيارات لفك ترميز JSON على شكل قناع بتي يوجد خيار واحد مدعوم حاليًا وهو JSON_BIGINT_AS_STRING ويسمح بقلب الأعداد الصحيحة الكبيرة إلى سلاسل نصّيّة بدلًا من أعداد عشرية 
			</td>
		</tr>
</tbody></table>
<h2>
	فك ترميز سلسلة نصية بصيغة JSON
</h2>

<p>
	تأخذ الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_decode" rel="">json_decode</a> المعامل الأول على شكل سلسلة نصية مرمّزة بصيغة JSON وتحلله إلى متغير PHP، إذا كان كائن JSON هو مصفوفة فهي تعيد كائنًا من <a href="%E2%80%8Fhttps://www.php.net/manual/en/reserved.classes.php" rel="">‎\stdClass</a> إذا كان عنصر المستوى الأعلى في الكائن هو قاموس (dictionary) أو مصفوفة مفهرسة، وتعيد قيمًا عددية أو <code>NULL</code> من أجل قيم عددية معينة مثل السلاسل النصية البسيطة "true" و"false" و"null"، وتعيد <code>NULL</code> عند أي خطأ.
</p>

<p>
	تعيد الشيفرة التالية كائنًا بما أنّ عنصر المستوى الأعلى في السلسلة النصية بصيغة JSON هو قاموس JSON:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_8" style="">
<span class="pln">$json_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}'</span><span class="pun">;</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$json_string</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">'Hello %s, You are %s years old.'</span><span class="pun">,</span><span class="pln"> $object</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> $object</span><span class="pun">-&gt;</span><span class="pln">age</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Hello Jeff, You are 20 years old.</span></pre>

<p>
	تعيد الشيفرة التالية مصفوفة بما أنّ عنصر المستوى الأعلى في السلسلة النصية بصيغة JSON هو مصفوفةJSON:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_10" style="">
<span class="pln">$json_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'["Jeff", 20, true, ["red", "blue"]]'</span><span class="pun">;</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$json_string</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">'Hello %s, You are %s years old.'</span><span class="pun">,</span><span class="pln"> $array</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> $array</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]);</span></pre>

<p>
	يمكنك استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/var_dump" rel="">var_dump()‎</a> للاطلاع على أنواع وقيم كل خاصيّة للكائن الذي فُكَّ ترميزه، فإذا استخدمناها للكائن <code>‎$object</code> في مثالنا السابق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_12" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">);</span></pre>

<p>
	يكون الخرج:
</p>

<pre class="ipsCode">
class stdClass#2 (4) {
    ["name"] =&gt; string(4) "Jeff"
    ["age"] =&gt; int(20)
    ["active"] =&gt; bool(true)
    ["colors"] =&gt;
    array(2) {
        [0] =&gt; string(3) "red"
        [1] =&gt; string(4) "blue"
    }
}
</pre>

<p>
	ملاحظة: حُوِّلت أنواع المتغيرات في JSON إلى مكافئاتها في PHP.
</p>

<p>
	نقوم بتمرير <code>true</code> معاملًا ثانيًا للدالة <code>json_decode()‎</code> لإرجاع مصفوفة ترابطية من كائنات JSON بدلًا من إرجاع كائن. مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_15" style="">
<span class="pln">$json_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}'</span><span class="pun">;</span><span class="pln">
$array </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$json_string</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span></pre>

<p>
	خرج الشيفرة السابقة:
</p>

<pre class="ipsCode">
array(4) {
    ["name"] =&gt; string(4) "Jeff"
    ["age"] =&gt; int(20)
    ["active"] =&gt; bool(true)
    ["colors"] =&gt;
    array(2) {
        [0] =&gt; string(3) "red"
        [1] =&gt; string(4) "blue"
    }
}
</pre>

<p>
	ليس للمعامل الثاني <code>‎$assoc</code> تأثير إذا كان المتغير الذي سيُرجع ليس كائنًا.
</p>

<p>
	<strong>ملاحظة</strong>: ستفقد التمييز بين مصفوفة فارغة وكائن فارغ إذا كنت تستخدم المعامل <code>‎$assoc</code>، أي أنّ تنفيذ <code>json_encode()‎</code> على الخرج المفكوك ترميزه مرةً ثانية سينتج بنية JSON مختلفة.
</p>

<p>
	تعيد الدالة <code>json_decode()‎</code> القيمة <code>NULL</code> إذا كان عمق السلسلة النصية بصيغة JSON أكثر من 512 عنصر (20 عنصر في إصدارات <a href="https://wiki.hsoub.com/PHP" rel="external">PHP </a>أقدم من 5.2.3 أو 128 في الإصدار 5.2.3) بالتعاود (recursion)، يمكن التحكم بهذا الحد في الإصدار 5.3 وما بعده باستخدام المعامل الثالث <code>‎$depth</code> كما هو موضح في الدليل الرسمي للغة PHP:
</p>

<p>
	تنفذ PHP مجموعة عليا من JSON كما ذُكر في <a href="%E2%80%8Fhttp://www.faqs.org/rfcs/rfc4627.html" rel="">RFC 4627</a> - سترمّز أيضًا وتفك ترميز الأنواع العددية و<code>NULL</code>، تدعم RFC 4627 فقط هذه القيم عندما تكون متداخلة ضمن مصفوفة أو كائن. بالرغم من أن هذه المجموعة العليا متوافقة مع التعريف الموسع لنص JSON في <a href="%E2%80%8Fhttp://www.faqs.org/rfcs/rfc7159.html" rel="">RFC 7159</a> الأحدث (الذي يهدف إلى التفوق على RFC 4627) و<a href="%E2%80%8Fhttp://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf" rel="">ECMA-404</a> وهذا قد يسبب مشاكل في قابلية التشغيل المتبادل مع محللات JSON التي تلتزم بدقة بالنوع RFC 4627 عند تشفير قيمة عددية.
</p>

<p>
	يعني هذا أنّ السلسلة النصية البسيطة ستعدّ كائن JSON صحيح في PHP مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_17" style="">
<span class="pln">$json </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="str">'"some string"'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$json</span><span class="pun">,</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
string(11) "some string"
string(8) "No error"
</pre>

<p>
	لكن السلاسل النصية البسيطة التي ليست في مصفوفة أو كائن ليست جزءًا من معيار <a href="%E2%80%8Fhttp://www.faqs.org/rfcs/rfc4627.html" rel="">RFC 4627</a>، أي أن المتفحصات (checkers) على الإنترنت مثل <a href="%E2%80%8Fhttp://www.jslint.com/" rel="">JSLint</a> و<a href="%E2%80%8Fhttps://jsonformatter.curiousconcept.com/" rel="">JSON Formatter &amp; Validator</a> التي تعمل بالنمط RFC 4627 ستعطيك خطأً.
</p>

<p>
	المعامل الثالث للدالة <code>json_decode()‎</code> هو <code>‎$depth</code> يحدد العمق التعاودي (القيمة الافتراضية 512)، أي عدد الكائنات المتداخلة ضمن الكائن الأصلي الذي سيُفَك تشفيره.
</p>

<p>
	المعامل الرابع <code>‎$options</code> يقبل قيمة واحدة حاليًا وهي <code>JSON_BIGINT_AS_STRING</code>، أي أنّ السلوك الافتراضي للدالة (مع عدم وجود هذا المعامل) يحول القيم الصحيحة الكبيرة إلى أعداد عشرية بدلًا من سلاسل نصية.
</p>

<p>
	لا تُعدّ المتغيرات غير الصحيحة ذات الأحرف الكبيرة للكلمات true و‏false وnull دخلًا صحيحًا.
</p>

<p>
	لدينا المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_19" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'tRue'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'tRUe'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'tRUE'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'TRUe'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'TRUE'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">json_decode</span><span class="pun">(</span><span class="str">'true'</span><span class="pun">),</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span></pre>

<p>
	الخرج في الإصدار قبل PHP 5.6:
</p>

<pre class="ipsCode">
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
</pre>

<p>
	أما في الإصدارات اللاحقة:
</p>

<pre class="ipsCode">
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
bool(true)
string(8) "No error"
</pre>

<p>
	ينطبق الأمر أيضًا على false وnull.
</p>

<p>
	لاحظ أنّ الدالة <code>json_decode()‎</code> تُعيد <code>NULL</code> إذا كان من غير الممكن تحويل السلسلة النصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_21" style="">
<span class="com">// غير صحيحة json صيغة</span><span class="pln">
$json </span><span class="pun">=</span><span class="pln"> </span><span class="str">"{'name': 'Jeff', 'age': 20 }"</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

$person </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$json</span><span class="pun">);</span><span class="pln">
</span><span class="com">// null ملاحظة: محاولة الوصول إلى خاصيّة عنصر ليس كائنًا تُرجع</span><span class="pln">
echo $person</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln"> 

echo json_last_error</span><span class="pun">();</span><span class="pln">
</span><span class="com"># 4 (JSON_ERROR_SYNTAX)</span><span class="pln">

echo json_last_error_msg</span><span class="pun">();</span><span class="pln">
</span><span class="com"># unexpected character</span></pre>

<p>
	ليس من الآمن أن نعتمد فقط على القيمة المُرجعة بأن تكون <code>NULL</code> لاكتشاف الأخطاء، فمثلًا إذا كانت السلسلة النصية بصيغة JSON لا تتضمن شيء إلا "null" فإنّ الدالة <code>json_decode()‎</code> ستُرجع <code>null</code> حتى في حال عدم حدوث أخطاء.
</p>

<h2>
	ترميز سلسلة نصية بصيغة JSON
</h2>

<p>
	تحوّل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_encode" rel="">json_encode</a> مصفوفة PHP (أو كائن ينفذ الواجهة <code>JsonSerializable</code> بدءًا من الإصدار PHP 5.4) إلى سلسلة نصية بترميز صيغة JSON وتعيدها، وفي حال الفشل تعيد FALSE.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_23" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Jeff'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'age'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">20</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'active'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'colors'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">],</span><span class="pln">
    </span><span class="str">'values'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pun">=&gt;</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">=&gt;</span><span class="str">'bar'</span><span class="pun">],</span><span class="pln">
</span><span class="pun">];</span></pre>

<p>
	تُحوَّل عند الترميز أنواع بيانات PHP (السلاسل النصية والأعداد الصحيحة والقيم المنطقية) إلى مكافئاتها في JSON، وتُرمَّز المصفوفات الترابطية ككائنات JSON وعند الاستدعاء مع الوسطاء الافتراضيين تُرمَّز المصفوفات المفهرسة كمصفوفات JSON، ما لم تكن مفاتيح المصفوفة سلسلة عددية مستمرة تبدأ من الصفر، فعندها ستُرمَّز المصفوفة ككائن JSON.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_25" style="">
<span class="pln">echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"name":"Jeff","age":20,"active":true,"colors":["red","blue"],"values":{"0":"foo","3":"bar"}}
</pre>

<h3>
	الوسائط
</h3>

<p>
	بدءًا من الإصدار PHP 5.3 فإنّ المعامل الثاني للدالة <code>json_encode</code> هو قناع بتي والذي يمكن أن يكون واحد أو أكثر من التالي، ويمكن دمجه كما هو الحال مع أي قناع بتي مع العامل الثنائي <code>OR |</code>.
</p>

<p>
	<strong>الإصدار PHP 5.3 ومابعده</strong>
</p>

<p>
	<a href="http://xn--https-8t3b/www.php.net/manual/en/json.constants.php#constant.json-force-object" rel="external nofollow">JSON_FORCE_OBJECT</a>: يفرض إنشاء كائن بدلًا من مصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_27" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Joel'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">]];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_FORCE_OBJECT</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
["Joel",23,true,["red","blue"]]
{"0":"Joel","1":23,"2":true,"3":{"0":"red","1":"blue"}}
</pre>

<p>
	<a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-hex-tag" rel="">JSON_HEX_TAG</a>، <a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-hex-amp" rel="">‏JSONHEXAMP</a>، <a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-hex-apos" rel="">‏JSON_HEX_APOS</a>، <a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-hex-quot" rel="">‏JSON_HEX_QUOT</a>.
</p>

<p>
	تضمن الخيارات السابقة التحويلات التالية عند الترميز:
</p>

<table><tbody>
<tr>
<td>
				الثابت
			</td>
			<td>
				الدخل
			</td>
			<td>
				الخرج
			</td>
		</tr>
<tr>
<td>
				JSON_HEX_TAG
			</td>
			<td>
				&lt;
			</td>
			<td>
				\u003C
			</td>
		</tr>
<tr>
<td>
				JSON_HEX_TAG
			</td>
			<td>
				&gt;
			</td>
			<td>
				\u003E
			</td>
		</tr>
<tr>
<td>
				JSON_HEX_AMP
			</td>
			<td>
				&amp;
			</td>
			<td>
				\u0026
			</td>
		</tr>
<tr>
<td>
				JSON_HEX_APOS
			</td>
			<td>
				'
			</td>
			<td>
				\u0027
			</td>
		</tr>
<tr>
<td>
				JSON_HEX_QUOT
			</td>
			<td>
				"
			</td>
			<td>
				\u0022
			</td>
		</tr>
</tbody></table>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_31" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"tag"</span><span class="pun">=&gt;</span><span class="str">"&lt;&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"amp"</span><span class="pun">=&gt;</span><span class="str">"&amp;"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"apos"</span><span class="pun">=&gt;</span><span class="str">"'"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"quot"</span><span class="pun">=&gt;</span><span class="str">"\""</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_HEX_TAG </span><span class="pun">|</span><span class="pln"> JSON_HEX_AMP </span><span class="pun">|</span><span class="pln"> JSON_HEX_APOS </span><span class="pun">|</span><span class="pln"> JSON_HEX_QUOT</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"tag":"&lt;&gt;","amp":"&amp;","apos":"'","quot":"\""}
{"tag":"\u003C\u003E","amp":"\u0026","apos":"\u0027","quot":"\u0022"}
</pre>

<p>
	<strong>الإصدار PHP 5.3 ومابعده</strong>
</p>

<p>
	<a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-numeric-check" rel="">JSON_NUMERIC_CHECK</a>: يضمن تحويل السلاسل النصية العددية إلى أعداد صحيحة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_33" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'23452'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23452</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_NUMERIC_CHECK</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
["23452",23452]
[23452,23452]
</pre>

<p>
	<strong>الإصدار PHP 5.4 ومابعده</strong>
</p>

<p>
	<a href="%E2%80%8Fhttp://php.net/manual/en/json.constants.php#constant.json-pretty-print" rel="">JSON_PRETTY_PRINT</a>: يجعل صيغة JSON مقروءة بسهولة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_35" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">'d'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_PRETTY_PRINT</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"a":1,"b":2,"c":3,"d":4}
{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4
}
</pre>

<p>
	<a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-unescaped-slashes" rel="">JSON_UNESCAPED_SLASHES</a>: يضمّن هذا الخيار خطوط الهروب المائلة الأمامية <code>/</code> في الخرج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_37" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'filename'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'example.txt'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'path'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/full/path/to/file/'</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_UNESCAPED_SLASHES</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"filename":"example.txt","path":"\/full\/path\/to\/file"}
{"filename":"example.txt","path":"/full/path/to/file"}
</pre>

<p>
	<a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-unescaped-unicode" rel="">JSON_UNESCAPED_UNICODE</a>: يضمّن محارف بترميز UTF8 في الخرج بدلًا من السلاسل النصية بترميز يونيكود.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_39" style="">
<span class="pln">$blues </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"english"</span><span class="pun">=&gt;</span><span class="str">"blue"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"norwegian"</span><span class="pun">=&gt;</span><span class="str">"blå"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"german"</span><span class="pun">=&gt;</span><span class="str">"blau"</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$blues</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$blues</span><span class="pun">,</span><span class="pln"> JSON_UNESCAPED_UNICODE</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"english":"blue","norwegian":"bl\u00e5","german":"blau"}
{"english":"blue","norwegian":"blå","german":"blau"}
</pre>

<p>
	<strong>الإصدار PHP 5.5 ومابعده</strong>
</p>

<p>
	<a href="%E2%80%8Fhttps://www.php.net/manual/en/json.constants.php#constant.json-partial-output-on-error" rel="">JSON_PARTIAL_OUTPUT_ON_ERROR</a>: يسمح بمتابعة الترميز حتى لو وُجدت بعض القيم غير قابلة للترميز.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_41" style="">
<span class="pln">$fp </span><span class="pun">=</span><span class="pln"> fopen</span><span class="pun">(</span><span class="str">"foo.txt"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"r"</span><span class="pun">);</span><span class="pln">
$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"file"</span><span class="pun">=&gt;</span><span class="pln">$fp</span><span class="pun">,</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">=&gt;</span><span class="str">"foo.txt"</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> </span><span class="com">// no output</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_PARTIAL_OUTPUT_ON_ERROR</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"file":null,"name":"foo.txt"}
</pre>

<p>
	<strong>الإصدار PHP 5.6 ومابعده</strong>
</p>

<p>
	<a href="http://xn--https-8t3b/www.php.net/manual/en/json.constants.php#constant.json-preserve-zero-fraction" rel="external nofollow">JSON_PRESERVE_ZERO_FRACTION</a>: يضمن ترميز الأعداد العشرية كأعداد عشرية دومًا.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_43" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">5.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5.5</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_PRESERVE_ZERO_FRACTION</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
[5,5.5]
[5.0,5.5]
</pre>

<p>
	<strong>الإصدار PHP 7.1 ومابعده</strong>
</p>

<p>
	<a href="http://xn--https-8t3b/www.php.net/manual/en/json.constants.php#constant.json-unescaped-line-terminators" rel="external nofollow">JSON_UNESCAPED_LINE_TERMINATORS</a>: عندما يُستخدم مع <code>JSON_UNESCAPED_UNICODE</code> يعود إلى سلوك إصدارات PHP القديمة ولا يتجاوز المحرف الفاصل للأسطر <code>U+2028</code> والمحرف الفاصل للفقرات <code>U+2029</code>. بالرغم من أن هذه المحارف صحيحة في JSON فهي غير صحيحة في جافاسكربت لذا فقد تغيّر السلوك الافتراضي للخيار <code>JSON_UNESCAPED_UNICODE</code> في الإصدار PHP 7.1.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_47" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"line"</span><span class="pun">=&gt;</span><span class="str">"\xe2\x80\xa8"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"paragraph"</span><span class="pun">=&gt;</span><span class="str">"\xe2\x80\xa9"</span><span class="pun">];</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_UNESCAPED_UNICODE</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> JSON_UNESCAPED_UNICODE </span><span class="pun">|</span><span class="pln"> JSON_UNESCAPED_LINE_TERMINATORS</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
{"line":"\u2028","paragraph":"\u2029"}
{"line":" ","paragraph":" "}
</pre>

<h2>
	تنقيح أخطاء JSON
</h2>

<p>
	عندما تفشل إحدى الدالتين <code>json_encode</code> أو<code>json_decode</code> في التحليل إلى السلسلة النصية المطلوبة فإنّها تعيد <code>false</code>، ولا تنشر PHP أي أخطاء أو تحذيرات في هذه الحالة إنما تقع المسؤولية على المستخدم الذي يجب أن يستخدم الدالتين <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_last_error" rel="">json_last_error()‎</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_last_error_msg" rel="">json_last_error_msg()‎</a> للتحقق من حدوث أخطاء ومعالجتها وفق التطبيق (تنقيحها، عرض رسالة خطأ وغير ذلك).
</p>

<p>
	يظهر المثال التالي خطأً مشهورًا عند العمل مع JSON وهو الفشل في ترميز/فك ترميز سلسلة نصية بصيغة JSON (بسبب تمرير سلسلة نصية بترميز UTF-8 غير صحيح مثلًا).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_50" style="">
<span class="com">// غير صحيحة JSON سلسلة نصية بصيغة</span><span class="pln">
$jsonString </span><span class="pun">=</span><span class="pln"> json_encode</span><span class="pun">(</span><span class="str">"{'Bad JSON':\xB1\x31}"</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">json_last_error</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> JSON_ERROR_NONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"JSON Error: %s"</span><span class="pun">,</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// JSON Error: Malformed UTF-8 characters, possibly incorrectly encoded</span></pre>

<h3>
	<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_last_error_msg" rel="">json_last_error_msg</a>
</h3>

<p>
	تعيد هذه الدالة رسالة مقروءة من قبل الإنسان للخطأ الأخير الذي حدث عند محاولة ترميز/فك ترميز سلسلة نصية.
</p>

<p>
	تعيد هذه الدالة دومًا سلسلة نصية حتى لو لم يحدث خطأ والرسالة الافتراضية في حال عدم حدوث خطأ هي <code>No Error</code>، وتعيد <code>false</code> إذا حدث خطأ ما (غير معروف).
</p>

<p>
	يجب الحذر عند استخدام هذه الدالة في الحلقات لأنّه سيتم تجاوزها في كل حلقة، ويجب استخدامها فقط للحصول على الرسالة للعرض وليس لاستخدامها في تعليمات التحكم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_54" style="">
<span class="com">// لا تكتب هذه الشيفرة</span><span class="pln">
</span><span class="com">// لأن نتيجة الدالة سلسلة نصية true النتيجة دائمًا</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">json_last_error_msg</span><span class="pun">()){}</span><span class="pln">

</span><span class="com">// ممارسة سيئة</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">json_last_error_msg</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"No Error"</span><span class="pun">){}</span><span class="pln">

</span><span class="com">// (يمكنك كتابة هذا (اختبار العدد الصحيح مع إحدى الثوابت المعرفة مسبقًا‎‏</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">json_last_error</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> JSON_ERROR_NONE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لعرض رسالة فقط وليس للاختبار json_last_error_msg استخدمنا</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"JSON Error: %s"</span><span class="pun">,</span><span class="pln"> json_last_error_msg</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لم تكن هذه الدالة موجودة في الإصدارات السابقة للإصدار PHP 5.5. إليك تنفيذ الترقيع المتعدد (polyfill):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_56" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">function_exists</span><span class="pun">(</span><span class="str">'json_last_error_msg'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> json_last_error_msg</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">static</span><span class="pln"> $ERRORS </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
            JSON_ERROR_NONE </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'No error'</span><span class="pun">,</span><span class="pln">
            JSON_ERROR_DEPTH </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Maximum stack depth exceeded'</span><span class="pun">,</span><span class="pln">
            JSON_ERROR_STATE_MISMATCH </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'State mismatch (invalid or malformed JSON)'</span><span class="pun">,</span><span class="pln">
            JSON_ERROR_CTRL_CHAR </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Control character error, possibly incorrectly encoded'</span><span class="pun">,</span><span class="pln">
            JSON_ERROR_SYNTAX </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Syntax error'</span><span class="pun">,</span><span class="pln">
            JSON_ERROR_UTF8 </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Malformed UTF-8 characters, possibly incorrectly encoded'</span><span class="pln">
        </span><span class="pun">);</span><span class="pln">

        $error </span><span class="pun">=</span><span class="pln"> json_last_error</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> isset</span><span class="pun">(</span><span class="pln">$ERRORS</span><span class="pun">[</span><span class="pln">$error</span><span class="pun">])</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> $ERRORS</span><span class="pun">[</span><span class="pln">$error</span><span class="pun">]</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Unknown error'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/json_last_error" rel="">json_last_error()‎</a>
</h3>

<p>
	تعيد هذه الدالة عددًا صحيحًا مربوطًا بإحدى ثوابت PHP المعرفة مسبقًا.
</p>

<table><tbody>
<tr>
<td>
				<strong>الثابت</strong>
			</td>
			<td>
				<strong>المعنى</strong>
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_NONE
			</td>
			<td>
				لم يحدث أي خطأ
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_DEPTH
			</td>
			<td>
				حدث تجاوز للحد الأقصى لعمق المكدس
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_STATE_MISMATCH
			</td>
			<td>
				صيغة JSON غير صحيحة أو تالفة
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_CTRL_CHAR
			</td>
			<td>
				خطأ محرف التحكم ربما مرمَّز بشكلٍ خاطئ
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_SYNTAX
			</td>
			<td>
				خطأ في الصياغة (منذ الإصدار ‎PHP 5.3.3)
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_UTF8
			</td>
			<td>
				محارف UTF-8 تالفة ربما مرمَّزة بشكلٍ خاطئ (منذ الإصدار‎‎PHP 5.5.0)
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_RECURSION
			</td>
			<td>
				مرجع تعاودي أو أكثر في القيمة المطلوب ترميزها
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_INF_OR_NAN
			</td>
			<td>
				قيمة غير رقمية أو لا نهائية في القيمة المطلوب ترميزها
			</td>
		</tr>
<tr>
<td>
				JSON_ERROR_UNSUPPORTED_TYPE
			</td>
			<td>
				القيمة المُعطاة من نوع لا يمكن ترميزه
			</td>
		</tr>
</tbody></table>
<h2>
	استخدام الواجهة JsonSerializable في كائن
</h2>

<p>
	<strong>الإصدار PHP 5.4 وما بعده</strong>
</p>

<p>
	قد تحتاج عند بناء واجهة برمجة التطبيقات REST (‏Representational state transfer) إلى تقليل بيانات كائن ليُمرَّر إلى تطبيق العميل، ولهذا الهدف يوضّح المثال التالي كيفية استخدام الواجهة JsonSerializable.
</p>

<p>
	في هذا المثال يوسّع الصنف <code>User</code> كائن DB model من تقنية ORM الافتراضية (تقنية ربط الكائنات بالعلاقات).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_58" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">User</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">JsonSerializable</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $id</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $surname</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $username</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $password</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $email</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $date_created</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $date_edit</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $role</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $status</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> jsonSerialize</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
            </span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">,</span><span class="pln">
            </span><span class="str">'surname'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">surname</span><span class="pun">,</span><span class="pln">
            </span><span class="str">'username'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">username
        </span><span class="pun">];</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نضيف تنفيذ <code>JsonSerializable</code> للصنف بتوفير التابع <code>jsonSerialize()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_60" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> jsonSerialize</span><span class="pun">()</span></pre>

<p>
	الآن عند تمرير الكائن <code>User</code> في وحدة تحكم التطبيق (controller) أو السكربت إلى الدالة <code>json_encode()‎</code> ستحصل على مصفوفة معادة بصيغة JSON للتابع <code>jsonSerialize()‎</code> بدلًا من الكائن بأكمله.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_62" style="">
<span class="pln">json_encode</span><span class="pun">(</span><span class="pln">$User</span><span class="pun">);</span></pre>

<p>
	تعيد الشيفرة السابقة:
</p>

<pre class="ipsCode">
{"name":"John", "surname":"Doe", "username" : "TestJson"}
</pre>

<p>
	<strong>مثال قيم الخاصيات</strong>
</p>

<p>
	سيقلل هذا كمية البيانات المُعادة من النقطة النهائية (endpoint) لواجهة برمجة التطبيقات RESTful ويسمح باستبعاد خاصيّات الكائن من تمثيل JSON.
</p>

<p>
	<strong>استخدام الخاصيّات الخاصة والمحمية مع الدالة <code>json_encode()‎</code></strong>
</p>

<p>
	إذا أردت تجنّب استخدام <code>JsonSerializable</code> فمن الممكن استخدام الخاصيّات الخاصة أو المحمية لإخفاء بيانات الصنف من خرج الدالة <code>json_encode()‎</code> وعندها لا يحتاج الصنف إلى تنفيذ الواجهة <code>JsonSerializable</code>.
</p>

<p>
	ترمّز الدالة <code>json_encode()‎</code> الخاصيّات العامة فقط من الصنف إلى صيغة JSON.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_66" style="">
<span class="pun">&lt;?</span><span class="pln">php
    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">User</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// الخاصيّات الخاصة تُستخدم فقط ضمن هذا الصنف</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> $id</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> $date_created</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> $date_edit</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// الخاصيّات المستخدمة في الأصناف الموسّعة</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> $password</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> $email</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> $role</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> $status</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// مشاركة هذه الخاصيّات مع المستخدم النهائي</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> $surname</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> $username</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// هنا jsonSerialize() لا نحتاج لاستخدام</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

$theUser </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">User</span><span class="pun">();</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">json_encode</span><span class="pun">(</span><span class="pln">$theUser</span><span class="pun">));</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
string(44) "{"name":null,"surname":null,"username":null}"
</pre>

<h2>
	ترويسة JSON والرد المُعاد
</h2>

<p>
	نضيف في الشيفرة التالية ترويسة مع نوع المحتوى JSON:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_68" style="">
<span class="pun">&lt;?</span><span class="pln">php
    $result </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'menu1'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'home'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'menu2'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'code php'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'menu3'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'about'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// json إرجاع الرد بصيغة</span><span class="pln">
header</span><span class="pun">(</span><span class="str">'Content-Type: application/json'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// تصريح الترويسة</span><span class="pln">

</span><span class="com">// الترميز</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="kwd">exit</span><span class="pun">();</span></pre>

<p>
	الترويسة موجودة لذا يتمكن التطبيق من اكتشاف ما البيانات المُعادة وكيف يجب معالجتها، ولا حظ أنّ ترويسة المحتوى هي فقط معلومات حول نوع البيانات المُعادة.
</p>

<p>
	إذا كنت تستخدم UTF-8 يمكنك كتابة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_70" style="">
<span class="pln">header</span><span class="pun">(</span><span class="str">"Content-Type: application/json;charset=utf-8"</span><span class="pun">);</span></pre>

<p>
	مثال jQuery:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_72" style="">
<span class="pln">$</span><span class="pun">.</span><span class="pln">ajax</span><span class="pun">({</span><span class="pln">
    url</span><span class="pun">:</span><span class="str">'url_your_page_php_that_return_json'</span><span class="pln">
</span><span class="pun">}).</span><span class="kwd">done</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">data</span><span class="pun">){</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">table</span><span class="pun">(</span><span class="str">'json '</span><span class="pun">,</span><span class="pln">data</span><span class="pun">);</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Menu1: '</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">.</span><span class="pln">menu1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<h2>
	إنشاء ملف XML باستخدام DomDocument
</h2>

<p>
	نحتاج لإنشاء ملف <code>XML</code> باستخدام الصنف <code>DOMDocument</code> إلى إنشاء كل الوسوم والخاصيّات باستخدام التابعين <code>createElement()‎</code> و<code>createAttribute()‎</code> اللذين ينشئان بنية <code>XML</code> باستخدام التابع <code>appendChild()‎</code>.
</p>

<p>
	يتضمن المثال التالي وسوم وخاصيات وقسم CDATA (‏Character Data) وفضاء اسم مختلف للوسم الثاني:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_74" style="">
<span class="pln">$dom </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMDocument</span><span class="pun">(</span><span class="str">'1.0'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'utf-8'</span><span class="pun">);</span><span class="pln">
$dom</span><span class="pun">-&gt;</span><span class="pln">preserveWhiteSpace </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
$dom</span><span class="pun">-&gt;</span><span class="pln">formatOutput </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// إنشاء الوسوم الأساسية دون القيم</span><span class="pln">
$books </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'books'</span><span class="pun">);</span><span class="pln">
$book_1 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'book'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// إنشاء بعض الوسوم مع قيم</span><span class="pln">
$name_1 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'name'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'PHP - An Introduction'</span><span class="pun">);</span><span class="pln">
$price_1 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'price'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'$5.95'</span><span class="pun">);</span><span class="pln">
$id_1 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// إنشاء وإضافة خاصية</span><span class="pln">
$attr_1 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createAttribute</span><span class="pun">(</span><span class="str">'version'</span><span class="pun">);</span><span class="pln">
$attr_1</span><span class="pun">-&gt;</span><span class="pln">value </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1.0'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// إضافة الخاصية</span><span class="pln">
$id_1</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$attr_1</span><span class="pun">);</span><span class="pln">

</span><span class="com">// الثاني بفضاء اسم مختلف book إنشاء</span><span class="pln">
$namespace </span><span class="pun">=</span><span class="pln"> </span><span class="str">'www.example.com/libraryns/1.0'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// books تضمين بادئة فضاء الاسم في الوسم</span><span class="pln">
$books</span><span class="pun">-&gt;</span><span class="pln">setAttributeNS</span><span class="pun">(</span><span class="str">'http://www.w3.org/2000/xmlns/'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'xmlns:ns'</span><span class="pun">,</span><span class="pln"> $namespace</span><span class="pun">);</span><span class="pln">
$book_2 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElementNS</span><span class="pun">(</span><span class="pln">$namespace</span><span class="pun">,</span><span class="str">'ns:book'</span><span class="pun">);</span><span class="pln">
$name_2 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElementNS</span><span class="pun">(</span><span class="pln">$namespace</span><span class="pun">,</span><span class="pln"> </span><span class="str">'ns:name'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// name أخرى ووضعه ضمن الوسم DOMNode الذي هو نسخة CDATA إنشاء قسم</span><span class="pln">
$name_cdata </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createCDATASection</span><span class="pun">(</span><span class="str">'PHP - Advanced'</span><span class="pun">);</span><span class="pln">
$name_2</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$name_cdata</span><span class="pun">);</span><span class="pln">
$price_2 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElementNS</span><span class="pun">(</span><span class="pln">$namespace</span><span class="pun">,</span><span class="pln"> </span><span class="str">'ns:price'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'$25.00'</span><span class="pun">);</span><span class="pln">
$id_2 </span><span class="pun">=</span><span class="pln"> $dom</span><span class="pun">-&gt;</span><span class="pln">createElementNS</span><span class="pun">(</span><span class="pln">$namespace</span><span class="pun">,</span><span class="pln"> </span><span class="str">'ns:id'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'2'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// XML إنشاء ملف</span><span class="pln">
$books</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$book_1</span><span class="pun">);</span><span class="pln">
$book_1</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$name_1</span><span class="pun">);</span><span class="pln">
$book_1</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$price_1</span><span class="pun">);</span><span class="pln">
$book_1</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$id_1</span><span class="pun">);</span><span class="pln">
$books</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$book_2</span><span class="pun">);</span><span class="pln">
$book_2</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$name_2</span><span class="pun">);</span><span class="pln">
$book_2</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$price_2</span><span class="pun">);</span><span class="pln">
$book_2</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$id_2</span><span class="pun">);</span><span class="pln">

$dom</span><span class="pun">-&gt;</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">$books</span><span class="pun">);</span><span class="pln">

</span><span class="com">// في سلسلة نصية XML ملف saveXML() يعيد التابع</span><span class="pln">
print_r </span><span class="pun">(</span><span class="pln">$dom</span><span class="pun">-&gt;</span><span class="pln">saveXML</span><span class="pun">());</span></pre>

<p>
	ستنتج الشيفرة السابقة ملف <code>XML</code> التالي:
</p>

<pre class="ipsCode">
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;books xmlns:ns="www.example.com/libraryns/1.0"&gt;
    &lt;book&gt;
        &lt;name&gt;PHP - An Introduction&lt;/name&gt;
        &lt;price&gt;$5.95&lt;/price&gt;
        &lt;id version="1.0"&gt;1&lt;/id&gt;
    &lt;/book&gt;
    &lt;ns:book&gt;
        &lt;ns:name&gt;&lt;![CDATA[PHP - Advanced]]&gt;&lt;/ns:name&gt;
        &lt;ns:price&gt;$25.00&lt;/ns:price&gt;
        &lt;ns:id&gt;2&lt;/ns:id&gt;
    &lt;/ns:book&gt;
&lt;/books&gt;
</pre>

<h2>
	قراءة ملف XML باستخدام DOMDocument
</h2>

<p>
	يمكن استخدام الصنف <code>DOMDocument</code> بطريقة مشابهة لاستخدام <code>SimpleXML</code> لتحليل <code>XML</code> من سلسلة نصية أو من ملف <code>XML</code>.
</p>

<ul>
<li>
		من سلسلة نصية:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_77" style="">
<span class="pln">$doc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMDocument</span><span class="pun">();</span><span class="pln">
$doc</span><span class="pun">-&gt;</span><span class="pln">loadXML</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">);</span></pre>

<ul>
<li>
		من ملف:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_79" style="">
<span class="pln">$doc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMDocument</span><span class="pun">();</span><span class="pln">
</span><span class="com">// استخدم مسار الملف الفعلي النسبي أو المطلق</span><span class="pln">
$doc</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">(</span><span class="str">'books.xml'</span><span class="pun">);</span></pre>

<p>
	مثال عن التحليل: بفرض لدينا صيغة <code>XML</code> التالية:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_81" style="">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"UTF-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;books&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;name&gt;</span><span class="pln">PHP - An Introduction</span><span class="tag">&lt;/name&gt;</span><span class="pln">
        </span><span class="tag">&lt;price&gt;</span><span class="pln">$5.95</span><span class="tag">&lt;/price&gt;</span><span class="pln">
        </span><span class="tag">&lt;id&gt;</span><span class="pln">1</span><span class="tag">&lt;/id&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;name&gt;</span><span class="pln">PHP - Advanced</span><span class="tag">&lt;/name&gt;</span><span class="pln">
        </span><span class="tag">&lt;price&gt;</span><span class="pln">$25.00</span><span class="tag">&lt;/price&gt;</span><span class="pln">
        </span><span class="tag">&lt;id&gt;</span><span class="pln">2</span><span class="tag">&lt;/id&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
</span><span class="tag">&lt;/books&gt;</span></pre>

<p>
	هذا مثال شيفرة لتحليل الصيغة السابقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_83" style="">
<span class="pln">$books </span><span class="pun">=</span><span class="pln"> $doc</span><span class="pun">-&gt;</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'book'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$books </span><span class="kwd">as</span><span class="pln"> $book</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $title </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'name'</span><span class="pun">)-&gt;</span><span class="pln">item</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)-&gt;</span><span class="pln">nodeValue</span><span class="pun">;</span><span class="pln">
    $price </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'price'</span><span class="pun">)-&gt;</span><span class="pln">item</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)-&gt;</span><span class="pln">nodeValue</span><span class="pun">;</span><span class="pln">
    $id </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">getElementsByTagName</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">)-&gt;</span><span class="pln">item</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)-&gt;</span><span class="pln">nodeValue</span><span class="pun">;</span><span class="pln">
    print_r </span><span class="pun">(</span><span class="str">"The title of the book $id is $title and it costs $price."</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سينتج عنها الخرج التالي:
</p>

<pre class="ipsCode">
The title of the book 1 is PHP - An Introduction and it costs $5.95.
The title of the book 2 is PHP - Advanced and it costs $25.00.
</pre>

<h2>
	الاستفادة من XML مع مكتبة SimpleXML في PHP
</h2>

<p>
	تعد <code>SimpleXML</code> مكتبة قوية تحوّل السلاسل النصية بصيغة <code>XML</code> إلى صيغة سهلة لاستخدام كائن PHP.
</p>

<p>
	بفرض لدينا بنية XML التالية:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_85" style="">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"UTF-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;document&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">StackOverflow SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">Another SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">Stack Overflow Community</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">FooBar</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
</span><span class="tag">&lt;/document&gt;</span></pre>

<p>
	<strong>قراءة بياناتنا في <code>SimpleXML</code></strong>
</p>

<p>
	نحتاج بدايةً إلى قراءة بياناتنا في <code>SimpleXML</code>، يمكننا ذلك باستخدام 3 طرق مختلفة. يمكننا أولًا <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.simplexml-import-dom.php" rel="">تحميل البيانات من عقدة DOM</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_87" style="">
<span class="pln">$xmlElement </span><span class="pun">=</span><span class="pln"> simplexml_import_dom</span><span class="pun">(</span><span class="pln">$domNode</span><span class="pun">);</span></pre>

<p>
	الخيار الثاني لدينا هو <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.simplexml-load-file.php" rel="">تحميل البيانات من ملف XML</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_89" style="">
<span class="pln">$xmlElement </span><span class="pun">=</span><span class="pln"> simplexml_load_file</span><span class="pun">(</span><span class="pln">$filename</span><span class="pun">);</span></pre>

<p>
	أخيرًا يمكننا <a href="https://www.php.net/manual/en/function.simplexml-load-string.php" rel="external nofollow">تحميل البيانات من متغير</a>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_91" style="">
<span class="pln">$xmlString = '</span><span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"UTF-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;document&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">StackOverflow SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">Another SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">Stack Overflow Community</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">FooBar</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
</span><span class="tag">&lt;/document&gt;</span><span class="pln">';
$xmlElement = simplexml_load_string($xmlString);</span></pre>

<p>
	سواء اخترنا التحميل من <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.simplexml-import-dom.php" rel="">عنصر DOM</a> أو من <a href="https://www.php.net/manual/en/function.simplexml-load-file.php" rel="external nofollow">ملف</a> أو من <a href="https://www.php.net/manual/en/function.simplexml-load-string.php" rel="external nofollow">سلسلة نصية</a> ستحصل على متغير من الصنف <code>SimpleXMLElement</code> يدعى <code>‎$xmlElement</code> ويمكننا الآن البدء باستخدام XML في PHP.
</p>

<p>
	<strong>الوصول إلى بيانات SimpleXML</strong>
</p>

<p>
	أسهل طريقة للوصول إلى البيانات في عنصر <code>SimpleXMLElement</code> هي <a href="https://www.php.net/manual/en/simplexml.examples-basic.php#example-6325" rel="external nofollow">استدعاء الخاصيّات مباشرةً</a>، يمكننا الوصول إلى <code>bookName</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_93" style="">
<span class="pln">echo $xmlElement</span><span class="pun">-&gt;</span><span class="pln">book</span><span class="pun">-&gt;</span><span class="pln">bookName</span><span class="pun">;</span></pre>

<p>
	تفترض <code>SimpleXML</code> عند هذه النقطة أننا نريد الكتاب الأول لأننا لم نذكر بشكلٍ صريح أي كتاب نريده، ويمكننا اختيار كتاب غير الكتاب الأول بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_95" style="">
<span class="pln">echo $xmlElement</span><span class="pun">-&gt;</span><span class="pln">book</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]-&gt;</span><span class="pln">bookName</span><span class="pun">;</span></pre>

<p>
	ويجب ملاحظة أنّ استخدام <code>[0]</code> يكافئ عدم استخدام شيء أي أنّ:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_97" style="">
<span class="pln">$xmlElement</span><span class="pun">-&gt;</span><span class="pln">book</span></pre>

<p>
	تعمل نفس عمل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_99" style="">
<span class="pln">$xmlElement</span><span class="pun">-&gt;</span><span class="pln">book</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span></pre>

<p>
	<strong>تمرير حلقة عبر XML</strong>
</p>

<p>
	يوجد عدة أسباب لرغبتك في <a href="%E2%80%8Fhttps://www.php.net/manual/en/simplexml.examples-basic.php#example-6327" rel="">تكرار حلقة عبر XML</a> مثل أن يكون عندك عدد كبير من العناصر، الكتب في مثالنا، تريد عرضه في صفحة ويب، عندها يمكنك استخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/foreach%E2%80%8F%E2%80%8F" rel="">حلقة foreach</a> أو<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/for" rel="">حلقة for</a> المعيارية مستفيدين من إيجابيات <a href="https://www.php.net/manual/en/simplexmlelement.count.php" rel="external nofollow">دالة SimpleXMLElement للعد</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_101" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $xmlElement</span><span class="pun">-&gt;</span><span class="pln">book </span><span class="kwd">as</span><span class="pln"> $thisBook </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $thisBook</span><span class="pun">-&gt;</span><span class="pln">bookName
</span><span class="pun">}</span></pre>

<p>
	أو
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_103" style="">
<span class="pln">$count </span><span class="pun">=</span><span class="pln"> $xmlElement</span><span class="pun">-&gt;</span><span class="pln">count</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">&lt;</span><span class="pln">$count</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $xmlElement</span><span class="pun">-&gt;</span><span class="pln">book</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]-&gt;</span><span class="pln">bookName</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>معالجة الأخطاء</strong>
</p>

<p>
	وصلنا الآن إلى النهاية ومن المهم أن ندرك أننا نخطئ كبشر ومن المحتمل أن نواجه أخطاء خاصةً إذا كنا نتعامل مع ملفات <code>XML</code> مختلفة لذا نريد معالجة هذه الأخطاء.
</p>

<p>
	بفرض أننا أنشأنا ملف <code>XML</code> ستلاحظ إذا كان هذا الملف يشبه الملف الذي أنشأناه سابقًا ستكون فيه مشكلة وهي أنّ وسم الإغلاق <code>‎/doc‎</code> بدلًا من <code>‎/document</code>.
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_105" style="">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"UTF-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;document&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">StackOverflow SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookName&gt;</span><span class="pln">Another SimpleXML Example</span><span class="tag">&lt;/bookName&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">Stack Overflow Community</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">PHP Programmer</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
        </span><span class="tag">&lt;bookAuthor&gt;</span><span class="pln">FooBar</span><span class="tag">&lt;/bookAuthor&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
</span><span class="tag">&lt;/doc&gt;</span></pre>

<p>
	بفرض أننا حمّلناه ضمن شيفرة PHP كمتغير <code>‎$file</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_107" style="">
<span class="pln">libxml_use_internal_errors</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
$xmlElement </span><span class="pun">=</span><span class="pln"> simplexml_load_file</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $xmlElement </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $errors </span><span class="pun">=</span><span class="pln"> libxml_get_errors</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $errors </span><span class="kwd">as</span><span class="pln"> $thisError </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $thisError</span><span class="pun">-&gt;</span><span class="pln">level </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">case</span><span class="pln"> LIBXML_ERR_FATAL</span><span class="pun">:</span><span class="pln">
                echo </span><span class="str">"FATAL ERROR: "</span><span class="pun">;</span><span class="pln">
                </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">case</span><span class="pln"> LIBXML_ERR_ERROR</span><span class="pun">:</span><span class="pln">
                echo </span><span class="str">"Non Fatal Error: "</span><span class="pun">;</span><span class="pln">
                </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">case</span><span class="pln"> LIBXML_ERR_WARNING</span><span class="pun">:</span><span class="pln">
                echo </span><span class="str">"Warning: "</span><span class="pun">;</span><span class="pln">
                </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        echo $thisError</span><span class="pun">-&gt;</span><span class="pln">code </span><span class="pun">.</span><span class="pln"> PHP_EOL </span><span class="pun">.</span><span class="pln">
            </span><span class="str">'Message: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $thisError</span><span class="pun">-&gt;</span><span class="pln">message </span><span class="pun">.</span><span class="pln"> PHP_EOL </span><span class="pun">.</span><span class="pln">
            </span><span class="str">'Line: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $thisError</span><span class="pun">-&gt;</span><span class="pln">line </span><span class="pun">.</span><span class="pln"> PHP_EOL </span><span class="pun">.</span><span class="pln">
            </span><span class="str">'Column: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $thisError</span><span class="pun">-&gt;</span><span class="pln">column </span><span class="pun">.</span><span class="pln"> PHP_EOL </span><span class="pun">.</span><span class="pln">
            </span><span class="str">'File: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $thisError</span><span class="pun">-&gt;</span><span class="pln">file</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    libxml_clear_errors</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'Happy Days'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون النتيجة:
</p>

<pre class="ipsCode">
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
</pre>

<p>
	لكن بمجرد حل هذه المشكلة سنرى الخرج "Happy Days".
</p>

<h2>
	إنشاء ملف XML باستخدام الصنف XMLWriter
</h2>

<p>
	ننشئ نسخة كائن <code>XMLWriter</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_109" style="">
<span class="pln">$xml </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XMLWriter</span><span class="pun">();</span></pre>

<p>
	ثم نفتح الملف الذي نريد الكتابة فيه فمثلًا إذا أردنا الكتابة في <code>‎/var/www/example.com/xml/output.xml</code> نكتب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6169_111" style="">
<span class="pln">$xml</span><span class="pun">-&gt;</span><span class="pln">openUri</span><span class="pun">(</span><span class="str">'file:///var/www/example.com/xml/output.xml'</span><span class="pun">);</span></pre>

<p>
	نكتب الشيفرة التالية للبدء بالملف (إنشاء وسم بداية ملف <code>XML</code>):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_113" style="">
<span class="pln">$xml</span><span class="pun">-&gt;</span><span class="pln">startDocument</span><span class="pun">(</span><span class="str">'1.0'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'utf-8'</span><span class="pun">);</span></pre>

<p>
	ستؤدي إلى الخرج:
</p>

<pre class="ipsCode">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
</pre>

<p>
	يمكننا الآن البدء بكتابة العناصر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_115" style="">
<span class="pln">$xml</span><span class="pun">-&gt;</span><span class="pln">writeElement</span><span class="pun">(</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">);</span></pre>

<p>
	سينتج <code>XML</code> التالي:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_117" style="">
<span class="tag">&lt;foo&gt;</span><span class="pln">bar</span><span class="tag">&lt;/foo&gt;</span></pre>

<p>
	إذا كنت تحتاج شيئًا أكثر تعقيدًا من العقد البسيطة والقيم الواضحة يمكنك أن تبدأ عنصر وتضيف خاصيّات إليه قبل إنهائه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_119" style="">
<span class="pln">$xml</span><span class="pun">-&gt;</span><span class="pln">startElement</span><span class="pun">(</span><span class="str">'foo'</span><span class="pun">);</span><span class="pln">
$xml</span><span class="pun">-&gt;</span><span class="pln">writeAttribute</span><span class="pun">(</span><span class="str">'bar'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'baz'</span><span class="pun">);</span><span class="pln">
$xml</span><span class="pun">-&gt;</span><span class="pln">writeCdata</span><span class="pun">(</span><span class="str">'Lorem ipsum'</span><span class="pun">);</span><span class="pln">
$xml</span><span class="pun">-&gt;</span><span class="pln">endElement</span><span class="pun">();</span></pre>

<p>
	سينتج الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_121" style="">
<span class="tag">&lt;foo</span><span class="pln"> </span><span class="atn">bar</span><span class="pun">=</span><span class="atv">"baz"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[Lorem ipsum]]&gt;</span><span class="tag">&lt;/foo&gt;</span></pre>

<h2>
	قراءة ملف XML باستخدام SimpleXML
</h2>

<p>
	يمكنك تحليل <code>XML</code> من سلسلة نصية أو من ملف <code>XML</code>.
</p>

<ul>
<li>
		من سلسلة نصية:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_123" style="">
<span class="pln">$xml_obj </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">);</span></pre>

<ul>
<li>
		من ملف:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_127" style="">
<span class="pln">$xml_obj </span><span class="pun">=</span><span class="pln"> simplexml_load_file</span><span class="pun">(</span><span class="str">'books.xml'</span><span class="pun">);</span></pre>

<p>
	<strong>مثال عن التحليل:</strong>
</p>

<p>
	بفرض لدينا ملف <code>XML</code> التالي:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_6169_129" style="">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"UTF-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;books&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;name&gt;</span><span class="pln">PHP - An Introduction</span><span class="tag">&lt;/name&gt;</span><span class="pln">
        </span><span class="tag">&lt;price&gt;</span><span class="pln">$5.95</span><span class="tag">&lt;/price&gt;</span><span class="pln">
        </span><span class="tag">&lt;id&gt;</span><span class="pln">1</span><span class="tag">&lt;/id&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
    </span><span class="tag">&lt;book&gt;</span><span class="pln">
        </span><span class="tag">&lt;name&gt;</span><span class="pln">PHP - Advanced</span><span class="tag">&lt;/name&gt;</span><span class="pln">
        </span><span class="tag">&lt;price&gt;</span><span class="pln">$25.00</span><span class="tag">&lt;/price&gt;</span><span class="pln">
        </span><span class="tag">&lt;id&gt;</span><span class="pln">2</span><span class="tag">&lt;/id&gt;</span><span class="pln">
    </span><span class="tag">&lt;/book&gt;</span><span class="pln">
</span><span class="tag">&lt;/books&gt;</span></pre>

<p>
	هذا مثال شيفرة لتحليله:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_131" style="">
<span class="pln">$xml </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="pln">$xml_string</span><span class="pun">);</span><span class="pln">
$books </span><span class="pun">=</span><span class="pln"> $xml</span><span class="pun">-&gt;</span><span class="pln">book</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$books </span><span class="kwd">as</span><span class="pln"> $book</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $id </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">id</span><span class="pun">;</span><span class="pln">
    $title </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
    $price </span><span class="pun">=</span><span class="pln"> $book</span><span class="pun">-&gt;</span><span class="pln">price</span><span class="pun">;</span><span class="pln">
    print_r </span><span class="pun">(</span><span class="str">"The title of the book $id is $title and it costs $price."</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سينتج عنها الخرج التالي:
</p>

<pre class="ipsCode">
The title of the book 1 is PHP - An Introduction and it costs $5.95.
The title of the book 2 is PHP - Advanced and it costs $25.00.
</pre>

<h2>
	مكتبة SimpleXML
</h2>

<h3>
	تحميل بيانات XML إلى simplexml
</h3>

<p>
	<strong>التحميل من سلسلة نصية</strong>
</p>

<p>
	نستخدم <code>simplexml_load_string</code> لإنشاء <code>SimpleXMLElement</code> من سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_133" style="">
<span class="pln">$xmlString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;?xml version='1.0' encoding='UTF-8'?&gt;"</span><span class="pun">;</span><span class="pln">
$xml </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="pln">$xmlString</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">or</span><span class="pln"> </span><span class="kwd">die</span><span class="pun">(</span><span class="str">"Error: Cannot create object"</span><span class="pun">);</span></pre>

<p>
	لاحظ أنّه يجب استخدام <code>or</code> وليس <code>||</code> لأنّ أولوية <code>or</code> أعلى من <code>=</code>، وستُنفَّذ الشيفرة بعد <code>or</code> فقط إذا كانت نتيجة <code>‎$xml</code> هي <code>false</code>.
</p>

<p>
	<strong>التحميل من ملف</strong> نستخدم <code>simplexml_load_file</code> لتحميل بيانات <code>XML</code> من ملف أو رابط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_135" style="">
<span class="pln">$xml </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="str">"filePath.xml"</span><span class="pun">);</span><span class="pln">
$xml </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="str">"https://example.com/doc.xml"</span><span class="pun">);</span></pre>

<p>
	يمكن أن يكون الرابط من أي <a href="%E2%80%8Fhttps://www.php.net/wrappers" rel="">مخطط تدعمه PHP</a> ?أو مُغلِّف مجرى مخصص.
</p>

<h2>
	تحليل HTML
</h2>

<h3>
	تحليل HTML من سلسلة نصية
</h3>

<p>
	تنفّذ PHP محللًا متوافقًا مع DOM المستوى 2 مما يسمح لنا بالعمل مع HTML باستخدام التوابع المعروفة مثل <code>getElementById()‎</code> أو<code>appendChild()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_137" style="">
<span class="pln">$html </span><span class="pun">=</span><span class="pln"> </span><span class="str">'&lt;html&gt;&lt;body&gt;&lt;span id="text"&gt;Hello, World!&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;'</span><span class="pun">;</span><span class="pln">

$doc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMDocument</span><span class="pun">();</span><span class="pln">
libxml_use_internal_errors</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
$doc</span><span class="pun">-&gt;</span><span class="pln">loadHTML</span><span class="pun">(</span><span class="pln">$html</span><span class="pun">);</span><span class="pln">

echo $doc</span><span class="pun">-&gt;</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"text"</span><span class="pun">)-&gt;</span><span class="pln">textContent</span><span class="pun">;</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
Hello, World!
</pre>

<p>
	لاحظ أنّ PHP ستصدر تحذيرات بشأن مشاكل HTML التي قد تحدث، خاصةً إذا كنت تستورد جزء من ملف، لتجنب هذه التحذيرات نخبر مكتبة DOM ‏(libxml) أن تعالج أخطائها قبل استيراد HTML باستدعاء <a href="%E2%80%8Fhttp://php.net/manual/en/function.libxml-use-internal-errors.php" rel="">libxml_use_internal_errors()‎</a>، ويمكنك بعدها استخدام <a href="%E2%80%8Fhttp://php.net/manual/en/function.libxml-get-errors.php%E2%80%8F" rel="">libxml</a>_<a href="%E2%80%8Fhttp://php.net/manual/en/function.libxml-get-errors.php%E2%80%8F" rel="">get_errors()‎</a> لمعالجة الأخطاء عند الحاجة.
</p>

<h3>
	استخدام XPath
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_139" style="">
<span class="pln">$html </span><span class="pun">=</span><span class="pln"> </span><span class="str">'&lt;html&gt;&lt;body&gt;&lt;span class="text"&gt;Hello, World!&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;'</span><span class="pun">;</span><span class="pln">

$doc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMDocument</span><span class="pun">();</span><span class="pln">
$doc</span><span class="pun">-&gt;</span><span class="pln">loadHTML</span><span class="pun">(</span><span class="pln">$html</span><span class="pun">);</span><span class="pln">
$xpath </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DOMXPath</span><span class="pun">(</span><span class="pln">$doc</span><span class="pun">);</span><span class="pln">
$span </span><span class="pun">=</span><span class="pln"> $xpath</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"//span[@class='text']"</span><span class="pun">)-&gt;</span><span class="pln">item</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">

echo $span</span><span class="pun">-&gt;</span><span class="pln">textContent</span><span class="pun">;</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
Hello, World!
</pre>

<h3>
	SimpleXML
</h3>

<p>
	<code>SimpleXML</code> هي مكتبة PHP توفر طريقة سهلة للتعامل مع ملفات <code>XML</code> (خاصةً القراءة والتكرار عبر بيانات <code>XML</code>)، القيد الوحيد هو أنّ ملف <code>XML</code> يجب أن يكون مُصاغ جيدًا (well-formed).
</p>

<p>
	<strong>تحليل XML باستخدام المنهجية الإجرائية</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_141" style="">
<span class="com">// XML تحميل سلسلة نصية</span><span class="pln">
$xmlstr </span><span class="pun">=</span><span class="pln"> file_get_contents</span><span class="pun">(</span><span class="str">'library.xml'</span><span class="pun">);</span><span class="pln">
$library </span><span class="pun">=</span><span class="pln"> simplexml_load_string</span><span class="pun">(</span><span class="pln">$xmlstr</span><span class="pun">);</span><span class="pln">

</span><span class="com">// XML تحميل ملف</span><span class="pln">
$library </span><span class="pun">=</span><span class="pln"> simplexml_load_file</span><span class="pun">(</span><span class="str">'library.xml'</span><span class="pun">);</span></pre>

<p>
	لتحميل ملف <code>XML</code> يمكنك كتابة مسار الملف المحلي أو رابط صالح إذا كان الإعداد <code>allow_url_fopen</code> مضبوطًا إلى "On" في php.ini.
</p>

<p>
	<strong>تحليل XML باستخدام المنهجية الكائنية التوجه</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_143" style="">
<span class="com">// XML تحميل سلسلة نصية</span><span class="pln">
$xmlstr </span><span class="pun">=</span><span class="pln"> file_get_contents</span><span class="pun">(</span><span class="str">'library.xml'</span><span class="pun">);</span><span class="pln">
$library </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SimpleXMLElement</span><span class="pun">(</span><span class="pln">$xmlstr</span><span class="pun">);</span><span class="pln">

</span><span class="com">// XML تحميل ملف</span><span class="pln">
$library </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SimpleXMLElement</span><span class="pun">(</span><span class="str">'library.xml'</span><span class="pun">,</span><span class="pln"> NULL</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span></pre>

<p>
	<strong>الوصول إلى الأبناء والخاصيّات</strong>
</p>

<p>
	عندما تحلل <code>SimpleXML</code> ملف <code>XML</code> تحوّل كل عناصر <code>XML</code> فيه، أو العقد، إلى خاصيّات لكائن <code>SimpleXMLElement</code> ناتج، وتحوّل خاصيّات <code>XML</code> إلى مصفوفة ترابطية يمكن الوصول إليها من الخاصيّة التي تعود لها.
</p>

<ul>
<li>
		عندما تعرف أسمائهم:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_145" style="">
<span class="pln">$library </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SimpleXMLElement</span><span class="pun">(</span><span class="str">'library.xml'</span><span class="pun">,</span><span class="pln"> NULL</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$library</span><span class="pun">-&gt;</span><span class="pln">book </span><span class="kwd">as</span><span class="pln"> $book</span><span class="pun">){</span><span class="pln">
    echo $book</span><span class="pun">[</span><span class="str">'isbn'</span><span class="pun">];</span><span class="pln">
    echo $book</span><span class="pun">-&gt;</span><span class="pln">title</span><span class="pun">;</span><span class="pln">
    echo $book</span><span class="pun">-&gt;</span><span class="pln">author</span><span class="pun">;</span><span class="pln">
    echo $book</span><span class="pun">-&gt;</span><span class="pln">publisher</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	العيب الأساسي لهذه المنهجية أنّه من الضروري معرفة اسم كل عنصر وخاصية في ملف XML.
</p>

<ul>
<li>
		عندما لا تعرف أسمائهم (أو لا تريد معرفتهم):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6169_147" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$library</span><span class="pun">-&gt;</span><span class="pln">children</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $child</span><span class="pun">){</span><span class="pln">
    echo $child</span><span class="pun">-&gt;</span><span class="pln">getName</span><span class="pun">();</span><span class="pln">

    </span><span class="com">// الحصول على خاصيّات هذا العنصر</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$child</span><span class="pun">-&gt;</span><span class="pln">attributes</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $attr</span><span class="pun">){</span><span class="pln">
        echo </span><span class="str">' '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $attr</span><span class="pun">-&gt;</span><span class="pln">getName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">': '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $attr</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// الحصول على الأبناء</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$child</span><span class="pun">-&gt;</span><span class="pln">children</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $subchild</span><span class="pun">){</span><span class="pln">
        echo </span><span class="str">' '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $subchild</span><span class="pun">-&gt;</span><span class="pln">getName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">': '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $subchild</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [JSON - XML - SimpleXML - Parsing HTML] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-classes-%D9%88%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-objects-%D9%81%D9%8A-php-r1079/" rel="">الأصناف (Classes) والكائنات (Objects) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84%D9%87%D8%A7-%D9%81%D9%8A-php-r1077/" rel="">تنسيق النصوص وتحليلها في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1078</guid><pubDate>Thu, 26 Nov 2020 13:00:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x648;&#x62A;&#x62D;&#x644;&#x64A;&#x644;&#x647;&#x627; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84%D9%87%D8%A7-%D9%81%D9%8A-php-r1077/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/12.png.aa9152543cccd796c53bbc33efa9d6ec.png" /></p>
<h2>
	استيفاء السلسلة النصية
</h2>

<p>
	يمكنك استخدام الاستيفاء لتستوفي (تُدرج) متغير في سلسلة نصية (string)، يعمل الاستيفاء مع السلاسل النصية ذات الاقتباس المزدوج وصياغة <code>heredoc</code> فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_7" style=""><span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Joel'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Joel بالاسم $name سيُستبدل المتغير</span><span class="pln">
echo </span><span class="str">"&lt;p&gt;Hello $name, Nice to see you.&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "&lt;p&gt;Hello Joel, Nice to see you.&lt;/p&gt;"</span><span class="pln">

</span><span class="com">// كنص خام $name السلاسل النصية ذات الاقتباس المفرد تُظهر المتغير</span><span class="pln">
echo </span><span class="str">'Hello $name, Nice to see you.'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "Hello $name, Nice to see you."</span></pre>

<p>
	يوفر تنسيق <a href="%E2%80%8Fhttps://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex" rel="">الصياغة المعقدة (صياغة الأقواس المعقوصة)</a> خيارًا آخر يتطلّب أن تغلّف المتغير بأقواس معقوصة <code>{}</code>، يمكن أن يكون هذا مفيدًا عند تضمين المتغيرات في المحتوى النصي للمساعدة في منع الالتباس المحتمل بين المحتوى النصي والمتغيرات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_9" style=""><span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Joel'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// $name مثال باستخدام الأقواس المعقوصة للمتغير</span><span class="pln">
echo </span><span class="str">"&lt;p&gt;We need more {$name}s to help us!&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "&lt;p&gt;We need more Joels to help us!&lt;/p&gt;"</span><span class="pln">

</span><span class="com">// غير معرّف `$names` السطر التالي سيرمي خطأً لأنّ</span><span class="pln">
echo </span><span class="str">"&lt;p&gt;We need more $names to help us!&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "Notice: Undefined variable: names"</span></pre>

<p>
	تستوفي صياغة الأقواس المعقوصة <code>{}</code> المتغيرات التي تبدأ بالرمز <code>$</code> داخل سلسلة نصية، ولا تقيّم تعابير PHP العشوائية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_11" style=""><span class="com">// PHP مثال يحاول استيفاء تعبير</span><span class="pln">
echo </span><span class="str">"1 + 2 = {1 + 2}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "1 + 2 = {1 + 2}"</span><span class="pln">

</span><span class="com">// مثال لاستخدام ثابت</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"HELLO_WORLD"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hello World!!"</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"My constant is {HELLO_WORLD}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "My constant is {HELLO_WORLD}"</span><span class="pln">

</span><span class="com">// مثال لاستخدام دالة</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> say_hello</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"Hello!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
echo </span><span class="str">"I say: {say_hello()}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "I say: {say_hello()}"</span></pre>

<p>
	لكن تقيّم هذه الصياغة الوصول إلى المصفوفة والوصول إلى الخاصيّات واستدعاءات الدالة/التابع على المتغيرات أو عناصر المصفوفة أو الخاصيّات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_13" style=""><span class="com">// مثال للوصول إلى قيمة من مصفوفة متعددة الأبعاد</span><span class="pln">
$companions </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Amy Pond'</span><span class="pun">],</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Dave Random'</span><span class="pun">]];</span><span class="pln">
echo </span><span class="str">"The best companion is: {$companions[0]['name']}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "The best companion is: Amy Pond"</span><span class="pln">

</span><span class="com">// مثال لاستدعاء تابع على كائن</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> say_hello</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"Hello!"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$max </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Person</span><span class="pun">();</span><span class="pln">
echo </span><span class="str">"Max says: {$max-&gt;say_hello()}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "Max says: Hello!"</span><span class="pln">

</span><span class="com">// مثال لاستدعاء دالة مغلِّفة حيث تسمح قائمة المعاملات بتعابير مخصصة</span><span class="pln">
$greet </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"A $num greetings!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
echo </span><span class="str">"From us all: {$greet(10 ** 3)}"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "From us all: A 1000 greetings!"</span></pre>

<p>
	لاحظ أنّ إشارة الدولار <code>$</code> يمكن أن توجد بعد فتح القوس المعقوص <code>‎{‎</code> كما في الأمثلة السابقة، لكن يمكن لها أن توجد قبله كما في سكربت الصدفة (Shell Script) أو لغة <code>Perl</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_15" style=""><span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Joel'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// مثال لاستخدام القوس المعقوص مع إشارة الدولار قبل فتح القوس المعقوص</span><span class="pln">
echo </span><span class="str">"&lt;p&gt;We need more ${name}s to help us!&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "&lt;p&gt;We need more Joels to help us!&lt;/p&gt;"</span></pre>

<h2>
	استخلاص/استبدال أجزاء من السلسلة النصية
</h2>

<p>
	يمكن أن تُستخلص المحارف المفردة باستخدام صياغة المصفوفة (الأقواس المعقوفة <code>[]</code>) وصياغة الأقواس المعقوصة، تُعيد هاتين الصياغتين محرفًا واحدًا فقط من السلسلة النصية وإذا كنا نريد أكثر من محرف فنحتاج إلى استخدام دالة مثل <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/substr" rel="">substr</a>.
</p>

<p>
	تُفهرَس المصفوفات في PHP بدءًا من الصفر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_17" style=""><span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello world'</span><span class="pun">;</span><span class="pln">

$foo</span><span class="pun">[</span><span class="lit">6</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 'w'</span><span class="pln">
$foo</span><span class="pun">{</span><span class="lit">6</span><span class="pun">};</span><span class="pln"> </span><span class="com">// 'w'</span><span class="pln">

substr</span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 'w'</span><span class="pln">
substr</span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 'wo'</span></pre>

<p>
	كما يمكن أن نغيّر محرفًا واحدًا في السلسلة النصية باستخدام صياغتي الأقواس المعقوفة والأقواس المعقوصة أما لتغيير أكثر من محرف نحتاج إلى استخدام دالة مثل <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/substr_replace" rel="">substr_replace</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_19" style=""><span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello world'</span><span class="pun">;</span><span class="pln">

$foo</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'W'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $foo = 'Hello World'</span><span class="pln">
$foo</span><span class="pun">{</span><span class="lit">6</span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'W'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $foo = 'Hello World'</span><span class="pln">

substr_replace</span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">,</span><span class="pln"> </span><span class="str">'W'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// $foo = 'Hello World'</span><span class="pln">
substr_replace</span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Whi'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 'Hello Whirld'</span></pre>

<p>
	لاحظ أنّ الجزء السلسلة النصية الجديد ليس بالضرورة أن تكون بنفس طول جزء السلسلة النصيّة المُستبدَل.
</p>

<h2>
	تحليل السلسلة النصية
</h2>

<h3>
	تقسيم سلسلة نصية بفواصل
</h3>

<p>
	أسهل التوابع لتقسيم سلسلة نصية هي <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/explode" rel="">explode</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/strstr" rel="">strstr</a>.
</p>

<p>
	يمكن تقسيم السلسلة النصية التي تحتوي عدة أجزاء نصيّة يفصل بينها محرف الفاصلة باستخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/explode" rel="">explode</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_21" style=""><span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="str">"apple,pear,grapefruit,cherry"</span><span class="pun">;</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">explode</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln">$fruits</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// ['apple', 'pear', 'grapefruit', 'cherry']</span></pre>

<p>
	توفر أيضًا هذه الدالة المعامل <code>limit</code> يمكن استخدامه كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_23" style=""><span class="pln">$fruits</span><span class="pun">=</span><span class="pln"> </span><span class="str">'apple,pear,grapefruit,cherry'</span><span class="pun">;</span></pre>

<p>
	إذا كانت قيمة المعامل <code>limit</code> تساوي الصفر فيُتَعَامَل معها على أنها تساوي 1.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_25" style=""><span class="pln">print_r</span><span class="pun">(</span><span class="pln">explode</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln">$fruits</span><span class="pun">,</span><span class="lit">0</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// ['apple,pear,grapefruit,cherry']</span></pre>

<p>
	أما إذا كانت قيمته موجبةً، فإنّ المصفوفة المُعادة ستحتوي على عناصر بعدد <code>limit</code>، مع احتواء آخر عنصر في المصفوفة على بقية السلسلة النصية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_27" style=""><span class="pln">print_r</span><span class="pun">(</span><span class="pln">explode</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln">$fruits</span><span class="pun">,</span><span class="lit">2</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// ['apple', 'pear,grapefruit,cherry']</span></pre>

<p>
	وإذا كانت قيمته سالبةً فستحتوي المصفوفة المعادة على كل محارف السلسلة النصية ما عدا آخر ‎-limit عنصر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_29" style=""><span class="pln">print_r</span><span class="pun">(</span><span class="pln">explode</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln">$fruits</span><span class="pun">,-</span><span class="lit">1</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// ['apple', 'pear', 'grapefruit']</span></pre>

<p>
	يمكن أن نجمع بين الدالتين <code>explode</code> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/list" rel="">list</a> لتحويل سلسلة نصية إلى متغيرات في سطرٍ واحد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_31" style=""><span class="pln">$email </span><span class="pun">=</span><span class="pln"> </span><span class="str">"user@example.com"</span><span class="pun">;</span><span class="pln">
list</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">,</span><span class="pln"> $domain</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> explode</span><span class="pun">(</span><span class="str">"@"</span><span class="pun">,</span><span class="pln"> $email</span><span class="pun">);</span></pre>

<p>
	لكن يجب أن تكون متأكدًا من أنّ نتيجة الدالة <code>explode</code> تحتوي عدد عناصر كافٍ وإلا سينشأ تحذير <code>undefined index</code>.
</p>

<p>
	تزيل الدالة <code>strstr</code> جزء السلسلة النصية الموجود قبل الظهور الأول للمعامل <code>needle</code> المُعطى.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_33" style=""><span class="pln">$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"1:23:456"</span><span class="pun">;</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">explode</span><span class="pun">(</span><span class="str">":"</span><span class="pun">,</span><span class="pln"> $string</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// ["1","23","456"]</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">strstr</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">":"</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(7) ":23:456"</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">strstr</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">":"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(1) "1"</span></pre>

<h3>
	أجزاء سلسلة نصية
</h3>

<p>
	تُعيد الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/substr" rel="">substr</a> جزء السلسلة النصية المحدد بمعاملات موقع البداية وعدد المحارف المطلوبة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_35" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="str">"Boo"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(2) "oo"</span></pre>

<p>
	من الأفضل استخدام <code>mb_substr</code> إذا كان هناك احتمال أن يكون في السلسلة محرفًا متعدد البايتات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_37" style=""><span class="pln">$cake </span><span class="pun">=</span><span class="pln"> </span><span class="str">"cakeæøå"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$cake</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(5) "cake�"</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">mb_substr</span><span class="pun">(</span><span class="pln">$cake</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="str">'UTF-8'</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(6) "cakeæ"</span></pre>

<p>
	ولدينا أيضًا الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/substr_replace" rel="">substr_replace</a> تستبدل نصًا ضمن جزء من سلسلة نصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_39" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">substr_replace</span><span class="pun">(</span><span class="str">"Boo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"0"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// string(3) "B0o"</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">substr_Replace</span><span class="pun">(</span><span class="str">"Boo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"ts"</span><span class="pun">,</span><span class="pln"> strlen</span><span class="pun">(</span><span class="str">"Boo"</span><span class="pun">)));</span><span class="pln"> 
</span><span class="com">// string(5) "Boots"</span></pre>

<p>
	بفرض أنّك تريد إيجاد كلمة معينة ضمن سلسلة نصية دون استخدام تعبير نمطي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_41" style=""><span class="pln">$hi </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
$bye </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Goodbye cruel World!"</span><span class="pun">;</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// int(5)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="pln">$bye</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// int(7)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">)));</span><span class="pln"> 
</span><span class="com">// string(5) "Hello"</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$bye</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">strlen</span><span class="pun">(</span><span class="pln">$bye</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$bye</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">))));</span><span class="pln"> 
</span><span class="com">// string(13) " cruel World!"</span><span class="pln">

</span><span class="com">// لموازنة السلاسل النصية strtolower إذا لم تكن حالة الأحرف هامة في النص نستخدم الدالة </span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">))</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'hello'</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// bool(false)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">strtolower</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$hi</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">)))</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'hello'</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// bool(true)</span></pre>

<p>
	خيار آخر أساسي لتحليل بريد إلكتروني.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_43" style=""><span class="pln">$email </span><span class="pun">=</span><span class="pln"> </span><span class="str">"test@example.com"</span><span class="pun">;</span><span class="pln">
$wrong </span><span class="pun">=</span><span class="pln"> </span><span class="str">"foobar.co.uk"</span><span class="pun">;</span><span class="pln">
$notld </span><span class="pun">=</span><span class="pln"> </span><span class="str">"foo@bar"</span><span class="pun">;</span><span class="pln">

$at </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$email</span><span class="pun">,</span><span class="pln"> </span><span class="str">"@"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(4)</span><span class="pln">
$wat </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$wrong</span><span class="pun">,</span><span class="pln"> </span><span class="str">"@"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(false)</span><span class="pln">
$nat </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$notld </span><span class="pun">,</span><span class="pln"> </span><span class="str">"@"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(3)</span><span class="pln">

$domain </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$email</span><span class="pun">,</span><span class="pln"> $at </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(11) "example.com"</span><span class="pln">
$womain </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$wrong</span><span class="pun">,</span><span class="pln"> $wat </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(11) "oobar.co.uk"</span><span class="pln">
$nomain </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$notld</span><span class="pun">,</span><span class="pln"> $nat </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(3) "bar"</span><span class="pln">

$dot </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$domain</span><span class="pun">,</span><span class="pln"> </span><span class="str">"."</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(7)</span><span class="pln">
$wot </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$womain</span><span class="pun">,</span><span class="pln"> </span><span class="str">"."</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(5)</span><span class="pln">
$not </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$nomain</span><span class="pun">,</span><span class="pln"> </span><span class="str">"."</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(false)</span><span class="pln">

$tld </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$domain</span><span class="pun">,</span><span class="pln"> $dot </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(3) "com"</span><span class="pln">
$wld </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$womain</span><span class="pun">,</span><span class="pln"> $wot </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(5) "co.uk"</span><span class="pln">
$nld </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$nomain </span><span class="pun">,</span><span class="pln"> $not </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(2) "ar"</span><span class="pln">

</span><span class="com">// string(25) "test@example.com is valid"</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$at </span><span class="pun">&amp;&amp;</span><span class="pln"> $dot</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$email is valid"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$email is invalid"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// string(21) "foobar.com is invalid"</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$wat </span><span class="pun">&amp;&amp;</span><span class="pln"> $wot</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$wrong is valid"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$wrong is invalid"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// string(18) "foo@bar is invalid"</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$nat </span><span class="pun">&amp;&amp;</span><span class="pln"> $not</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$notld is valid"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$notld is invalid"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// string(27) "foobar.co.uk is an UK email"</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$tld </span><span class="pun">==</span><span class="pln"> </span><span class="str">"co.uk"</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$email is a UK address"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$wld </span><span class="pun">==</span><span class="pln"> </span><span class="str">"co.uk"</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$wrong is a UK address"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$nld </span><span class="pun">==</span><span class="pln"> </span><span class="str">"co.uk"</span><span class="pun">)</span><span class="pln"> var_dump</span><span class="pun">(</span><span class="str">"$notld is a UK address"</span><span class="pun">);</span></pre>

<p>
	أو حتى وضع عبارة "قراءة المزيد" أو "…" في نهاية إعلان ما.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_45" style=""><span class="pln">$blurb </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Lorem ipsum dolor sit amet"</span><span class="pun">;</span><span class="pln">
$limit </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20</span><span class="pun">;</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$blurb</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> $limit </span><span class="pun">-</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'...'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(20) "Lorem ipsum dolor..."</span></pre>

<h3>
	البحث عن جزء من سلسلة نصية باستخدام التابع <code>strpos</code>
</h3>

<p>
	يمكن فهم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/strpos" rel="">strpos</a> على أنّها عدد البايتات في المعامل <code>haystack</code> قبل الظهور الأول للمعامل <code>needle</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_47" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">"haystack"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"hay"</span><span class="pun">));</span><span class="pln"> </span><span class="com">// int(0)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">"haystack"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"stack"</span><span class="pun">));</span><span class="pln"> </span><span class="com">// int(3)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">"haystack"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"stackoverflow"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(false)</span></pre>

<p>
	<strong>التحقق من وجود جزء من سلسلة نصية</strong>
</p>

<p>
	يجب الانتباه عند التحقق للحصول على نتيجة منطقية <code>TRUE</code> أو <code>FALSE</code>، إذ أنّه إذا أرجعت الدالة الفهرس <code>0</code> ستُعاملها التعليمة <code>if</code> على أنّها <code>FALSE</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_49" style=""><span class="pln">$pos </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="str">"abcd"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// $pos = 0;</span><span class="pln">
$pos2 </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="str">"abcd"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"e"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// $pos2 = FALSE;</span><span class="pln">

</span><span class="com">// needle مثال خاطئ للتحقق من وجود المعامل</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$pos</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
    echo </span><span class="str">"1. I found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"1. I did not found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// needle مثال صحيح للتحقق من وجود المعامل</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$pos </span><span class="pun">!==</span><span class="pln"> FALSE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"2. I found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"2. I did not found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// needle التحقق من عدم وجود المعامل</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$pos2 </span><span class="pun">===</span><span class="pln"> FALSE</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"3. I did not found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"3. I found your string\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في الموضع (1) لا تتطابق النتيجة <code>0</code> مع <code>TRUE</code>.
</p>

<p>
	خرج الشيفرة السابقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_51" style=""><span class="lit">1.</span><span class="pln"> I did </span><span class="kwd">not</span><span class="pln"> found your </span><span class="kwd">string</span><span class="pln">
</span><span class="lit">2.</span><span class="pln"> I found your </span><span class="kwd">string</span><span class="pln">
</span><span class="lit">3.</span><span class="pln"> I did </span><span class="kwd">not</span><span class="pln"> found your </span><span class="kwd">string</span></pre>

<p>
	<strong>البدء بالبحث بعد إزاحة معينة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_53" style=""><span class="com">// يمكننا مع الإزاحة البدء بالبحث متجاهلين كل ما يأتي قبل الإزاحة</span><span class="pln">
$needle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pun">;</span><span class="pln">
$haystack </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello world! Hello World"</span><span class="pun">;</span><span class="pln">

$pos </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$haystack</span><span class="pun">,</span><span class="pln"> $needle</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// $pos = 13, not 0</span></pre>

<p>
	<strong>الحصول على كل مرات ظهور جزء من سلسلة نصية</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_55" style=""><span class="pln">$haystack </span><span class="pun">=</span><span class="pln"> </span><span class="str">"a baby, a cat, a donkey, a fish"</span><span class="pun">;</span><span class="pln">
$needle </span><span class="pun">=</span><span class="pln"> </span><span class="str">"a "</span><span class="pun">;</span><span class="pln">
$offsets </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">

</span><span class="com">// البدء بالبحث من بداية السلسلة النصية</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">$offset </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">$offset </span><span class="pun">&lt;</span><span class="pln"> strlen</span><span class="pun">(</span><span class="pln">$haystack</span><span class="pun">);</span><span class="pln"> </span><span class="pun">){</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
    $pos </span><span class="pun">=</span><span class="pln"> strpos</span><span class="pun">(</span><span class="pln">$haystack</span><span class="pun">,</span><span class="pln"> $needle</span><span class="pun">,</span><span class="pln"> $offset</span><span class="pun">);</span><span class="pln">
    </span><span class="com">// إذا لم يبقى لدينا أي سلسلة نصية جزئية</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$pos </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    $offsets</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $pos</span><span class="pun">;</span><span class="pln"> 
    </span><span class="com">// (2)</span><span class="pln">
    $offset </span><span class="pun">=</span><span class="pln"> $pos </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$offsets</span><span class="pun">);</span><span class="pln"> </span><span class="com">// [0,8,15,25]</span></pre>

<p>
	في الموضع (1) إذا كانت الإزاحة خارج السلسلة النصية فلا تبحث بعد الآن، إذا لم يوضع هذا الشرط سيظهر تحذير إذا انتهى المعامل <code>‎$haystack</code> بالمعامل <code>‎$needle</code> وكان طول المعامل <code>‎$needle</code> بايت واحد.
</p>

<p>
	في الموضع (2) قد ترغب بإضافة <code>strlen($needle)‎</code> وهذا يعتمد فيما إذا أردت أن تعدّ "aaa" على أنّها سلسلة نصية واحدة أو سلسلتي "aa".
</p>

<h3>
	تحليل سلسلة نصية باستخدام التعابير النمطية (regular expressions)
</h3>

<p>
	يمكن استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/preg_match" rel="">preg_match</a> لتحليل سلسلة نصية باستخدام تعبير نمطي، تُحاط أجزاء التعبير النمطي بأقواس تُدعى أنماطًا فرعية ومعهم يمكنك الحصول على أجزاء فردية من السلسلة النصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_57" style=""><span class="pln">$str </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;a href=\"http://example.org\"&gt;My Link&lt;/a&gt;"</span><span class="pun">;</span><span class="pln">
$pattern </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/&lt;a href=\"(.*)\"&gt;(.*)&lt;\/a&gt;/"</span><span class="pun">;</span><span class="pln">
$result </span><span class="pun">=</span><span class="pln"> preg_match</span><span class="pun">(</span><span class="pln">$pattern</span><span class="pun">,</span><span class="pln"> $str</span><span class="pun">,</span><span class="pln"> $matches</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$result </span><span class="pun">===</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// السلسلة النصية تطابق التعبير النمطي</span><span class="pln">
    print_r</span><span class="pun">(</span><span class="pln">$matches</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$result </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لا يوجد تطابق</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// حدث خطأ</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2157_59" style=""><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">a href</span><span class="pun">=</span><span class="str">"http://example.org"</span><span class="pun">&gt;</span><span class="typ">My</span><span class="pln"> </span><span class="typ">Link</span><span class="pun">&lt;/</span><span class="pln">a</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> http</span><span class="pun">:</span><span class="com">//example.org</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">My</span><span class="pln"> </span><span class="typ">Link</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [String formatting - String Parsing] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ ايضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%B5%D9%8A%D8%BA%D8%A9-json-%D9%88xml-%D9%81%D9%8A-php-r1078/" rel="">صيغة JSON وXML في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-php-r1076/" rel="">الدوال في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1077</guid><pubDate>Tue, 24 Nov 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-php-r1076/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_12/11.png.bdd3394289457e3a1d447141b3c5280d.png" /></p>
<h2>
	قائمة الوسطاء ذات الطول المتغير
</h2>

<p>
	<strong>النسخة 5.6 وما بعدها:</strong>
</p>

<p>
	قدم الإصدار PHP 5.6 لائحة وسطاء ذات طول متغير (وتعرف أيضًا باسم العدد المتغيّر للوسائط (varargs) أو الوسائط المتغيّرة) بإضافة <code>...</code> قبل اسم الوسيط للإشارة إلى أنّ المعامل متغيّر، أي أنّها مصفوفة فيها كل المعاملات بدءًا من هذا الوسيط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_7" style=""><span class="kwd">function</span><span class="pln"> variadic_func</span><span class="pun">(</span><span class="pln">$nonVariadic</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">$variadic</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo json_encode</span><span class="pun">(</span><span class="pln">$variadic</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

variadic_func</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// [2,3,4]</span></pre>

<p>
	يمكن أن يُضاف اسم النوع قبل <code>...</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_9" style=""><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="typ">Bar</span><span class="pln"> </span><span class="pun">...</span><span class="pln">$bars</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span></pre>

<p>
	يمكن أن يُضاف عامل المرجعية <code>&amp;</code> قبل <code>...</code> وبعد اسم النوع (إن وجد)، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_11" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> a</span><span class="pun">(</span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">&amp;...</span><span class="pln">$foos</span><span class="pun">){</span><span class="pln">
    $i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$a </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$foo</span><span class="pun">){</span><span class="pln">
        $foo </span><span class="pun">=</span><span class="pln"> $i</span><span class="pun">++;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$a </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">;</span><span class="pln">
$c </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=&amp;</span><span class="pln"> $c</span><span class="pun">;</span><span class="pln">
a</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">,</span><span class="pln"> $c</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
int(0)
int(1)
int(1)
*/</span></pre>

<p>
	من ناحية أخرى يمكن تفريغ مصفوفة الوسائط لتُمرر إلى دالة بصيغة لائحة وسطاء:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_13" style=""><span class="pln">var_dump</span><span class="pun">(...</span><span class="pln">hash_algos</span><span class="pun">());</span><span class="pln">

</span><span class="com">/*
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
*/</span></pre>

<p>
	وازن الخرج السابق مع خرج الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_15" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">hash_algos</span><span class="pun">());</span><span class="pln">

</span><span class="com">/*
array(46) {
    [0]=&gt; string(3) "md2"
    [1]=&gt; string(3) "md4"
...
}
*/</span></pre>

<p>
	لذا يمكن إعادة توجيه الدوال إلى دوال متعددة الوسائط بسهولة، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_17" style=""><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> formatQuery</span><span class="pun">(</span><span class="pln">$query</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">$args</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="pln">$query</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">array_map</span><span class="pun">([</span><span class="pln">$mysqli</span><span class="pun">,</span><span class="pln"> </span><span class="str">"real_escape_string"</span><span class="pun">],</span><span class="pln"> $args</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أيضًا استخدام واجهات <code>Traversable</code> مثل <code>Iterator</code> (خاصةً العديد من أصنافها الفرعية من مكتبة SPL)، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_19" style=""><span class="pln">$iterator </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">LimitIterator</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayIterator</span><span class="pun">([</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">]),</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
echo bin2hex</span><span class="pun">(</span><span class="pln">pack</span><span class="pun">(</span><span class="str">"c*"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">$it</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// 020304</span></pre>

<p>
	إذا كان المُكرِّر يكرر عددًا غير محدود من المرات، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_21" style=""><span class="pln">$iterator </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">InfiniteIterator</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayIterator</span><span class="pun">([</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">]));</span><span class="pln">
var_dump</span><span class="pun">(...</span><span class="pln">$iterator</span><span class="pun">);</span></pre>

<p>
	ستسلك الإصدارات المختلفة من PHP سلوكًا مختلفًا:
</p>

<ul>
	<li>
		من الإصدار PHP 7.0.0 وحتى الإصدار PHP 7.1.0 (بيتا 1): سيحدث خطأ تجزئة (segmentation fault) وسيتوقف التنفيذ مع الرمز 139.
	</li>
	<li>
		في PHP 5.6: سيُعرَض خطأً فادحًا بسبب استهلاك الذاكرة <code>("Allowed memory size of %d bytes exhausted")</code> وسيتوقف التنفيذ مع الرمز 255.
	</li>
</ul>

<p>
	ملاحظة: لا تدعم الآلة الافتراضية هيب هوب HHVM (الإصدار 3.10 وحتى 3.12) تفريغ واجهات <code>Traversable</code> وستظهر رسالة تحذير <code>"Only containers may be unpacked"</code> عند المحاولة.
</p>

<h2>
	المعاملات الاختيارية
</h2>

<p>
	يمكن أن يكون للدوال معاملات اختيارية، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_23" style=""><span class="kwd">function</span><span class="pln"> hello</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">,</span><span class="pln"> $style </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Formal'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$style</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'Formal'</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Good Day $name"</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'Informal'</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Hi $name"</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'Australian'</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"G'day $name"</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Hello $name"</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

hello</span><span class="pun">(</span><span class="str">'Alice'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Good Day Alice</span><span class="pln">

hello</span><span class="pun">(</span><span class="str">'Alice'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Australian'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// G'day Alice</span></pre>

<h2>
	تمرير الوسائط بالمرجعية
</h2>

<p>
	يمكن تمرير وسائط الدالة بالمرجعية (By Reference) مما يسمح للدالة بتعديل المتغير خارج الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_25" style=""><span class="kwd">function</span><span class="pln"> pluralize</span><span class="pun">(&amp;</span><span class="pln">$word</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">substr</span><span class="pun">(</span><span class="pln">$word</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'y'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $word </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$word</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'ies'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $word </span><span class="pun">.=</span><span class="pln"> </span><span class="str">'s'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$word </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Bannana'</span><span class="pun">;</span><span class="pln">
pluralize</span><span class="pun">(</span><span class="pln">$word</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $word</span><span class="pun">;</span><span class="pln">
</span><span class="com">// Bannanas</span></pre>

<p>
	تُمرَّر وسائط الكائن دائمًا بالمرجعية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_27" style=""><span class="kwd">function</span><span class="pln"> addOneDay</span><span class="pun">(</span><span class="pln">$date</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    $date</span><span class="pun">-&gt;</span><span class="pln">modify</span><span class="pun">(</span><span class="str">'+1 day'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2014-02-28'</span><span class="pun">);</span><span class="pln">
addOneDay</span><span class="pun">(</span><span class="pln">$date</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 2014-03-01</span></pre>

<p>
	يجب نسخ الكائن لتجنّب تمريره بالمرجعية بشكلٍ ضمني، ويمكن أن يُستخدم التمرير بالمرجعية كطريقة بديلة لإرجاع معاملات، مثل الدالة <code>socket_getpeername</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_29" style=""><span class="kwd">bool</span><span class="pln"> socket_getpeername </span><span class="pun">(</span><span class="pln"> resource $socket </span><span class="pun">,</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$address </span><span class="pun">[,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$port </span><span class="pun">]</span><span class="pln"> </span><span class="pun">)</span></pre>

<p>
	يهدف هذا التابع لإرجاع عنوان ومنفذ النظير (peer) ولكن بما أنّه يوجد قيمتين للإرجاع فهو يختار معاملات المرجعية، يمكن أن يُستدعى كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_31" style=""><span class="kwd">if</span><span class="pun">(!</span><span class="pln">socket_getpeername</span><span class="pun">(</span><span class="pln">$socket</span><span class="pun">,</span><span class="pln"> $address</span><span class="pun">,</span><span class="pln"> $port</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">RuntimeException</span><span class="pun">(</span><span class="pln">socket_last_error</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
echo </span><span class="str">"Peer: $address:$port\n"</span><span class="pun">;</span></pre>

<p>
	لا تحتاج المتغيرات <code>‎$address</code> و<code>‎$port</code> للتعريف مسبقًا فهي ستُعرَّف على أنّها <code>null</code> في البداية ثمّ تُمرَّر إلى الدالة بالقيمة <code>null</code> وتُعدَّل داخل الدالة ثمّ تُعرَّف في النهاية على أنّها العنوان والمنفذ في المحتوى المُستدعي.
</p>

<h2>
	استخدام الدالة البسيط
</h2>

<p>
	تُعرّف الدالة وتُنفَّذ بشكلها البسيط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_33" style=""><span class="kwd">function</span><span class="pln"> hello</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Hello $name"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

hello</span><span class="pun">(</span><span class="str">"Alice"</span><span class="pun">);</span></pre>

<h2>
	نطاق الدالة
</h2>

<p>
	المتغيرات داخل الدوال هي متغيرات معرَّفة داخل نطاق محلي، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_35" style=""><span class="pln">$number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(){</span><span class="pln">
    $number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $number
</span><span class="pun">}</span><span class="pln">

foo</span><span class="pun">();</span></pre>

<p>
	خرج الشيفرة السابقة هو 10 لأنّ المتغير المعرَّف داخل الدالة ذو نطاق محلي.
</p>

<h2>
	البرمجة الوظيفية (functional programming)
</h2>

<p>
	تعتمد البرمجة الوظيفية على الدوال، إذ توفر الدوال شيفرة منظمة وقابلة لإعادة الاستخدام تؤدي مجموعة وظائف، تبسّط الدوال عملية كتابة الشيفرة وتمنع تكرار المنطق وتجعل الشيفرة سهلة التتبع. سنتحدث في الفقرات التالية عن التصريح عن الدوال، واستخدامها، والوسائط، والمعاملات، وتعليمات الإرجاع، والنطاق في PHP.
</p>

<h3>
	الدوال المغلِّفة (Closures)
</h3>

<p>
	الدالة المغلِّفة هي دالة مجهولة (anonymous function) لا يمكن الوصول إليها من خارج النطاق، عندما تعرّف دالة مجهولة فأنت تنشئ فضاء اسم لهذه الدالة، يمكن لها حاليًا أن تصل إلى فضاء الاسم هذا فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_37" style=""><span class="pln">$externalVariable </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pun">;</span><span class="pln">
$secondExternalVariable </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">;</span><span class="pln">

$myFunction </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$externalVariable</span><span class="pun">,</span><span class="pln"> $secondExternalVariable</span><span class="pun">);</span><span class="pln"> 
    </span><span class="com">// تُرجع ملاحظتي خطأ بما أنّ المتغيرات لم تُعرَّف</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا يمكن لهذه الدالة الوصول إلى أيّ متغيرات خارجية ولتمنح فضاء الاسم هذا إمكانية الإذن بالوصول فأنت تحتاج للتعريف عن ذلك باستخدام <code>use()‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_39" style=""><span class="pln">$myFunction </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">use</span><span class="pun">(</span><span class="pln">$externalVariable</span><span class="pun">,</span><span class="pln"> $secondExternalVariable</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$externalVariable</span><span class="pun">,</span><span class="pln"> $secondExternalVariable</span><span class="pun">);</span><span class="pln"> 
    </span><span class="com">// Hello Foo</span><span class="pln">
</span><span class="pun">}</span></pre>

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

<p>
	لاحظ أيضًا أنّ وراثة المتغيرات من النطاق الأب ليس مثل استخدام المتغيرات العامة، توجد المتغيرات العامة في النطاق العام وهو نفسه بغض النظر عن الدالة التي تُنفَّذ، أما النطاق الأب لدالة مغلِّفة هو الدالة التي عُرِّفت ضمنها الدالة المغلِّفة (وليس بالضرورة الدالة التي اُستدعيت منها).
</p>

<p>
	تستخدم الدوال المغلِّفة منهجية الربط المبكر (early-binding)، أي أنّ المتغيرات التي تُمرَّر إلى فضاء اسم الدالة المغلِّفة باستخدام الكلمة المفتاحية <code>use</code> سيكون لها نفس القيم عند تعريف الدالة المغلِّفة ولتغيير هذا السلوك يجب تمرير القيمة بالمرجعية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_41" style=""><span class="pln">$rate </span><span class="pun">=</span><span class="pln"> </span><span class="pun">.</span><span class="lit">05</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تصدير متغير إلى نطاق الدالة المغلِّفة</span><span class="pln">
$calculateTax </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$value</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$rate</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $value </span><span class="pun">*</span><span class="pln"> $rate</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

$rate </span><span class="pun">=</span><span class="pln"> </span><span class="pun">.</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $calculateTax</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 5</span><span class="pln">

$rate </span><span class="pun">=</span><span class="pln"> </span><span class="pun">.</span><span class="lit">05</span><span class="pun">;</span><span class="pln">
</span><span class="com">// تصدير متغير إلى نطاق الدالة المغلِّفة</span><span class="pln">
$calculateTax </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$value</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(&amp;</span><span class="pln">$rate</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// (1)</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $value </span><span class="pun">*</span><span class="pln"> $rate</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

$rate </span><span class="pun">=</span><span class="pln"> </span><span class="pun">.</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $calculateTax</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 10</span></pre>

<p>
	لاحظ في الموضع (1) استخدام <code>&amp;</code> قبل <code>‎$rate</code>.
</p>

<p>
	إنّ الوسطاء الافتراضيين غير مطلوبين ضمنيًّا عند تعريف دوال مجهولة مع/دون دوال مغلِّفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_43" style=""><span class="pln">$message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Im yelling at you'</span><span class="pun">;</span><span class="pln">

$yell </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">use</span><span class="pun">(</span><span class="pln">$message</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo strtoupper</span><span class="pun">(</span><span class="pln">$message</span><span class="pun">);</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

$yell</span><span class="pun">();</span><span class="pln"> 
</span><span class="com">// IM YELLING AT YOU</span></pre>

<h2>
	الإسناد إلى متغيرات
</h2>

<p>
	يمكن أن تُسنَد <a href="https://wiki.hsoub.com/PHP/anonymous_functions" rel="external">الدوال المجهولة</a> إلى متغيرات للاستخدام كمعاملات حيث يُتوقّع رد النداء.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_45" style=""><span class="pln">$uppercase </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> strtoupper</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">);</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

$mixedCase </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Hello"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"World"</span><span class="pun">];</span><span class="pln">
$uppercased </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="pln">$uppercase</span><span class="pun">,</span><span class="pln"> $mixedCase</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$uppercased</span><span class="pun">);</span></pre>

<p>
	يمكن استخدام هذه المتغيرات مثلما نستدعي دالة مستقلة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_47" style=""><span class="pln">echo $uppercase</span><span class="pun">(</span><span class="str">"Hello world!"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// HELLO WORLD!</span></pre>

<h2>
	الكائنات كدالة
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_49" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __invoke</span><span class="pun">(</span><span class="pln">$param1</span><span class="pun">,</span><span class="pln"> $param2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// أضف الشيفرة هنا</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$instance </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SomeClass</span><span class="pun">();</span><span class="pln">

</span><span class="com">// __invoke() استدعاء التابع</span><span class="pln">
$instance</span><span class="pun">(</span><span class="str">'First'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Second'</span><span class="pun">);</span><span class="pln"> </span></pre>

<p>
	يمكن استخدام كائن مع التابع <code>‎__invoke‎</code> تمامًا مثل أي دالة أخرى، سيكون بإمكان التابع <code>‎__invoke‎</code> الوصول إلى كل خاصيّات الكائن واستدعاء أيّ تابع.
</p>

<h2>
	استخدام المتغيرات الخارجية
</h2>

<p>
	تُستخدم البنية <code>use</code> لاستيراد المتغيرات إلى داخل نطاق الدالة المجهولة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_51" style=""><span class="pln">$divisor </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2332</span><span class="pun">;</span><span class="pln">
$myfunction </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$divisor</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $number </span><span class="pun">/</span><span class="pln"> $divisor</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

echo $myfunction</span><span class="pun">(</span><span class="lit">81620</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 35</span></pre>

<p>
	يمكن أيضًا استيراد المتغيرات بالمرجع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_53" style=""><span class="pln">$collection </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
$additem </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$item</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(&amp;</span><span class="pln">$collection</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $collection</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $item</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

$additem</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
$additem</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="com">//$collection = [1,2]</span></pre>

<h2>
	الدالة المجهولة
</h2>

<p>
	الدالة المجهولة هي دالة دون اسم، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_55" style=""><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	تُعامل الدالة المجهولة في PHP كأنها تعبير لذا يجب أن تنتهي بفاصلة منقوطة <code>;</code>، ويجب أن تُسند الدالة المجهولة إلى متغير:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_57" style=""><span class="com">// دالة مجهولة مُسندة إلى متغير</span><span class="pln">
$sayHello </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"Hello $name!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> $sayHello</span><span class="pun">(</span><span class="str">'John'</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Hello John</span></pre>

<p>
	أو يجب أن تُمرَّر كمعامل دالة أخرى.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_59" style=""><span class="pln">$users </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Alice'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'age'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">20</span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Bobby'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'age'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">22</span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'name'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Carol'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'age'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">17</span><span class="pun">]</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// تنفيذ دالة مجهولة على عناصر المصفوفة</span><span class="pln">
$userName </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $user</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> $users</span><span class="pun">);</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$usersName</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// ['Alice', 'Bobby', 'Carol']</span></pre>

<p>
	أو تُرجَع من دالة أخرى.
</p>

<p>
	التنفيذ الذاتي للدوال المجهولة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_61" style=""><span class="com">// PHP 7.x</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Hello world!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">})();</span><span class="pln">

</span><span class="com">// PHP 5.x</span><span class="pln">
call_user_func</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Hello world!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	تمرير معامل إلى الدوال المجهولة أثناء التنفيذ الذاتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_63" style=""><span class="com">// PHP 7.x</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Hello $name!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">})(</span><span class="str">'John'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// PHP 5.x</span><span class="pln">
call_user_func</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Hello $name!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="str">'John'</span><span class="pun">);</span></pre>

<h2>
	الدوال النقية (Pure functions)
</h2>

<p>
	الدالة النقية هي الدالة التي تعطي نفس الخرج دومًا مهما كان الدخل وخالية من التأثير الجانبي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_65" style=""><span class="com">// دالة نقية</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تغيّر بعض التأثيرات الجانبية نظام الملفات وتتفاعل مع قواعد البيانات وتطبع على الشاشة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_67" style=""><span class="com">// دالة غير نقيّة</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Adding..."</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	توابع وظيفية شائعة في PHP
</h2>

<h3>
	الربط
</h3>

<p>
	تطبيق دالة على جميع عناصر المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_69" style=""><span class="pln">array_map</span><span class="pun">(</span><span class="str">'strtoupper'</span><span class="pun">,</span><span class="pln"> $array</span><span class="pun">);</span></pre>

<p>
	يجب أن تنتبه أنّ هذا التابع الوحيد الذي يأتي فيه رد النداء أولًا.
</p>

<h3>
	الاختزال (أو الطي)
</h3>

<p>
	اختزال المصفوفة إلى قيمة واحدة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_71" style=""><span class="pln">$sum </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">(</span><span class="pln">$numbers</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $carry </span><span class="pun">+</span><span class="pln"> $number</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<h3>
	الترشيح
</h3>

<p>
	تُرجَع فيه عناصر المصفوفة التي يكون نتيجة رد النداء لها <code>true</code> فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_73" style=""><span class="pln">$onlyEven </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$numbers</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$number </span><span class="pun">%</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<h2>
	استخدام الدوال المدمجة كردود نداء
</h2>

<p>
	يمكن أن تضع سلسلة نصية مع دالة PHP مدمجة في الدوال التي تأخذ معاملًا من النوع <code>callable</code>، من الشائع استخدام <code>trim</code> معاملًا للدالة <code>array_map</code> لإزالة المسافات البيضاء من بداية ونهاية السلاسل النصية في المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_75" style=""><span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">' one '</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two '</span><span class="pun">,</span><span class="pln"> </span><span class="str">' three'</span><span class="pun">];</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">array_map</span><span class="pun">(</span><span class="str">'trim'</span><span class="pun">,</span><span class="pln"> $arr</span><span class="pun">));</span><span class="pln">

</span><span class="com">/*
array(3) {
    [0] =&gt; string(3) "one"
    [1] =&gt; string(3) "two"
    [2] =&gt; string(5) "three"
}
*/</span></pre>

<h2>
	النطاق
</h2>

<p>
	الدالة المجهولة في PHP لها نطاقها الخاص مثل أيّ دالة أخرى، فيمكن للدالة المجهولة في جافاسكربت مثلًا الوصول إلى متغير خارج النطاق أما في PHP فإنّ هذا غير ممكن.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_77" style=""><span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'John'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// دالة مجهولة تحاول الوصول إلى متغير خارج النطاق</span><span class="pln">
$sayHello </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"Hello $name!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> $sayHello</span><span class="pun">(</span><span class="str">'John'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Hello !</span><span class="pln">

</span><span class="com">// إذا كانت الملاحظات ممكّنة Undefined variable $name ستظهر لنا الملاحظة</span></pre>

<h2>
	تمرير دالة رد نداء كمعامل
</h2>

<p>
	يوجد العديد من الدوال في PHP تقبل دوال رد نداء (callback) معرَّفة من قبل المستخدم كمعامل مثل الدوال: <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/call_user_func" rel="">call<em>user</em>func()‎</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/usort" rel="">usort()‎</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_map" rel="">array_map‎()‎</a>.
</p>

<p>
	يوجد طرائق مختلفة لتمرير دوال رد النداء المعرَّفة من قبل المستخدم كمعاملات وتختلف هذه الطرائق وفقًا للمكان الذي عُرِّفَت فيه هذه الدوال: <strong>النمط الإجرائي:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_79" style=""><span class="kwd">function</span><span class="pln"> square</span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $number </span><span class="pun">*</span><span class="pln"> $number</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$initial_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">
$final_array </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="str">'square'</span><span class="pun">,</span><span class="pln"> $initial_array</span><span class="pun">);</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$final_array</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// array(5) { [0]=&gt; int(1) [1]=&gt; int(4) [2]=&gt; int(9) [3]=&gt; int(16) [4]=&gt; int(25) }</span></pre>

<p>
	<strong>النمط الكائني التوجه:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_81" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">SquareHolder</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> square</span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $number </span><span class="pun">*</span><span class="pln"> $number</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$squaredHolder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SquareHolder</span><span class="pun">();</span><span class="pln">
$initial_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">
$final_array </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">([</span><span class="pln">$squaredHolder</span><span class="pun">,</span><span class="pln"> </span><span class="str">'square'</span><span class="pun">],</span><span class="pln"> $initial_array</span><span class="pun">);</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$final_array</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// array(5) { [0]=&gt; int(1) [1]=&gt; int(4) [2]=&gt; int(9) [3]=&gt; int(16) [4]=&gt; int(25) }</span></pre>

<p>
	<strong>النمط الكائني التوجه باستخدام تابع ساكن:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2124_83" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">StaticSquareHolder</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> square</span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $number </span><span class="pun">*</span><span class="pln"> $number</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$initial_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">
$final_array </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">([</span><span class="str">'StaticSquareHolder'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'square'</span><span class="pun">],</span><span class="pln"> $initial_array</span><span class="pun">);</span><span class="pln">

</span><span class="com">// أو</span><span class="pln">
$final_array </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="str">'StaticSquareHolder::square'</span><span class="pun">,</span><span class="pln"> $initial_array</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// PHP &gt;= 5.2.3 في</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$final_array</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// array(5) { [0]=&gt; int(1) [1]=&gt; int(4) [2]=&gt; int(9) [3]=&gt; int(16) [4]=&gt; int(25) }</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Functions - Functional Programming] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم PHP</a> 
	</li>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AA%D8%AD%D9%84%D9%8A%D9%84%D9%87%D8%A7-%D9%81%D9%8A-php-r1077/" rel="">تنسيق النصوص وتحليلها في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-php-r1048/" rel="">بنى التحكم والحلقات التكرارية في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1076</guid><pubDate>Sun, 22 Nov 2020 13:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x649; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x648;&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x643;&#x631;&#x627;&#x631;&#x64A;&#x629; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-php-r1048/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/10.png.13fa5c00a5c500aa0204bbbab7926d86.png" /></p>
<h2>
	التعليمات الشرطية
</h2>

<h3>
	if else
</h3>

<p>
	تسمح لنا تعليمة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/if" rel="">if</a> بتنفيذ شيفرة معينة إذا تحقق شرط معين، ونستخدم <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/else" rel="">else</a> لتنفيذ شيفرة ما عندما لا يتحقق هذا الشرط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_13" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&gt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is greater than b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is NOT greater than b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>العامل الثلاثي كصياغة مختصرة لعبارة if-else</strong>
</p>

<p>
	يقيّم <a href="https://www.php.net/manual/de/language.operators.comparison.php#language.operators.comparison.ternary" rel="external nofollow">العامل الثلاثي</a> تعبيرًا بالاعتماد على شرط قد تكون نتيجته <code>true</code> أو <code>false</code>، وهو عامل موازنة يُستخدم ليعبّر عن شرط <code>if-else</code> بصيغة مختصرة فهو يسمح باختبار سريع للشرط ويختزل تعليمة <code>if</code> المكونة من عدّة أسطر إلى سطر واحد، سنعيد كتابة الشيفرة السابقة باستخدام العامل الثلاثي وبفرض ‎$a=1‎، ‏‎$b=2:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_15" style=""><span class="pln">echo </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&gt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">"a is greater than b"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"a is NOT greater than b"</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*
a is NOT greater than b.
*/</span></pre>

<h3>
	صياغة بديلة لبنى التحكم
</h3>

<p>
	توفر PHP صياغة بديلة لبعض بنى التحكم: if، ‏<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/while" rel="">while</a>، ‏<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/for" rel="">for</a>، ‏<a href="%E2%80%8F%E2%80%8Fhttps://wiki.hsoub.com/PHP/foreach" rel="">foreach</a> و‏<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/switch" rel="">switch</a>.
</p>

<p>
	بالموازنة مع الصياغة العادية، الفرق هو أنّ القوس المفتوح يُستبدل بنقطتين <code>:</code> والقوس المفتوح يُستبدل ب <code>endif;‎</code>، ‏<code>endwhile;‎</code>، ‏<code>endfor;‎</code>، ‏<code>endforeach;‎</code> أو <code>endswitch;‎</code> على الترتيب، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_17" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">42</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"The answer to life, the universe and everything is 42."</span><span class="pun">;</span><span class="pln">
endif</span><span class="pun">;</span></pre>

<p>
	تعليمات <code>elseif</code> باستخدام الصياغة المختصرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_19" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">5</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"a equals 5"</span><span class="pun">;</span><span class="pln">
elseif </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">6</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"a equals 6"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"a is neither 5 nor 6"</span><span class="pun">;</span><span class="pln">
endif</span><span class="pun">;</span></pre>

<h3>
	if elseif else
</h3>

<p>
	<strong>elseif</strong>
</p>

<p>
	تجمع <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/elseif" rel="">elseif</a> بين <code>if</code> و<code>else</code>، وسِّعت تعليمة <code>if</code> لتنفيذ تعليمة مختلفة في حال كانت نتيجة تعبير <code>if</code> الأساسي هي <code>FALSE</code>، وينفَّذ التعبير البديل فقط في حال كانت نتيجة تعبير <code>elseif</code> الأساسي هي <code>TRUE</code>.
</p>

<p>
	تعرض الشيفرة التالية إحدى العبارات "a is bigger than b" أو "a is equal to b" أو "a is smaller than b":
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_21" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&gt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is bigger than b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is equal to b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is smaller than b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>تعليمات elseif متعددة</strong>
</p>

<p>
	يمكن استخدام تعليمات <code>elseif</code> متعددة ضمن تعليمة <code>if</code> نفسها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_23" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is One"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is Two"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is Three"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is not One, not Two nor Three"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	if
</h3>

<p>
	تسمح لك بنية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/if" rel="">if</a> بتنفيذ أجزاء من الشيفرة اعتمادًا على شروط معينة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_25" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&gt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"a is bigger than b"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	switch
</h3>

<p>
	تؤدي بنية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/switch" rel="">switch</a> نفس وظيفة سلسلة من تعليمات <code>if</code> لكن بعدد أسطر شيفرة أقل. تُقارَن القيمة التي نريد اختبارها والمعرَّفة في تعليمة <code>switch</code> مع كل القيم الموجودة في عبارات <code>case</code> وعند المساواة ستنُنفَّذ الشيفرة الخاصة بتلك العبارة وإذا لم تتساوى مع أي قيمة تُنفّّذ كتلة <code>default</code> إن وجدت.
</p>

<p>
	كل كتلة شيفرة في تعليمة <code>case</code> أو <code>default</code> يجب أن تنتهي بتعليمة <code>break</code>، توقف هذه التعليمة تنفيذ بنية <code>switch</code> ويتابع تنفيذ الشيفرة مباشرةً بعد ذلك، إذا تجاهلت تعليمة <code>break</code> ستُنفَّذ تعليمة <code>case</code> التالية حتى لو لم تحدث مساواة، ويمكن أن يسبب لك هذا تنفيذ غير متوقع للشيفرة لكن أيضًا قد يكون مفيدًا عند الحاجة إلى مشاركة عدة تعليمات <code>case</code> لنفس الشيفرة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_27" style=""><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$colour</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"red"</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"the colour is red"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"green"</span><span class="pun">:</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"blue"</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"the colour is green or blue"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"yellow"</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"the colour is yellow"</span><span class="pun">;</span><span class="pln">
    </span><span class="com">// لذا ستُنفَّذ كتلة الشيفرة التالية break لاحظ عدم وجود</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"black"</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"the colour is black"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"the colour is something else"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بالإضافة لاختبار القيم الثابتة يمكن للبنية اختبار التعليمات الديناميكية بإعطاء تعليمة <code>switch</code> قيمة منطقية وإعطاء تعليمة <code>case</code> أي تعبير، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_29" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1048</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"more than 0"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">100</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"more than 100"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">case</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">):</span><span class="pln">
    echo </span><span class="str">"more than 1000"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// more than 100</span></pre>

<h2>
	الحلقات
</h2>

<p>
	تعدّ الحلقات جانبًا أساسيًا من البرمجة فهي تسمح للمبرمجين بإنشاء شيفرة تُكرَّر لعدد من المرات أو التكرارات، قد يكون عدد التكرارات محددًا بشكلٍ صريح (6 تكرارات مثلًا) أو يستمر حتى حدوث شرط ما نحدده.
</p>

<h3>
	for
</h3>

<p>
	تُستخدم حلقات <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/for" rel="">for</a> عندما يكون لديك كتلة شيفرة تريد تكرارها عددًا محددًا من المرات.?
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_31" style=""><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// 123456789</span></pre>

<p>
	نستخدم المُهيئ لضبط القيمة الابتدائية لعداد تكرارات الحلقة، قد يُصرَّح عنه هنا لهذا الغرض واسمه التقليدي <code>‎$i</code>.
</p>

<p>
	يُكرر المثال التالي 10 مرات ويعرض الأعداد من 0 إلى 9:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_33" style=""><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $i</span><span class="pun">,</span><span class="pln"> </span><span class="str">','</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com"># مثال 2</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    echo $i</span><span class="pun">,</span><span class="pln"> </span><span class="str">','</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com"># مثال 3</span><span class="pln">
$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(;</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    echo $i</span><span class="pun">,</span><span class="pln"> </span><span class="str">','</span><span class="pun">;</span><span class="pln">
    $i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com"># مثال 4</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> $j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln"> $j </span><span class="pun">+=</span><span class="pln"> $i</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">print</span><span class="pln"> $i</span><span class="pun">.</span><span class="pln"> </span><span class="str">','</span><span class="pun">,</span><span class="pln"> $i</span><span class="pun">++);</span><span class="pln">

</span><span class="com">/*
خرج كل مثال من الأمثلة السابقة
0,1,2,3,4,5,6,7,8,9,
*/</span></pre>

<h3>
	foreach
</h3>

<p>
	تسمح لنا بنية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/foreach" rel="">foreach</a> باستخدام التكرار على المصفوفات والكائنات بسهولة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_35" style=""><span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$array </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
echo $value</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// 123</span></pre>

<p>
	ولاستخدامها مع الكائنات نحتاج إلى تنفيذ الواجهة <a href="%E2%80%8Fhttps://www.php.net/manual/en/class.iterator.php" rel="">Iterator</a>.
</p>

<p>
	لاستخدام التعليمة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/foreach" rel="">foreach</a> للتنقل بين عناصر المصفوفات، تُسند قيمة عنصر المصفوفة الحالي في كل تكرار إلى متغير <code>‎$value‎</code> ويتحرك مؤشر المصفوفة خطوة واحدة وفي التكرار التالي سيُعالج العنصر التالي، إليك مثال يعرض عناصر المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_37" style=""><span class="pln">$list </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cherry'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"I love to eat {$value}. "</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/*
I love to eat apple. I love to eat banana. I love to eat cherry.
*/</span></pre>

<p>
	يمكنك أيضًا أن تحصل على مفتاح/فهرس القيمة باستخدام <code>foreach</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_39" style=""><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $key </span><span class="pun">.</span><span class="pln"> </span><span class="str">":"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// 0:apple 1:banana 2:cherry</span></pre>

<p>
	إنّ <code>‎$value</code> بشكلٍ افتراضي هي نسخة من القيمة في <code>‎$list</code> لذا فإنّ التغييرات التي تحدث داخل الحلقة لن تؤثر على <code>‎$list</code> بعد ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_41" style=""><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $value </span><span class="pun">=</span><span class="pln"> $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">" pie"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo $list</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "apple"</span></pre>

<p>
	نستخدم العامل <code>&amp;</code> لتعديل قيم المصفوفة داخل حلقة <code>foreach</code> إذ تُسند القيمة <code>‎$value</code> بالمرجع، ويجب بعد ذلك استخدام <code>unset</code> للمتغير حتى لا تسبب إعادة استخدام <code>‎$value</code> في مكانٍ آخر الكتابة فوق المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_43" style=""><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// foreach ($list as $key =&gt; &amp;$value) { أو</span><span class="pln">
    $value </span><span class="pun">=</span><span class="pln"> $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">" pie"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
unset</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">);</span><span class="pln">

echo $list</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "apple pie"</span></pre>

<p>
	يمكنك أيضًا تعديل عناصر المصفوفة داخل حلقة <code>foreach</code> بمرجعية مفتاح المصفوفة للعنصر الحالي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_45" style=""><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $list</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">" pie"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo $list</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "apple pie"</span></pre>

<p>
	ونستطيع استخدامها لتكرار مصفوفة ترابطية كما في الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_47" style=""><span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'color'</span><span class="pun">=&gt;</span><span class="str">'red'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$array </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">){</span><span class="pln">
    echo $key </span><span class="pun">.</span><span class="pln"> </span><span class="str">': '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $value</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// color: red</span></pre>

<h3>
	while
</h3>

<p>
	تكرّر حلقة <code>while</code> كتلة شيفرة طالما أنّ الشرط محقق.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_49" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $i</span><span class="pun">;</span><span class="pln">
    $i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/*
123456789
*/</span></pre>

<p>
	يُكرَّر المثال التالي حتى تصبح قيمة المجموع 100:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_51" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
$sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$sum </span><span class="pun">===</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $sum </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo </span><span class="str">'The sum is: '</span><span class="pun">,</span><span class="pln"> $sum</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*
The sum is: 100
*/</span></pre>

<h3>
	do-while
</h3>

<p>
	تنفّذ حلقة <code>do-while</code> كتلة الشيفرة لمرة واحدة بدايةً ثمّ تكرر كتلة الشيفرة طالما أنّ الشرط محقق.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_53" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $i</span><span class="pun">++;</span><span class="pln">
    echo $i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
`12345678910`
*/</span></pre>

<p>
	سيزيد المثال التالي قيمة المتغير <code>‎$i</code> مرة واحدة على الأقل ويستمر بزيادة قيمته ما دامت أصغر من 25.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_55" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">while</span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">25</span><span class="pun">);</span><span class="pln">

echo </span><span class="str">'The final value of i is: '</span><span class="pun">,</span><span class="pln"> $i</span><span class="pun">;</span><span class="pln">
</span><span class="com">// The final value of i is: 25</span></pre>

<h2>
	تعليمات التحكم
</h2>

<h3>
	goto
</h3>

<p>
	يسمح لنا العامل <code>goto</code> بالانتقال إلى جزء آخر من البرنامج ومتوفر منذ الإصدار PHP 5.3، ويتبعه اسم لافتة (label) الهدف المطلوب: <code>goto MyLabel;‎</code>.
</p>

<p>
	يوصف الهدف المطلوب الانتقال إليه باسم اللافتة يتبعه نقطتين مثل: <code>MyLabel:‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_57" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">goto</span><span class="pln"> </span><span class="typ">MyLabel</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">'This text will be skipped, because of the jump.'</span><span class="pun">;</span><span class="pln">

</span><span class="typ">MyLabel</span><span class="pun">:</span><span class="pln">
echo </span><span class="str">'Hello World!'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span><span class="pln">

/*
Hello World!
*/</span></pre>

<h3>
	return
</h3>

<p>
	تُرجع تعليمة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/return" rel="">return</a> تحكم البرنامج إلى الوحدة التي قامت بالاستدعاء، وسيستمر التنفيذ إلى التعبير الذي يلي تعبير الاستدعاء.
</p>

<p>
	عندما تُستدعى <code>return</code> من ضمن دالة فإنّ تنفيذها سينتهي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_59" style=""><span class="kwd">function</span><span class="pln"> returnEndsFunctions</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'This is executed'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">'This is not executed.'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// This is executed</span></pre>

<p>
	إذا استدعيت <code>return</code> داخل دالة لها وسيط فإنّها ستنهي تنفيذها على الفور وتعيد الوسيط كقيمة لاستدعاء الدالة.
</p>

<h3>
	continue
</h3>

<p>
	توقف الكلمة المفتاحية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/continue" rel="">continue</a> التكرار الحالي للحلقة وينتقل إلى التكرار التالي لها، وتوضع مثل تعليمة <code>break</code> داخل جسم الحلقة.
</p>

<p>
	تطبع الحلقة في المثال التالي رسالة بالاعتماد على القيم في مصفوفة لكنها تتجاوز قيمة معينة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_61" style=""><span class="pln">$list </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cherry'</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$list </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$value </span><span class="pun">==</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">continue</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    echo </span><span class="str">"I love to eat {$value} pie."</span><span class="pun">.</span><span class="pln">PHP_EOL</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/*
I love to eat apple pie.
I love to eat cherry pie.
*/</span></pre>

<p>
	قد تُستخدم تعليمة <code>continue</code> لينتقل التنفيذ بشكلٍ مباشر إلى مستوى خارجي من الحلقة بوصف عدد مستويات الحلقة التي نريد تجاوزها. بفرض لدينا المعلومات التالية:
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				Fruit
			</th>
			<th>
				Color
			</th>
			<th>
				Cost
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
		</tr>
		<tr>
			<td>
				Apple
			</td>
			<td>
				Red
			</td>
			<td>
				1
			</td>
		</tr>
		<tr>
		</tr>
		<tr>
			<td>
				Banana
			</td>
			<td>
				Yellow
			</td>
			<td>
				7
			</td>
		</tr>
		<tr>
		</tr>
		<tr>
			<td>
				Cherry
			</td>
			<td>
				Red
			</td>
			<td>
				2
			</td>
		</tr>
		<tr>
		</tr>
		<tr>
			<td>
				Grape
			</td>
			<td>
				Green
			</td>
			<td>
				4
			</td>
		</tr>
		<tr>
		</tr>
	</tbody>
</table>

<p>
	نريد تنفيذ شيفرة معينة عند الفاكهة التي تكلف أقل من 5:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_63" style=""><span class="pln">$data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Fruit"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Color"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Cost"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Fruit"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Color"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Yellow"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Cost"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pln"> </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Fruit"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Cherry"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Color"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Cost"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Fruit"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Grape"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Color"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Green"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Cost"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$data </span><span class="kwd">as</span><span class="pln"> $fruit</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$fruit </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$key </span><span class="pun">==</span><span class="pln"> </span><span class="str">"Cost"</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $value </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">continue</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="com">/* الشيفرة التي نريد تنفيذها */</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عندما تُنفَّذ التعليمة <code>continue 2</code> سينتقل التنفيذ مباشرةً إلى <code>‎$‎data as $fruit‎</code> لتستمر الحلقة الخارجية (وستتجاهل باقي الشيفرة بما في ذلك الشرط في الحلقة الداخلية).
</p>

<h3>
	break
</h3>

<p>
	تُنهي الكلمة المفتاحية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/break" rel="">break</a> تنفيذ الحلقة الحالية مباشرةً، بشكلٍ مشابه للتعليمة <code>continue</code> لكن الفرق هو أنّ <code>break</code> توقف الحلقة ولا تنفذ التعليمة الشرطية بعد ذلك.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_65" style=""><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="lit">120</span><span class="pun">/</span><span class="pln">$i</span><span class="pun">.</span><span class="pln">PHP_EOL</span><span class="pun">;</span><span class="pln">
    $i </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/*
24
30
40
60
120
*/</span></pre>

<p>
	لن تُنفَّذ الحلقة عندما يكون <code>‎$i == 0</code> إذ أنّ تنفيذها سيرمي خطأً فادحًا بسبب القسمة على 0.
</p>

<p>
	قد تُستخدم تعليمة <code>break</code> للخروج عدة مستويات من الحلقة ويعدّ هذا مفيدًا عند تنفيذ الحلقات المتداخلة، فمثلًا لنسخ مصفوفة سلاسل نصية إلى السلسلة النصية الخرج، بعد حذف رموز <code>#</code> ?حتى تصبح السلسلة النصية في الخرج 160 محرفًا تمامًا.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_67" style=""><span class="pln">$output </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
$inputs </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">"#soblessed #throwbackthursday"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"happy tuesday"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"#nofilter"</span><span class="pun">,</span><span class="pln">
    </span><span class="com">/* المزيد من الدخل */</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$inputs </span><span class="kwd">as</span><span class="pln"> $input</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> strlen</span><span class="pun">(</span><span class="pln">$input</span><span class="pun">);</span><span class="pln"> $i </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$input</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'#'</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">continue</span><span class="pun">;</span><span class="pln">
        $output </span><span class="pun">.=</span><span class="pln"> $input</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">];</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">strlen</span><span class="pun">(</span><span class="pln">$output</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">160</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
$output </span><span class="pun">.=</span><span class="pln"> </span><span class="str">' '</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	توقف التعليمة <code>break 2</code> تنفيذ الحلقتين الداخلية والخارجية مباشرةً.
</p>

<h2>
	بنى تحكم أخرى
</h2>

<h3>
	declare
</h3>

<p>
	تُستخدم بنية <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/declare" rel="">declare</a> لتعيين موجّه التنفيذ (execution directive) لكتلة شيفرة.
</p>

<p>
	التوجيهات المعرَّفة:
</p>

<ul>
	<li>
		<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/declare#.D8.A7.D9.84.D9.85.D9.88.D8.AC.D9.87_Ticks" rel="">ticks</a>.
	</li>
	<li>
		الترميز <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/declare#.D8.A7.D9.84.D8.AA.D8.B1.D9.85.D9.8A.D8.B2_Encoding" rel="">encoding</a>.
	</li>
	<li>
		<a href="https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict" rel="external nofollow">strict_types</a>.
	</li>
</ul>

<p>
	بفرض أننا نريد تعيين قيمة ticks هي 1:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_69" style=""><span class="pln">declare</span><span class="pun">(</span><span class="pln">ticks</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	لتمكين نمط الكتابة الصارم نستخدم تعليمة <code>declare</code> التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_71" style=""><span class="pln">declare</span><span class="pun">(</span><span class="pln">strict_types</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span></pre>

<h3>
	include وrequire
</h3>

<p>
	<strong>require</strong>
</p>

<p>
	العبارة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/require" rel="">require</a> مطابقة للعبارة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/include" rel="">include</a> باستثناء أنّها تطلق خطأ من نوع <code>E_COMPLE_ERROR</code> في حالة الفشل أي أنّها توقف عمل الشيفرة تمامًا أما <code>include</code> تطلق تحذيرًا <code>E_WARNING</code> والذي لا يؤدي إلى إيقاف الشيفرة عن العمل.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_73" style=""><span class="kwd">require</span><span class="pln"> </span><span class="str">'file.php'</span><span class="pun">;</span></pre>

<p>
	<strong>include</strong>
</p>

<p>
	تعمل تعليمة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/include" rel="">include</a> على تضمين ومعالجة الملف المحدّد.
</p>

<p>
	بفرض لدينا الملفين <code>variables.php</code> و<code>main.php</code> في نفس المجلد، محتوى الملف <code>variables.php</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_75" style=""><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello World!'</span><span class="pun">;</span></pre>

<p>
	ومحتوى الملف <code>main.php</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_77" style=""><span class="pln">include </span><span class="str">'variables.php'</span><span class="pun">;</span><span class="pln">
echo $a</span><span class="pun">;</span><span class="pln">

</span><span class="com">// `Hello World!`</span></pre>

<p>
	يجب أن تكون حذرًا عند اتّباع هذه الطريقة فهي يمكن أن تؤدي إلى مشاكل في الشيفرة عند تضمين ملف قد يغيّر في كمية ومحتوى المتغيّرات المعرّفة ضمن النطاق المُعطى.
</p>

<p>
	يمكنك أن تضمّن ملفًا يُرجع قيمة وهذا مفيد بشكلٍ خاص في معالجة مصفوفات الإعدادات، مثال لملف <code>configuration.php</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_79" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'dbname'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'my db'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'user'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'admin'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'pass'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'password'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span></pre>

<p>
	نضمّنه ضمن ملف آخر بنفس المجلد الموجود فيه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_81" style=""><span class="pun">&lt;?</span><span class="pln">php
$config </span><span class="pun">=</span><span class="pln"> include </span><span class="str">'configuration.php'</span><span class="pun">;</span></pre>

<p>
	ستمنع هذه الطريقة الملف المضمَّن من إفساد نطاقك الحالي بالمتغيرات المتغيرة أو المُضافة.
</p>

<p>
	يمكن أن نستخدم <code>include</code> و<code>require</code> لإسناد قيم إلى متغير عند إرجاع قيمة ما من ملف. مثال: بفرض لدينا الملف <code>include1.php</code> فيه الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_83" style=""><span class="pun">&lt;?</span><span class="pln">php
    $a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is to be returned"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	والملف <code>index.php</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_85" style=""><span class="pln">$value </span><span class="pun">=</span><span class="pln"> include </span><span class="str">'include1.php'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// $value = "This is to be returned"</span></pre>

<h2>
	الصياغة البديلة لبنى التحكم
</h2>

<h3>
	تعليمة if/else بديلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_87" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln">
    do_something</span><span class="pun">();</span><span class="pln">
elseif </span><span class="pun">(</span><span class="pln">$another_condition</span><span class="pun">):</span><span class="pln">
    do_something_else</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
    do_something_different</span><span class="pun">();</span><span class="pln">
endif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الشيفرة السابقة مكافئة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_89" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php elseif </span><span class="pun">(</span><span class="pln">$another_condition</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something else in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">else</span><span class="pun">:</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something different in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endif</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<h3>
	تعليمة for بديلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_91" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++):</span><span class="pln">
    do_something</span><span class="pun">(</span><span class="pln">$i</span><span class="pun">);</span><span class="pln">
endfor</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الشيفرة السابقة مكافئة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_93" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something in HTML with </span><span class="pun">&lt;?</span><span class="pln">php echo $i</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endfor</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<h3>
	تعليمة while بديلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_95" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln">
    do_something</span><span class="pun">();</span><span class="pln">
endwhile</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الشيفرة السابقة مكافئة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_97" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endwhile</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<h3>
	تعليمة foreach بديلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_99" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$collection </span><span class="kwd">as</span><span class="pln"> $item</span><span class="pun">):</span><span class="pln">
    do_something</span><span class="pun">(</span><span class="pln">$item</span><span class="pun">);</span><span class="pln">
endforeach</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الشيفرة السابقة مكافئة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_101" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$collection </span><span class="kwd">as</span><span class="pln"> $item</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something in HTML with </span><span class="pun">&lt;?</span><span class="pln">php echo $item</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endforeach</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<h3>
	شيفرة switch بديلة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_103" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> $value</span><span class="pun">:</span><span class="pln">
        do_something</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
        do_something_else</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
endswitch</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الشيفرة السابقة مكافئة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4321_105" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">case</span><span class="pln"> $value</span><span class="pun">:</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">Do something else in HTML</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endswitch</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Control Structures - Loops - Alternative Syntax for Control Structures] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<p>
	 
</p>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-php-r1076/" rel="">الدوال في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-php-r1047/" rel="">التعامل مع الوقت والتاريخ في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1048</guid><pubDate>Sun, 08 Nov 2020 13:08:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x648;&#x642;&#x62A; &#x648;&#x627;&#x644;&#x62A;&#x627;&#x631;&#x64A;&#x62E; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-php-r1047/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/9.png.69d0016348689a0ec569d54c3c8351b5.png" /></p>
<h2>
	الصنف Datetime
</h2>

<h3>
	إنشاء نسخة <code>Datetime</code> ثابتة من متغير
</h3>

<p>
	يمكنك استخدام الشيفرة التالية لإنشاء <code>‎\DateTimeImmutable‎</code> في PHP الإصدار 5.6 وما بعده:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_7" style=""><span class="pln">\DateTimeImmutable</span><span class="pun">::</span><span class="pln">createFromMutable</span><span class="pun">(</span><span class="pln">$concrete</span><span class="pun">);</span></pre>

<p>
	أما في الإصدارات السابقة يمكنك استخدام:
</p>

<pre class="ipsCode">\DateTimeImmutable::createFromFormat(\DateTime::ISO8601, $mutable-&gt;format(\DateTime::ISO8601), $mutable-&gt;getTimezone());
</pre>

<h3>
	إضافة أو طرح تاريخ
</h3>

<p>
	نستخدم الصنف <a href="%E2%80%8Fhttps://www.php.net/manual/pt_BR/class.dateinterval.php" rel="">DateInterval</a> لإضافة أو طرح فترة زمنية في كائن <code>DateTime</code>، إليك المثال التالي الذي نطرح فيه 7 أيام ونطبع رسالة على الشاشة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_9" style=""><span class="com">// التعليمة التالية بدون وسيط تُرجع التاريخ الحالي</span><span class="pln">
$now </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">();</span><span class="pln">

</span><span class="com">// الكائن التالي يمثل فترة زمنية مدتها 7 أيام</span><span class="pln">
$interval </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateInterval</span><span class="pun">(</span><span class="str">'P7D'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// DateTime التعليمة التالية ستُرجع كائن </span><span class="pln">
$lastDay </span><span class="pun">=</span><span class="pln"> $now</span><span class="pun">-&gt;</span><span class="pln">add</span><span class="pun">(</span><span class="pln">$interval</span><span class="pun">);</span><span class="pln">

</span><span class="com">// ويُرجع سلسلة نصية DateTime ينسّق هذا التابع كائن</span><span class="pln">
$formatedLastDay </span><span class="pun">=</span><span class="pln"> $lastDay</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d'</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"Samara says: Seven Days. You'll be happy on $formatedLastDay."</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*
عند تنفيذ هذه الشيفرة في 1-8-2016 يكون الخرج
Samara says: Seven Days. You'll be happy on 2016-08-08.
*/</span></pre>

<p>
	نستطيع استخدام التابع الفرعي بطريقة مشابهة لطرح التواريخ:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_11" style=""><span class="pln">$now</span><span class="pun">-&gt;</span><span class="kwd">sub</span><span class="pun">(</span><span class="pln">$interval</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"Samara says: Seven Days. You were happy last on $formatedLastDay."</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*
عند تنفيذ هذه الشيفرة في 1-8-2016 يكون الخرج
Samara says: Seven Days. You were happy last on 2016-07-25.
*/</span></pre>

<h3>
	getTimestamp
</h3>

<p>
	<code>getTimeStemp</code> هو تمثيل unix لكائن من الصنف <code>datetime</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_13" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">();</span><span class="pln">
echo $date</span><span class="pun">-&gt;</span><span class="pln">getTimestamp</span><span class="pun">();</span></pre>

<p>
	سيؤدي ذلك إلى وضع مؤشر صحيح للثواني التي انقضت منذ 00:00:00 UTC، الخميس، 1 كانون الثاني 1970.
</p>

<h3>
	setDate
</h3>

<p>
	تضبط هذه الدالة التاريخ لكائن من الصنف <code>datetime</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_15" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">();</span><span class="pln">
$date</span><span class="pun">-&gt;</span><span class="pln">setDate</span><span class="pun">(</span><span class="lit">2016</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">);</span></pre>

<p>
	تضبط هذه الشيفرة التاريخ ليصبح 25 تموز، 2015 وخرجها:
</p>

<pre class="ipsCode">2016-07-25 17:52:15.819442
</pre>

<h3>
	إنشاء DateTime من تنسيق معين
</h3>

<p>
	إنّ PHP قادرة على تحليل <a href="https://www.php.net/manual/en/datetime.formats.php%E2%80%8F" rel="external nofollow">عدة تنسيقات للتاريخ</a>، يمكنك استخدام التابع الساكن <a href="%E2%80%8Fhttps://www.php.net/manual/en/datetime.createfromformat.php" rel="">DateTime::createFromFormat</a> إذا أردت تحليل تنسيق غير معياري أو إذا أردت أن تحدد في شيفرتك تنسيق التاريخ المُستخدم بشكلٍ صريح:
</p>

<p>
	<strong>نمط كائني التوجه</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_18" style=""><span class="pln">$format </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Y,m,d"</span><span class="pun">;</span><span class="pln">
$time </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2009,2,26"</span><span class="pun">;</span><span class="pln">
$date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">::</span><span class="pln">createFromFormat</span><span class="pun">(</span><span class="pln">$format</span><span class="pun">,</span><span class="pln"> $time</span><span class="pun">);</span></pre>

<p>
	<strong>نمط إجرائي</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_20" style=""><span class="pln">$format </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Y,m,d"</span><span class="pun">;</span><span class="pln">
$time </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2009,2,26"</span><span class="pun">;</span><span class="pln">
$date </span><span class="pun">=</span><span class="pln"> date_create_from_format</span><span class="pun">(</span><span class="pln">$format</span><span class="pun">,</span><span class="pln"> $time</span><span class="pun">);</span></pre>

<h3>
	طباعة DateTime
</h3>

<p>
	توفر PHP من الإصدار 4 وما بعده تابع تنسيق كائني التوجه يحول كائن <code>DateTime</code> إلى سلسلة نصية بالتنسيق الذي تريده:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_22" style=""><span class="kwd">public</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">::</span><span class="pln">format </span><span class="pun">(</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> $format </span><span class="pun">)</span></pre>

<p>
	تأخذ الدالة <code>date()‎</code> معاملًا واحدًا <code>format</code> بشكل سلسلة نصية ويستخدم محارف مفردة لتعريف التنسيق:
</p>

<ul>
	<li>
		<code>Y</code>: أربعة أرقام تمثل السنة (2016 مثلًا).
	</li>
	<li>
		<code>y</code>: رقمين يمثلان السنة (16 مثلًا).
	</li>
	<li>
		<code>m</code>: يمثّل الشهر بتنسيق رقم (من 01 إلى 12).
	</li>
	<li>
		<code>M</code>: يمثّل الشهر بثلاثة أحرف (مثل …Jan, Feb, Mar).
	</li>
	<li>
		<code>j</code>: يمثّل يوم في الشهر دون أصفار بادئة (من 1 إلى 31).
	</li>
	<li>
		<code>D</code>: يمثّل يوم في الأسبوع بثلاثة أحرف (مثل …Mon, Tue, Wed).
	</li>
	<li>
		<code>h</code>: يمثّل الساعة بتنسيق 12-ساعة (01 إلى 12).
	</li>
	<li>
		<code>H</code>: يمثّل الساعة بتنسيق 24-ساعة (00 إلى 23).
	</li>
	<li>
		<code>A</code>: إما AM أو PM.
	</li>
	<li>
		<code>i</code>: يمثّل الدقائق دون أصفار بادئة (من 00 إلى 59).
	</li>
	<li>
		<code>s</code>: يمثّل الثواني دون أصفار بادئة (من 00 إلى 59).
	</li>
	<li>
		يمكنك الاطلاع على اللائحة الكاملة <a href="https://www.php.net/manual/en/function.date.php" rel="external nofollow">هنا</a>.
	</li>
</ul>

<p>
	<strong>الاستخدام</strong> يمكن استخدام هذه المحارف في تركيبات مختلفة لعرض الوقت بأي تنسيق تريده، إليك بعض الأمثلة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_24" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2000-05-26T13:30:20'</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">/* Friday, May 26, 2000 at 1:30:20 PM */</span><span class="pln">

$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">"H:i"</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* 13:30 */</span><span class="pln">

$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">"H i s"</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* 13 30 20 */</span><span class="pln">

$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">"h:i:s A"</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* 01:30:20 PM */</span><span class="pln">

$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">"j/m/Y"</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* 26/05/2000 */</span><span class="pln">

$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">"D, M j 'y - h:i A"</span><span class="pun">);</span><span class="pln">
</span><span class="com">/* Fri, May 26 '00 - 01:30 PM */</span></pre>

<p>
	<strong>التنسيق الكائني التوجه:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_28" style=""><span class="pln">$date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="pln">$format</span><span class="pun">)</span></pre>

<p>
	<strong>التنسيق الإجرائي المشابه:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_30" style=""><span class="pln">date_format</span><span class="pun">(</span><span class="pln">$date</span><span class="pun">,</span><span class="pln"> $format</span><span class="pun">)</span></pre>

<h2>
	الحصول على الفرق بين تاريخين/وقتين
</h2>

<p>
	يعدّ استخدام الصنف <code>DateTime</code> الطريقة الأكثر عمليّة لنحصل على الفرق بين تاريخين أو وقتين، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_32" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// DateTime إنشاء كائن من الصنف</span><span class="pln">
$twoYearsAgo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">"2014-01-18 20:05:56"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// DateTime إنشاء كائن ثاني من الصنف</span><span class="pln">
$now </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">"2016-07-21 02:55:07"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// حساب الفرق</span><span class="pln">
$diff </span><span class="pun">=</span><span class="pln"> $now</span><span class="pun">-&gt;</span><span class="pln">diff</span><span class="pun">(</span><span class="pln">$twoYearsAgo</span><span class="pun">);</span><span class="pln">

</span><span class="com">// فرق السنوات بين التاريخين $diff-&gt;y يحتوي</span><span class="pln">
$yearsDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الدقائق بين التاريخين $diff-&gt;m يحتوي</span><span class="pln">
$monthsDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">m</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الأيام بين التاريخين $diff-&gt;d يحتوي</span><span class="pln">
$daysDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">d</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الساعات بين التاريخين $diff-&gt;h يحتوي</span><span class="pln">
$hoursDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">h</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الدقائق بين التاريخين $diff-&gt;i يحتوي</span><span class="pln">
$minsDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">i</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الثواني بين التاريخين $diff-&gt;s يحتوي</span><span class="pln">
$secondsDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">s</span><span class="pun">;</span><span class="pln">

</span><span class="com">// فرق الأيام بين التاريخين $diff-&gt;days يحتوي</span><span class="pln">
$totalDaysDiff </span><span class="pun">=</span><span class="pln"> $diff</span><span class="pun">-&gt;</span><span class="pln">days</span><span class="pun">;</span><span class="pln">

</span><span class="com">// $diff استخلاص معلومات المتغير</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$diff</span><span class="pun">);</span></pre>

<p>
	يمكننا أيضًا استخدام عوامل الموازنة للموازنة بين تاريخين بشكلٍ أسهل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_34" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// DateTime إنشاء كائن من الصنف</span><span class="pln">
$twoYearsAgo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">"2014-01-18 20:05:56"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// DateTime إنشاء كائن ثاني من الصنف</span><span class="pln">
$now </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">"2016-07-21 02:55:07"</span><span class="pun">);</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$now </span><span class="pun">&gt;</span><span class="pln"> $twoYearsAgo</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$twoYearsAgo </span><span class="pun">&gt;</span><span class="pln"> $now</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// bool(false)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$twoYearsAgo </span><span class="pun">&lt;=</span><span class="pln"> $twoYearsAgo</span><span class="pun">);</span><span class="pln">
 </span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$now </span><span class="pun">==</span><span class="pln"> $now</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// bool(true)</span></pre>

<h2>
	تغيير التاريخ إلى تنسيق آخر
</h2>

<p>
	أسهل طريقة لتغيير تنسيق التاريخ إلى تنسيق آخر هي استخدام <a href="%E2%80%8Fhttp://docs.php.net/manual/en/function.strtotime.php" rel="">strtotime()‎</a> مع <a href="%E2%80%8Fhttp://docs.php.net/manual/en/function.date.php" rel="">date()‎</a>، إذ أنّ <a href="%E2%80%8Fhttp://docs.php.net/manual/en/function.strtotime.php" rel="">strtotime()‎</a> ستغير التاريخ إلى تنسيق <a href="%E2%80%8Fhttps://en.wikipedia.org/wiki/Unix_time" rel="">الختم الزمني unix</a> ثمّ يُمرَّر إلى <code>date()‎</code> لتغييره إلى تنسيق جديد.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_36" style=""><span class="pln">$timestamp </span><span class="pun">=</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">);</span><span class="pln">
$new_date_format </span><span class="pun">=</span><span class="pln"> date</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">,</span><span class="pln"> $timestamp</span><span class="pun">);</span></pre>

<p>
	يمكن كتابة الشيفرة السابقة بسطرٍ واحد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_38" style=""><span class="pln">$new_date_format </span><span class="pun">=</span><span class="pln"> date</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">));</span></pre>

<p>
	تذكّر أنّ الدالة <code>strtotime()‎</code> تحتاج أن يكون التاريخ <a href="https://www.php.net/manual/en/datetime.formats.php" rel="external nofollow">بتنسيقٍ صالح</a> وإلا ستُرجع <code>false</code> وتصبح قيمة التاريخ <code>1969-12-31</code>.
</p>

<h3>
	استخدام DateTime()‎
</h3>

<p>
	توفر PHP بدءًا من الإصدار 5.2 الصنف <a href="%E2%80%8Fhttp://docs.php.net/manual/en/class.datetime.php" rel="">DateTime()‎</a> الذي يمنح أدوات قوية للعمل مع التاريخ والوقت، يمكننا استخدامه لكتابة الشيفرة السابقة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_40" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">);</span><span class="pln">
$new_date_format </span><span class="pun">=</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">);</span></pre>

<h3>
	العمل مع الأختام الزمنية unix
</h3>

<p>
	تأخذ الدالة <code>date()‎</code> معاملها الثاني بصيغة ختم زمني unix وتُرجع تاريخ منسّق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_42" style=""><span class="pln">$new_date_format </span><span class="pun">=</span><span class="pln"> date</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'1234567890'</span><span class="pun">);</span></pre>

<p>
	يعمل <code>DateTime()‎</code> مع الختم الزمني unix بإضافة <code>@</code> قبل الختم الزمني:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_44" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'@1234567890'</span><span class="pun">);</span><span class="pln">
$new_date_format </span><span class="pun">=</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">);</span></pre>

<p>
	إذا كان الختم الزمني لديك مقدّر بأجزاء الثانية (قد تكون نهايته 000 و/أو يتكون من 13 محرف) ستحتاج أن تحوّله إلى الثواني قبل أن تستطيع تغيير تنسيقه، يوجد طريقتين للقيام بذلك:
</p>

<ul>
	<li>
		حذف آخر 3 أرقام باستخدام <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.substr.php" rel="">substr()‎</a>: يمكن حذف الأرقام الثلاثة الأخيرة بعدة طرق لكن أسهلها استخدام <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.substr.php" rel="">substr()‎</a>:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_48" style=""><span class="pln">$timestamp </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="str">'1234567899000'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3</span><span class="pun">);</span></pre>

<ul>
	<li>
		القسمة على 1000: يمكنك أيضًا تحويل الختم الزمني إلى الثواني عن طريق القسمة على 1000، يمكنك استخدام المكتبة <a href="%E2%80%8Fhttps://www.php.net/manual/en/book.bc.php" rel="">BCMath</a> للقيام بالعمليات الرياضية كسلاسل نصية لأنّ الختم الزمني كبير جدًا على أنظمة 32 بت:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_50" style=""><span class="pln">$timestamp </span><span class="pun">=</span><span class="pln"> bcdiv</span><span class="pun">(</span><span class="str">'1234567899000'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'1000'</span><span class="pun">);</span></pre>

<p>
	يمكنك استخدام <code>strtotime()‎</code> للحصول على ختم زمني unix:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_52" style=""><span class="pln">$timestamp </span><span class="pun">=</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">'1973-04-18'</span><span class="pun">);</span></pre>

<p>
	يمكنك استخدام <code>DateTime::getTimestamp()‎</code> مع <code>DateTime()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_54" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">);</span><span class="pln">
$timestamp </span><span class="pun">=</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">getTimestamp</span><span class="pun">();</span></pre>

<p>
	يمكنك بدلًا من ذلك استخدام خيار التنسيق <code>U</code> إذا كنت تستخدم الإصدار PHP 5.2:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_56" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">);</span><span class="pln">
$timestamp </span><span class="pun">=</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'U'</span><span class="pun">);</span></pre>

<h3>
	العمل مع تنسيق التاريخ الغامض وغير المعياري
</h3>

<p>
	لسوء الحظ ليست كل التواريخ التي يحتاج المطور أن يتعامل معها تكون منسّقة بطريقة معيارية، لكن لحسن الحظ وفرت PHP 5.3 حلًّا لذلك، تسمح لنا <a href="%E2%80%8Fhttp://docs.php.net/manual/en/datetime.createfromformat.php" rel="">DateTime::createFromFormat()‎</a> بأن نخبر PHP عن تنسيق التاريخ لذا يمكن تحليلها بنجاح إلى كائن <code>DateTime</code> لمزيد من المعالجة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_58" style=""><span class="pln">$date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">::</span><span class="pln">createFromFormat</span><span class="pun">(</span><span class="str">'F-d-Y h:i A'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'April-18-1973 9:48 AM'</span><span class="pun">);</span><span class="pln">
$new_date_format </span><span class="pun">=</span><span class="pln"> $date</span><span class="pun">-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">);</span></pre>

<p>
	أعطتنا PHP 5.4 قابلة الوصول إلى عنصر في الصنف عند إنشاء نسخة مما يسمح لنا أن نكتب الشيفرة السابقة في سطر واحد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_60" style=""><span class="pln">$new_date_format </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="str">'2008-07-01T22:35:17.02'</span><span class="pun">))-&gt;</span><span class="pln">format</span><span class="pun">(</span><span class="str">'Y-m-d H:i:s'</span><span class="pun">);</span></pre>

<p>
	لكن هذا لا يعمل مع <code>DateTime::createFromFormat()‎</code> بعد.
</p>

<h2>
	تحليل وصف التاريخ باللغة الانكليزية إلى تنسيق تاريخ
</h2>

<p>
	يمكن تحليل نصوص مختلفة باللغة الانكليزية إلى تواريخ باستخدام الدالتين <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.strtotime.php" rel="">strtotime()‎</a> و<a href="%E2%80%8Fhttps://www.php.net/manual/en/function.date.php" rel="">date()‎</a> معًا.‍
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_62" style=""><span class="com">// طباعة التاريخ الحالي</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"now"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// m/d/Y طباعة تاريخ 10 أيلول، 2000 بالتنسيق</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"10 September 2000"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ الأمس</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"-1 day"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة نتيجة تاريخ اليوم + أسبوع</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"+1 week"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة نتيجة تاريخ اليوم + أسبوع ويومين و4 ساعات وثانيتين</span><span class="pln">

echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"+1 week 2 days 4 hours 2 seconds"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ يوم الخميس القادم</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"next Thursday"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ الاثنين الماضي</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"last Monday"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ اليوم الأول من الشهر القادم</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"First day of next month"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ اليوم الأخير من الشهر القادم</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"Last day of next month"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ اليوم الأول من الشهر الماضي</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"First day of last month"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طباعة تاريخ اليوم الأخير من الشهر الماضي </span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">"m/d/Y"</span><span class="pun">,</span><span class="pln"> strtotime</span><span class="pun">(</span><span class="str">"Last day of last month"</span><span class="pun">)),</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span></pre>

<h2>
	استخدام ثوابت معرّفة مسبقًا لتنسيق التاريخ
</h2>

<p>
	بدءًا من الإصدار PHP 5.1.0 يمكننا استخدام ثوابت معرّفة مسبقًا لتنسيق التاريخ في الدالة <code>date()‎</code> بدلًا من السلاسل النصية.
</p>

<p>
	<strong>ثوابت تنسيق التاريخ المعرّفة مسبقًا المتاحة:</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_64" style=""><span class="pln">DATE_ATOM
</span><span class="com">// (2016-07-22T14:50:01+00:00) (ATOM) الذرة </span><span class="pln">

DATE_COOKIE
</span><span class="com">// ‏(Friday, 22-Jul-16 14:50:01 UTC) HTTP ملفات تعريف الارتباط</span><span class="pln">

DATE_RSS
</span><span class="com">// (Fri, 22 Jul 2016 14:50:01 +0000) ‏RSS</span><span class="pln">

DATE_W3C
</span><span class="com">// (2016-07-22T14:50:01+00:00) اتحاد شبكة الويب العالمية</span><span class="pln">

DATE_ISO8601
</span><span class="com">// ‏(2016-07-22T14:50:01+0000) ISO-8601</span><span class="pln">

DATE_RFC822
</span><span class="com">// (Fri, 22 Jul 16 14:50:01 +0000) RFC 822</span><span class="pln">

DATE_RFC850
</span><span class="com">// ‏(Friday, 22-Jul-16 14:50:01 UTC) RFC 850</span><span class="pln">

DATE_RFC1036
</span><span class="com">// ‏(Fri, 22 Jul 16 14:50:01 +0000) RFC 1036</span><span class="pln">

DATE_RFC1123
</span><span class="com">// ‏(Fri, 22 Jul 2016 14:50:01 +0000) RFC 1123</span><span class="pln">

DATE_RFC2822
</span><span class="com">// (Fri, 22 Jul 2016 14:50:01 +0000) RFC 2822</span><span class="pln">

DATE_RFC3339
</span><span class="com">// ‏(2016-07-22T14:50:01+00:00) DATE_ATOM ‏‏نفس</span></pre>

<p>
	أمثلة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1190_66" style=""><span class="pln">echo date</span><span class="pun">(</span><span class="pln">DATE_RFC822</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Fri, 22 Jul 16 14:50:01 +0000</span><span class="pln">

echo date</span><span class="pun">(</span><span class="pln">DATE_ATOM</span><span class="pun">,</span><span class="pln">mktime</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">15</span><span class="pun">,</span><span class="lit">1947</span><span class="pun">));</span><span class="pln">
</span><span class="com">// 1947-08-15T00:00:00+05:30</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Datetime Class - Working with Dates and Time] من كتاب <a href="https://goalkicker.com/PHPBook" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-php-r1048/" rel="">بنى التحكم والحلقات التكرارية في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-php-r1046/" rel="">التنفيذ على المصفوفات والتعامل معها في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1047</guid><pubDate>Thu, 05 Nov 2020 13:08:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x646;&#x641;&#x64A;&#x630; &#x639;&#x644;&#x649; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639;&#x647;&#x627; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-php-r1046/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/8.png.89d0e877d6103dde772e3cfecbcb5b3d.png" /></p>

<h2>
	تطبيق دالة على كل عنصر من عناصر المصفوفة
</h2>

<p>
	نستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_map%E2%80%8E" rel="">array_map()‎</a> لتطبيق دالة على جميع عناصر مصفوفة ما، وتُرجع لنا مصفوفة جديدة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_7" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">);</span><span class="pln">

</span><span class="com">// يتم المرور على كل عنصر من عناصر المصفوفة ويُخزَّن في معامل الدالة</span><span class="pln">
$newArray </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $item </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> $array</span><span class="pun">);</span><span class="pln">

</span><span class="com">// array(2,3,4,5,6) الآن $newArray قيمة</span></pre>

<p>
	يمكنك استخدام دالة ذات اسم بدلًا من استخدام دالة مجهولة الاسم، فنكتب الشيفرة السابقة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_9" style="">
<span class="kwd">function</span><span class="pln"> addOne</span><span class="pun">(</span><span class="pln">$item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $item </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
$newArray </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="str">'addOne'</span><span class="pun">,</span><span class="pln"> $array</span><span class="pun">);</span></pre>

<p>
	إذا كانت الدالة المسمّاة هي تابع صنف فيجب تضمين مرجع إلى كائن الصنف الذي يعود التابع له عند استدعاء الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_11" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Example</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> addOne</span><span class="pun">(</span><span class="pln">$item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $item </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doCalculation</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
        $newArray </span><span class="pun">=</span><span class="pln"> array_map</span><span class="pun">(</span><span class="pln">array</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">,</span><span class="pln"> </span><span class="str">'addOne'</span><span class="pun">),</span><span class="pln"> $array</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الطريقة الثانية لتطبيق دالة على عناصر المصفوفة هي استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk" rel="">array_walk()‎</a> والدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk_recursive" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk_recursive" rel="">walk_recursive()‎</a>، يُمرَّر رد النداء (callback) إلى هاتين الدالتين ويأخذ مفتاح/فهرس وقيمة كل عنصر من عناصر المصفوفة، لا ترجع هذه الدوال دوالًا جديدة إنّما تُرجع قيمة منطقية تدل على نجاح تنفيذ الدالة، يمكننا مثلًا طباعة كل عنصر في المصفوفة بكتابة الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_13" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
array_walk</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">,</span><span class="pln"> $key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">' '</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="com">// "1 2 3 4 5"</span></pre>

<p>
	يمكن تمرير قيمة معامل رد النداء بالمرجعية مما يسمح لك بتمرير القيمة مباشرةً في المصفوفة الأصلية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_15" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
array_walk</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(&amp;</span><span class="pln">$value</span><span class="pun">,</span><span class="pln"> $key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $value</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// array(2,3,4,5,6) الآن $array قيمة</span></pre>

<p>
	نستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk_recursive" rel="">array_walk_recursive()‎</a> مع المصفوفات المتداخلة (nested) للتعامل مع كل مصفوفة فرعية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_19" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">),</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">
array_walk_recursive</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">,</span><span class="pln"> $key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $value </span><span class="pun">.</span><span class="pln"> </span><span class="str">' '</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// "1 2 3 4 5 6"</span></pre>

<p>
	لاحظ أنّ الدالتين <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk" rel="">array_walk()‎</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk_recursive" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_walk_recursive" rel="">walk_recursive()‎</a> يسمحان لك بتغيير قيمة عناصر المصفوفة وليس المفاتيح، كما أنّه يمكنك تمرير المفاتيح بالمرجع في رد النداء لكن هذا ليس له تأثير.
</p>

<h2>
	تقسيم المصفوفة إلى أجزاء (chunks)
</h2>

<p>
	تقسّم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">array_chunk()‎</a> المصفوفة إلى أجزاء صغيرة.
</p>

<p>
	بفرض لدينا الدالة أحادية البعد التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_21" style="">
<span class="pln">$input_array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'d'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'e'</span><span class="pun">);</span></pre>

<p>
	وطبّقنا الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">array_chunk()‎</a> عليها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_23" style="">
<span class="pln">$output_array </span><span class="pun">=</span><span class="pln"> array_chunk</span><span class="pun">(</span><span class="pln">$input_array</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	تقسّم الشيفرة السابقة المصفوفة إلى مصفوفات أصغر تحتوي كلّ منها عنصرين وتنشئ مصفوفة جديدة متعددة الأبعاد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_25" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> a
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> b
        </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> c
            </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> d
        </span><span class="pun">)</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> e
        </span><span class="pun">)</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	إذا لم يكن من الممكن تقسيم عناصر المصفوفة بالتساوي وفقًا للحجم المحدد فإنّ المصفوفة الأخيرة ستحمل العناصر الباقية وتكون أصغر من باقي المصفوفات.
</p>

<p>
	إذا مررنا للوسيط الثاني عددًا أصغر من 1 سيُرمى <code>E_WARNING</code> وستكون مصفوفة الخرج <code>NULL</code>.
</p>

<table>
<tbody></tbody>
<thead><tr>
<th>
				المعامل
			</th>
			<th>
				تفاصيل
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a>$array (array)<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a>
			</td>
			<td>
				مصفوفة الدخل التي نريد العمل عليها
			</td>
		</tr>
<tr>
<td>
				<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a>$size (int)<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a>
			</td>
			<td>
				حجم المصفوفة الصغيرة (عدد صحيح)‏
			</td>
		</tr>
<tr>
<td>
				<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a>$preserve_keys (boolean)<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_chunk" rel="">‎</a> (اختياري)
			</td>
			<td>
				FALSE وإلا TRUE إذا أردت أن تحافظ المصفوفات الصغيرة على المفاتيح تكون قيمته
			</td>
		</tr>
</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<h2>
	تجميع عناصر مصفوفة لتشكيل سلسلة نصية
</h2>

<p>
	تجمع الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/implode" rel="">implode()‎</a> كل قيم المصفوفة لكنها تفقد معلومات المفاتيح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_27" style="">
<span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"AA"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"BB"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"CC"</span><span class="pun">];</span><span class="pln">

echo implode</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="pln"> $arr</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">// AA BB CC</span></pre>

<p>
	نستطيع تجميع المفاتيح باستدعاء الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_keys" rel="">array_keys()‎</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_29" style="">
<span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"AA"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"BB"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"CC"</span><span class="pun">];</span><span class="pln">

echo implode</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="pln"> array_keys</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">));</span><span class="pln"> 

</span><span class="com">// a b c</span></pre>

<p>
	يعدّ تجميع القيم مع المفاتيح أكثر تعقيدًا لكن يمكن القيام به بنمط الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_31" style="">
<span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"AA"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"BB"</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"CC"</span><span class="pun">];</span><span class="pln">
echo implode</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="pln"> array_map</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $val</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// دالة تربط المفتاح بالقيمة</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"$key:$val"</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">},</span><span class="pln"> array_keys</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">),</span><span class="pln"> $arr</span><span class="pun">));</span><span class="pln">

</span><span class="com">// a:AA b:BB c:CC</span></pre>

<h2>
	تفكيك مصفوفة باستخدام list()‎
</h2>

<p>
	يمكن استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/list" rel="">list()‎</a> لإسناد قائمة من قيم المتغيرات إلى مصفوفة. كما يمكنك الاطلاع على الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/compact" rel="">compact()‎</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_33" style="">
<span class="com">// بمفاتيح مرقمة تبدأ من الصفر $array إلى عناصر المصفوفة $a,$b,$c إسناد قيم المتغيرات</span><span class="pln">
list</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">,</span><span class="pln"> $c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $array</span><span class="pun">;</span></pre>

<p>
	بدءًا من الإصدار 7.1 يمكنك استخدام الصيغة المختصرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_35" style="">
<span class="com">// بمفاتيح مرقمة تبدأ من الصفر $array إلى عناصر المصفوفة $a,$b,$c إسناد قيم المتغيرات</span><span class="pln">
</span><span class="pun">[</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">,</span><span class="pln"> $c</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $array</span><span class="pun">;</span><span class="pln">

</span><span class="com">//"a", "b", "c" والمفاتيح $array إلى عناصر المصفوفة $a,$b,$c إسناد قيم المتغيرات</span><span class="pln">
</span><span class="pun">[</span><span class="str">"a"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $a</span><span class="pun">,</span><span class="pln"> </span><span class="str">"b"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $b</span><span class="pun">,</span><span class="pln"> </span><span class="str">"c"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $c</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $array</span><span class="pun">;</span></pre>

<h2>
	الدالة <code>array_reduce</code>
</h2>

<p>
	تختزل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_reduce" rel="">array_reduce</a> المصفوفة إلى قيمة واحدة. تمرّ الدالة على كل عنصر من عناصر المصفوفة بنتيجة مُعادة من التكرار السابق وتنتج قيمة جديدة تحتفظ بها للتكرار التالي.
</p>

<p>
	الاستخدام:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_37" style="">
<span class="pln">array_reduce </span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){...},</span><span class="pln"> $defaul_value_of_first_carry</span><span class="pun">)</span></pre>

<p>
	‎$carry‎ هي النتيجة المعادة من التكرار السابق و‎$item يحمل قيمة التكرار الحالي.
</p>

<h3>
	مجموع مصفوفة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_39" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">([</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $carry </span><span class="pun">+</span><span class="pln"> $item</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// 15</span></pre>

<h3>
	أكبر عدد في المصفوفة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_43" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">([</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">,</span><span class="pln"> </span><span class="lit">211</span><span class="pun">,</span><span class="pln"> </span><span class="lit">34</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $item </span><span class="pun">&gt;</span><span class="pln"> $carry </span><span class="pun">?</span><span class="pln"> $item </span><span class="pun">:</span><span class="pln"> $carry</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// 211</span></pre>

<h3>
	هل كل العناصر أكبر من 100
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_45" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">([</span><span class="lit">101</span><span class="pun">,</span><span class="pln"> </span><span class="lit">230</span><span class="pun">,</span><span class="pln"> </span><span class="lit">210</span><span class="pun">,</span><span class="pln"> </span><span class="lit">341</span><span class="pun">,</span><span class="pln"> </span><span class="lit">251</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> $carry </span><span class="pun">&amp;&amp;</span><span class="pln"> $item </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true يجب أن تكون القيمة الافتراضية</span><span class="pln">

</span><span class="com">// true</span></pre>

<h3>
	هل يوجد عنصر أصغر من 100
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_47" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">([</span><span class="lit">101</span><span class="pun">,</span><span class="pln"> </span><span class="lit">230</span><span class="pun">,</span><span class="pln"> </span><span class="lit">21</span><span class="pun">,</span><span class="pln"> </span><span class="lit">341</span><span class="pun">,</span><span class="pln"> </span><span class="lit">251</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> $carry </span><span class="pun">||</span><span class="pln"> $item </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="com">// false يجب أن تكون القيمة الافتراضية</span><span class="pln">

</span><span class="com">// true</span></pre>

<h3>
	تجميع مصفوفة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_49" style="">
<span class="pln">$result </span><span class="pun">=</span><span class="pln"> array_reduce</span><span class="pun">([</span><span class="str">"hello"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"world"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"PHP"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"language"</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!</span><span class="pln">$carry </span><span class="pun">?</span><span class="pln"> $item </span><span class="pun">:</span><span class="pln"> $carry </span><span class="pun">.</span><span class="pln"> </span><span class="str">"-"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $item </span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// "hello-world-PHP-language"</span></pre>

<p>
	يمكنك أيضًا كتابة تابع للتجميع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_51" style="">
<span class="kwd">function</span><span class="pln"> implode_method</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> $piece</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> array_reduce</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$carry</span><span class="pun">,</span><span class="pln"> $item</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$piece</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!</span><span class="pln">$carry </span><span class="pun">?</span><span class="pln"> $item </span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$carry </span><span class="pun">.</span><span class="pln"> $piece </span><span class="pun">.</span><span class="pln"> $item</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$result </span><span class="pun">=</span><span class="pln"> implode_method</span><span class="pun">([</span><span class="str">"hello"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"world"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"PHP"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"language"</span><span class="pun">],</span><span class="pln"> </span><span class="str">"-"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// "hello-world-PHP-language"</span></pre>

<h2>
	دفع عنصر إلى نهاية مصفوفة
</h2>

<p>
	يوجد طريقتين لدفع عنصر إلى مصفوفة: الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_push" rel="">array_push()‎</a> و<code>‎$array[] =‎</code>.
</p>

<p>
	نستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_push" rel="">array_push()‎</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_53" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">];</span><span class="pln">
$newArraySize </span><span class="pun">=</span><span class="pln"> array_push</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">
</span><span class="com">// يُرجع التابع الحجم الجديد للمصفوفة</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
</span><span class="com">// تُمرّر المصفوفة بالمرجع لذا تُعدّل المصفوفة الأساسية لتحتوي العناصر الجديدة</span></pre>

<p>
	ستطبع الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_55" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">6</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	نستخدم <code>‎$array[] =‎</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_57" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">];</span><span class="pln">
$array</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span></pre>

<p>
	تطبع الشيفرة السابقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_59" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">6</span><span class="pln">
</span><span class="pun">)</span></pre>

<h2>
	ترشيح (Filtering) مصفوفة
</h2>

<p>
	نستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_filter" rel="">array_filter</a> لترشيح قيم من المصفوفة والحصول على مصفوفة جديدة تحقق كل شروط المُرشِّح.
</p>

<h3>
	ترشيح القيم غير الفارغة
</h3>

<p>
	أفضل حالة للترشيح هي إزالة جميع القيم الفارغة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_61" style="">
<span class="pln">$my_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="str">''</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,[],</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">];</span><span class="pln">
$non_empties </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$my_array</span><span class="pun">);</span><span class="pln"> </span><span class="com">// $non_empties will contain</span><span class="pln">
</span><span class="com">// [1,2,3,4,5,6,7,8] هو $non_empties يصبح محتوى المصفوفة</span></pre>

<h3>
	الترشيح برد النداء
</h3>

<p>
	بفرض أننا نريد الحصول على القيم الزوجية فقط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_63" style="">
<span class="pln">$my_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">];</span><span class="pln">

$even_numbers </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$my_array</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $number </span><span class="pun">%</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	تستقبل الدالة <code>array_filter</code> المصفوفة التي نريد ترشيحها في الوسيط الأول أما الوسيط الثاني فهو المُرشِّح الذي نريد تطبيقه.
</p>

<p>
	<strong>الإصدار PHP 5.6 وما بعده</strong>
</p>

<h3>
	الترشيح تبعًا للفهرس
</h3>

<p>
	يمكننا تمرير معامل ثالث للدالة <code>array_filter</code> يسمح بتعديل القيم الممررة إلى رد النداء، يمكن ضبط هذا المعامل على أنّه <code>ARRAY_FILTER_USE_KEY</code> أو <code>ARRAY_FILTER_USE_BOTH</code>، وهو يسمح أن يستقبل رد النداء المفاتيح بدلًا من القيم أو كلًا من المفاتيح والقيم كوسطاء. فإذا أردت التعامل مع الفهارس بدلًا من القيم مثلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_65" style="">
<span class="pln">$numbers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">16</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">];</span><span class="pln">

$even_indexed_numbers </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$numbers</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$index</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $index </span><span class="pun">%</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> ARRAY_FILTER_USE_KEY</span><span class="pun">);</span></pre>

<h3>
	الفهارس في المصفوفة المرشَّحة
</h3>

<p>
	لاحظ أنّ الدالة <code>array_filter</code> تحافظ على مفاتيح المصفوفة الأصلية، ومن الخطأ أن تقوم بتنفيذ حلقة <code>for</code> على المصفوفة المُرشَّحة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_67" style="">
<span class="pln">$my_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="str">''</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,[],</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">];</span><span class="pln">

$filtered </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$my_array</span><span class="pun">);</span><span class="pln">

</span><span class="com">// إظهار كل الأخطاء والملاحظات</span><span class="pln">
error_reporting</span><span class="pun">(</span><span class="pln">E_ALL</span><span class="pun">);</span><span class="pln"> 


</span><span class="com">// for من الخطأ استخدام حلقة</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$filtered</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> $filtered</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/*
:الخرج
1
Notice: Undefined offset: 1
2
Notice: Undefined offset: 3
3
Notice: Undefined offset: 5
4
Notice: Undefined offset: 7
*/</span></pre>

<p>
	حدث هذا لأن قيم الفهارس 1، 3، 5، 7 التي هي 0، <code>null</code>، سلسلة فارغة ''، مصفوفة فارغة <code>[]</code> على الترتيب قد حُذفت مع فهارسها.
</p>

<p>
	إذا كنت تحتاج تمرير حلقة على نتيجة مُرشِّح طُبِّق على مصفوفة مفهرسة، يجب أن تستدعي الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_values" rel="">array_values</a> لنتيجة الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_filter" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_filter" rel="">filter</a> لتُنشئ مصفوفة جديدة مع فهارس صحيحة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_69" style="">
<span class="pln">$my_array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="kwd">null</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="str">''</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,[],</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">];</span><span class="pln">
$filtered </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">$my_array</span><span class="pun">);</span><span class="pln">
$iterable </span><span class="pun">=</span><span class="pln"> array_values</span><span class="pun">(</span><span class="pln">$filtered</span><span class="pun">);</span><span class="pln">

error_reporting</span><span class="pun">(</span><span class="pln">E_ALL</span><span class="pun">);</span><span class="pln"> </span><span class="com">// إظهار كل الأخطاء والملاحظات</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$iterable</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> $iterable</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// لا يوجد تحذيرات</span></pre>

<h2>
	إزالة عناصر من مصفوفة
</h2>

<p>
	لإزالة عنصر من مصفوفة مثلًا العنصر الذي فهرسه 1:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_71" style="">
<span class="pln">$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"apples"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"peaches"</span><span class="pun">);</span><span class="pln">
unset</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]);</span></pre>

<p>
	ستزيل الشيفرة السابقة العنصر <code>apples</code> من المصفوفة لكن لاحظ أنّ الدالة <code>unset</code> لا تغيّر فهارس باقي العناصر لذا فإنّ المصفوفة <code>‎$fruit</code> تحتوي الآن الفهارس 0 و2.
</p>

<p>
	يمكنك الحذف في المصفوفات الترابطية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_73" style="">
<span class="pln">$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">=&gt;</span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'peaches'</span><span class="pun">);</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [0] =&gt; banana
    [one] =&gt; apple
    [1] =&gt; peaches
)
*/</span><span class="pln">

unset</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">[</span><span class="str">'one'</span><span class="pun">]);</span></pre>

<p>
	تصبح الآن المصفوفة <code>‎$fruit</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_75" style="">
<span class="pln">print_r</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [0] =&gt; banana
    [1] =&gt; peaches
)
*/</span></pre>

<p>
	لاحظ أنّ الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_77" style="">
<span class="pln">unset</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span></pre>

<p>
	تزيل تعيين المتغير لذا تحذف كامل المصفوفة أي أنّه لم يعد بإمكاننا الوصول إلى أي عنصر من عناصرها.
</p>

<h3>
	إزالة عناصر الأطراف
</h3>

<p>
	تُزيل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_shift" rel="">array_shift()‎</a> عنصرًا من بداية المصفوفة.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_79" style="">
<span class="pln">$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"apples"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"peaches"</span><span class="pun">);</span><span class="pln">
array_shift</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
Array
(
    [0] =&gt; apples
    [1] =&gt; peaches
)
</pre>

<p>
	تُزيل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_pop" rel="">array_pop()‎</a> عنصرًا من نهاية المصفوفة.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_82" style="">
<span class="pln">$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"apples"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"peaches"</span><span class="pun">);</span><span class="pln">
array_pop</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruit</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
Array
(
    [0] =&gt; bananas
    [1] =&gt; apples
)
</pre>

<h2>
	ترتيب مصفوفة
</h2>

<p>
	يوجد عدة دوال لترتيب المصفوفات في PHP:
</p>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/sort" rel="">sort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة عناصر المصفوفة ترتيبًا تصاعديًّا وفقًا لقيمها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_84" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Zitrone'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Orange'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Banane'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Apfel'</span><span class="pun">];</span><span class="pln">
sort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [0] =&gt; Apfel
    [1] =&gt; Banane
    [2] =&gt; Orange
    [3] =&gt; Zitrone
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/rsort" rel="">rsort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة عناصر المصفوفة ترتيبًا تنازليًّا وفقًا لقيمها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_86" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Zitrone'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Orange'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Banane'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Apfel'</span><span class="pun">];</span><span class="pln">
rsort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [0] =&gt; Zitrone
    [1] =&gt; Orange
    [2] =&gt; Banane
    [3] =&gt; Apfel
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/asort" rel="">asort()‎</a>
</h3>

<p>
	تُرتِّب هذه الدالة عناصر المصفوفة ترتيبًا تصاعديًّا وتحافظ على اقتران الفهارس مع القيم المرتبطة بها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_88" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'lemon'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'orange'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">];</span><span class="pln">
asort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [4] =&gt; apple
    [3] =&gt; banana
    [1] =&gt; lemon
    [2] =&gt; orange
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/arsort" rel="">arsort()‎</a>
</h3>

<p>
	تُرتِّب هذه الدالة عناصر المصفوفة ترتيبًا تنازليًّا وتحافظ على اقتران الفهارس مع القيم المرتبطة بها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_90" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'lemon'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'orange'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">];</span><span class="pln">
arsort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [2] =&gt; orange
    [1] =&gt; lemon
    [3] =&gt; banana
    [4] =&gt; apple
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/ksort" rel="">ksort()‎</a>
</h3>

<p>
	تُرتّب هذه الدالة المصفوفة ترتيبًا تصاعديًّا حسب المفتاح.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_92" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'d'</span><span class="pun">=&gt;</span><span class="str">'lemon'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">=&gt;</span><span class="str">'orange'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">=&gt;</span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">=&gt;</span><span class="str">'apple'</span><span class="pun">];</span><span class="pln">
ksort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [a] =&gt; orange
    [b] =&gt; banana
    [c] =&gt; apple
    [d] =&gt; lemon
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/krsort" rel="">krsort()‎</a>
</h3>

<p>
	تُرتّب هذه الدالة المصفوفة ترتيبًا تنازليًّا حسب المفتاح.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_94" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'d'</span><span class="pun">=&gt;</span><span class="str">'lemon'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">=&gt;</span><span class="str">'orange'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">=&gt;</span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">=&gt;</span><span class="str">'apple'</span><span class="pun">];</span><span class="pln">
krsort</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$fruits</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [d] =&gt; lemon
    [c] =&gt; apple
    [b] =&gt; banana
    [a] =&gt; orange
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/natsort" rel="">natsort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة المصفوفة بنفس الطريقة التي يرتّب بها الإنسان (ترتيب طبيعي).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_96" style="">
<span class="pln">$files </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'File8.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file77.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file7.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file13.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'File2.stack'</span><span class="pun">];</span><span class="pln">
natsort</span><span class="pun">(</span><span class="pln">$files</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$files</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [4] =&gt; File2.stack
    [0] =&gt; File8.stack
    [2] =&gt; file7.stack
    [3] =&gt; file13.stack
    [1] =&gt; file77.stack
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/natcasesort" rel="">natcasesort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة المصفوفة بنفس الطريقة التي يرتّب بها الإنسان (ترتيب طبيعي) لكن غير حساسة لحالة الأحرف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_98" style="">
<span class="pln">$files </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'File8.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file77.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file7.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'file13.stack'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'File2.stack'</span><span class="pun">];</span><span class="pln">
natcasesort</span><span class="pun">(</span><span class="pln">$files</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$files</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [4] =&gt; File2.stack
    [2] =&gt; file7.stack
    [0] =&gt; File8.stack
    [3] =&gt; file13.stack
    [1] =&gt; file77.stack
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/shuffle" rel="">shuffle()‎</a>
</h3>

<p>
	تخلط هذه الدالة عناصر المصفوفة (ترتيب عشوائي).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_100" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'aa'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bb'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'cc'</span><span class="pun">];</span><span class="pln">
shuffle</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span></pre>

<p>
	بما أنّ الترتيب عشوائي فليس هناك نتيجة واحدة محددة للشيفرة السابقة، فقد تكون مثلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_102" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> cc
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> bb
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> aa
</span><span class="pun">)</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/usort" rel="">usort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة المصفوفة باستخدام دالة موازنة معرّفة من قبل المستخدم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_104" style="">
<span class="kwd">function</span><span class="pln"> compare</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&lt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">];</span><span class="pln">
usort</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="str">'compare'</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [0] =&gt; 1
    [1] =&gt; 2
    [2] =&gt; 3
    [3] =&gt; 5
    [4] =&gt; 6
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/uasort" rel="">uasort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة المصفوفة باستخدام دالة موازنة معرّفة من قبل المستخدم وتحافظ على ارتباط الفهارس بالقيم المقابلة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_106" style="">
<span class="kwd">function</span><span class="pln"> compare</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&lt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">'c'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="str">'d'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">'e'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
uasort</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="str">'compare'</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
Array
(
    [e] =&gt; -5
    [b] =&gt; -3
    [a] =&gt; 1
    [d] =&gt; 3
    [c] =&gt; 5
)
*/</span></pre>

<h3>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/uksort" rel="">uksort()‎</a>
</h3>

<p>
	ترتّب هذه الدالة المصفوفة حسب المفاتيح باستخدام دالة موازنة معرّفة من قبل المستخدم.
</p>

<pre class="ipsCode prettyprint lang-perl prettyprinted" id="ips_uid_4709_108" style="">
<span class="pln">function compare</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        return </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    return </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&lt;</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'ee'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'g'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">'4'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="str">'k'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">'oo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
uksort</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="str">'compare'</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="pun">/*</span><span class="pln">
</span><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">ee</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">g</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">k</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">oo</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">5</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
</span><span class="pun">*/</span></pre>

<h2>
	إضافة بعض مفاتيح المصفوفة إلى اللائحة البيضاء
</h2>

<p>
	يمكنك استخدام الدالتين <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_key" rel="">array_intersect_key</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_flip" rel="">array_flip</a> معًا عندما تريد السماح بوجود مفاتيح محددة فقط في المصفوفة خاصةً عندما تأتي المفاتيح من معاملات طلب ما.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_110" style="">
<span class="pln">$parameters </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'foo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'baz'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'boo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'bam'</span><span class="pun">];</span><span class="pln">
$allowedKeys </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">];</span><span class="pln">
$filteredParameters </span><span class="pun">=</span><span class="pln"> array_intersect_key</span><span class="pun">(</span><span class="pln">$parameters</span><span class="pun">,</span><span class="pln"> array_flip</span><span class="pun">(</span><span class="pln">$allowedKeys</span><span class="pun">));</span><span class="pln">

</span><span class="com">// $filteredParameters = ['foo' =&gt; 'bar', 'bar' =&gt; 'baz]</span></pre>

<p>
	إذا لم يحتوي متغير المعاملات على أي مفتاح مسموح به فإنّ المتغير <code>filteredParameters</code> سيكون مصفوفة فارغة.
</p>

<p>
	ويمكنك أيضًا استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_filter" rel="">array_filter</a> لنفس الوظيفة بدءًا من الإصدار PHP 5.6، ممررًا الراية <code>ARRAY_FILTER_USE_KEY</code> كمعامل ثالث.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_112" style="">
<span class="pln">$parameters </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'foo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'hello'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'world'</span><span class="pun">];</span><span class="pln">
$allowedKeys </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">];</span><span class="pln">

$filteredParameters </span><span class="pun">=</span><span class="pln"> array_filter</span><span class="pun">(</span><span class="pln">
    $parameters</span><span class="pun">,</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$key</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$allowedKeys</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> in_array</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $allowedKeys</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    ARRAY_FILTER_USE_KEY
</span><span class="pun">);</span></pre>

<p>
	يوفر استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_filter" rel="">arrayfilter</a> مرونةً إضافيةً لإجراء اختبار عشوائي على المفاتيح، فمثلًا يمكن أن تحتوي المصفوفة <code>‎$allowedKeys</code> أنماطًا تعبيرية بدلًا من السلاسل النصية العادية، كما أنّها تذكر الهدف من الشيفرة بشكلٍ أكثر صراحة من الدالتين <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_key" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_key" rel="">intersect_key</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_flip" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_flip" rel="">flip</a>.
</p>

<h2>
	إضافة عنصر إلى بداية المصفوفة
</h2>

<p>
	يمكنك استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_unshift" rel="">array_unshift()‎</a> عند الحاجة إلى إضافة عنصر في بداية المصفوفة دون تغيير في ترتيب العناصر الحالية، إذ تضيف هذه الدالة العناصر الممررة بالكامل إلى بداية المصفوفة فتبقى العناصر الممررة بنفس الترتيب، وتعدَّل جميع المفاتيح العددية لتبدأ من الصفر بينما تبقى المفاتيح التي تكون بشكل سلسلة نصية كما هي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_114" style="">
<span class="pln">$myArray </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
array_unshift</span><span class="pun">(</span><span class="pln">$myArray</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$myArray</span><span class="pun">);</span><span class="pln">

</span><span class="com">// Array ( [0] =&gt; 4 [1] =&gt; 1 [2] =&gt; 2 [3] =&gt; 3 )</span></pre>

<p>
	بما أنّ الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_unshift" rel="">array_unshift()‎</a> تُجبر المصفوفة على إعادة تعيين أزواج مفتاح - قيمة والعنصر الجديد يجعل مفاتيح المداخل التالية تبدأ من <code>n+1</code> فمن الأسهل إنشاء مصفوفة جديدة وإضافة المصفوفة الحالية إلى المصفوفة المُنشأة حديثًا.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_116" style="">
<span class="pln">$myArray </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bananas'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">);</span><span class="pln">
$myElement </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'oranges'</span><span class="pun">);</span><span class="pln">
$joinedArray </span><span class="pun">=</span><span class="pln"> $myElement</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$myArray </span><span class="kwd">as</span><span class="pln"> $i</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $joinedArray</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// Array ( [0] =&gt; oranges [1] =&gt; apples [2] =&gt; bananas [3] =&gt; pears )</span></pre>

<p>
	يمكنك الاطلاع على <a href="https://www.tehplayground.com/#egwNCrZgr" rel="external nofollow">المثال هنا</a>
</p>

<h2>
	تبادل القيم مع المفاتيح
</h2>

<p>
	تستبدل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_flip" rel="">array_flip()‎</a> كل مفاتيح المصفوفة بالقيم المرتبطة معها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_118" style="">
<span class="pln">$colors </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'red'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'three'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

array_flip</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">/*
array(
    'red' =&gt; 'one',
    'blue' =&gt; 'two',
    'yellow' =&gt; 'three'
)
*/</span></pre>

<h2>
	دمج مصفوفتين في مصفوفة واحدة
</h2>

<p>
	تدمج الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_merge" rel="">array_merge()‎</a> مصفوفتين أو أكثر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_120" style="">
<span class="pln">$a1 </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">"red"</span><span class="pun">,</span><span class="str">"green"</span><span class="pun">);</span><span class="pln">
$a2 </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">"blue"</span><span class="pun">,</span><span class="str">"yellow"</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">array_merge</span><span class="pun">(</span><span class="pln">$a1</span><span class="pun">,</span><span class="pln">$a2</span><span class="pun">));</span><span class="pln">

</span><span class="com">/*
    Array ( [0] =&gt; red [1] =&gt; green [2] =&gt; blue [3] =&gt; yellow )
*/</span></pre>

<p>
	المصفوفة الترابطية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_122" style="">
<span class="pln">$a1</span><span class="pun">=</span><span class="pln">array</span><span class="pun">(</span><span class="str">"a"</span><span class="pun">=&gt;</span><span class="str">"red"</span><span class="pun">,</span><span class="str">"b"</span><span class="pun">=&gt;</span><span class="str">"green"</span><span class="pun">);</span><span class="pln">
$a2</span><span class="pun">=</span><span class="pln">array</span><span class="pun">(</span><span class="str">"c"</span><span class="pun">=&gt;</span><span class="str">"blue"</span><span class="pun">,</span><span class="str">"b"</span><span class="pun">=&gt;</span><span class="str">"yellow"</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">array_merge</span><span class="pun">(</span><span class="pln">$a1</span><span class="pun">,</span><span class="pln">$a2</span><span class="pun">));</span><span class="pln">
</span><span class="com">/*
    Array ( [a] =&gt; red [b] =&gt; yellow [c] =&gt; blue )
*/</span></pre>

<ul>
<li>
		تُدمج العناصر من مصفوفة أو واحدة أكثر فتُضاف قيم إحداها إلى نهاية المصفوفة الأخرى وتُرجع المصفوفة النهائية.
	</li>
	<li>
		إذا كان لمصفوفات الدخل نفس المفاتيح المكونة من سلاسل نصية فإنّ القيمة اللاحقة للمفتاح ستكتب فوق القيمة السابقة له أما إذا كانت المفاتيح عددية فإنّ القيمة اللاحقة ستُضاف ولن تكتب فوق القيمة السابقة للمفتاح.
	</li>
	<li>
		إذا كانت مفاتيح مصفوفة الدخل رقمية سيُعاد ترقيم القيم في مصفوفة النتيجة بمفاتيح تزايدية ابتداءً من الصفر.
	</li>
</ul>
<h2>
	معالجة عدة مصفوفات معًا
</h2>

<h3>
	تقاطع (intersection) المصفوفات
</h3>

<p>
	تُرجع الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect" rel="">array_intersect</a> مصفوفة من القيم الموجودة في جميع المصفوفات الممررة إليها وتحافظ على المفاتيح المرتبطة مع القيم المعادة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_124" style="">
<span class="pln">$array_one </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'one'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">];</span><span class="pln">
$array_two </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'four'</span><span class="pun">];</span><span class="pln">
$array_three </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">];</span><span class="pln">

$intersect </span><span class="pun">=</span><span class="pln"> array_intersect</span><span class="pun">(</span><span class="pln">$array_one</span><span class="pun">,</span><span class="pln"> $array_two</span><span class="pun">,</span><span class="pln"> $array_three</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $intersect = ['two', 'three']</span></pre>

<p>
	تتحقق الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect" rel="">array_intersect</a> من قيم المصفوفات فقط أما الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_assoc" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_assoc" rel="">intersect_assoc</a> تُرجع تقاطع القيم مع المفاتيح المرتبطة بها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_126" style="">
<span class="pln">$array_one </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">];</span><span class="pln">
$array_two </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">];</span><span class="pln">
$array_three </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">];</span><span class="pln">

$intersect </span><span class="pun">=</span><span class="pln"> array_intersect_assoc</span><span class="pun">(</span><span class="pln">$array_one</span><span class="pun">,</span><span class="pln"> $array_two</span><span class="pun">,</span><span class="pln"> $array_three</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $intersect = [1 =&gt;'one',2 =&gt; 'two']</span></pre>

<p>
	تتحقق الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_intersect_key" rel="">array_intersect_key</a> من التقاطع بتفحص المفاتيح فقط وتُرجع المفاتيح الموجودة في جميع المصفوفات الممررة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_128" style="">
<span class="pln">$array_one </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">];</span><span class="pln">
$array_two </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'four'</span><span class="pun">];</span><span class="pln">
$array_three </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'five'</span><span class="pun">];</span><span class="pln">

$intersect </span><span class="pun">=</span><span class="pln"> array_intersect_key</span><span class="pun">(</span><span class="pln">$array_one</span><span class="pun">,</span><span class="pln"> $array_two</span><span class="pun">,</span><span class="pln"> $array_three</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $intersect = [1 =&gt;'one',3 =&gt; 'three']</span></pre>

<h3>
	دمج أو ضم مصفوفتين
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_130" style="">
<span class="pln">$fruit1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">];</span><span class="pln">
$fruit2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'bananas'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">];</span><span class="pln">
$all_of_fruits </span><span class="pun">=</span><span class="pln"> array_merge</span><span class="pun">(</span><span class="pln">$fruit1</span><span class="pun">,</span><span class="pln"> $fruit2</span><span class="pun">);</span><span class="pln">

</span><span class="com">//$all_of_fruits = [0 =&gt; 'apples', 1 =&gt; 'pears', 2 =&gt; 'bananas', 3 =&gt; 'oranges']</span></pre>

<p>
	لاحظ أنّ الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_merge" rel="">array_merge()‎</a> ستغيّر الفهارس الرقمية وتكتب فوق الفهارس النصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_132" style="">
<span class="pln">$fruit1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">];</span><span class="pln">
$fruit2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'bananas'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">];</span><span class="pln">
$all_of_fruits </span><span class="pun">=</span><span class="pln"> array_merge</span><span class="pun">(</span><span class="pln">$fruit1</span><span class="pun">,</span><span class="pln"> $fruit2</span><span class="pun">);</span><span class="pln">

</span><span class="com">//$all_of_fruits = ['one' =&gt; 'bananas', 'two' =&gt; 'oranges']</span></pre>

<p>
	تعيد الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_merge" rel="">array_merge()‎</a> كتابة قيم المصفوفة الثانية فوق قيم المصفوفة الأولى إذا لم تستطع إعادة ترقيم فهارسها.
</p>

<p>
	يمكنك استخدام العامل <code>+</code> لدمج مصفوفتين بطريقة لا يمكن فيها للقيم أن يُكتب فوقها لكنها لا تُعيد ترقيم الفهارس العددية لذا تخسر قيم المصفوفات التي لها فهرس مُستخدم في المصفوفة الأولى.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_134" style="">
<span class="pln">$fruit1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">];</span><span class="pln">
$fruit2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'one'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'bananas'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">];</span><span class="pln">
$all_of_fruits </span><span class="pun">=</span><span class="pln"> $fruit1 </span><span class="pun">+</span><span class="pln"> $fruit2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// $all_of_fruits = ['one' =&gt; 'apples', 'two' =&gt; 'pears']</span><span class="pln">

$fruit1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">];</span><span class="pln">
$fruit2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'bananas'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">];</span><span class="pln">
$all_of_fruits </span><span class="pun">=</span><span class="pln"> $fruit1 </span><span class="pun">+</span><span class="pln"> $fruit2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// $all_of_fruits = [0 =&gt; 'apples', 1 =&gt; 'pears']</span></pre>

<h3>
	تغيير مصفوفة متعددة الأبعاد إلى مصفوفة ترابطية
</h3>

<p>
	إذا كان لديك مصفوفة متعددة الأبعاد مثل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_136" style="">
<span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'fizz'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'buzz'</span><span class="pun">],</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	وتريد تغييرها إلى مصفوفة ترابطية مثل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_138" style="">
<span class="pun">[</span><span class="pln">
    </span><span class="str">'foo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'fizz'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'buzz'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	فيمكنك استخدام الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4709_140" style="">
<span class="pln">$multidimensionalArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="str">'fizz'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'buzz'</span><span class="pun">],</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

$associativeArrayKeys   </span><span class="pun">=</span><span class="pln"> array_column</span><span class="pun">(</span><span class="pln">$multidimensionalArray</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
$associativeArrayValues </span><span class="pun">=</span><span class="pln"> array_column</span><span class="pun">(</span><span class="pln">$multidimensionalArray</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
$associativeArray       </span><span class="pun">=</span><span class="pln"> array_combine</span><span class="pun">(</span><span class="pln">$associativeArrayKeys</span><span class="pun">,</span><span class="pln"> $associativeArrayValues</span><span class="pun">);</span></pre>

<p>
	أو يمكنك تخطي الإعداد <code>‎$associativeArrayKeys</code> و<code>‎$associativeArrayValues</code> واستخدام الشيفرة البسيطة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_142" style="">
<span class="pln">$associativeArray </span><span class="pun">=</span><span class="pln"> array_combine</span><span class="pun">(</span><span class="pln">array_column</span><span class="pun">(</span><span class="pln">$multidimensionalArray</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">),</span><span class="pln">
array_column</span><span class="pun">(</span><span class="pln">$multidimensionalArray</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">));</span></pre>

<h3>
	جمع مصفوفتين (المفاتيح من واحدة والقيم من الأخرى)
</h3>

<p>
	تنشئ الدالة <a href="https://wiki.hsoub.com/PHP/array_combine" rel="external">array_combine()</a><em>‎</em> مصفوفةً جديدةً عن طريق استخدام المفاتيح من أحد المصفوفات والقيم من مصفوفة أخرى.
</p>

<p>
	يبين المثال التالي كيفية دمج مصفوفتين في مصفوفة واحدة ترابطية فيها المفاتيح من المصفوفة الأولى والقيم من المصفوفة الثانية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_145" style="">
<span class="pln">$array_one </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'key1'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'key2'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'key3'</span><span class="pun">];</span><span class="pln">
$array_two </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'value1'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'value2'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'value3'</span><span class="pun">];</span><span class="pln">
$array_three </span><span class="pun">=</span><span class="pln"> array_combine</span><span class="pun">(</span><span class="pln">$array_one</span><span class="pun">,</span><span class="pln"> $array_two</span><span class="pun">);</span><span class="pln">
var_export</span><span class="pun">(</span><span class="pln">$array_three</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
array (
    'key1' =&gt; 'value1',
    'key2' =&gt; 'value2',
    'key3' =&gt; 'value3',
)
*/</span></pre>

<h2>
	مكتبة PHP المعيارية لهياكل البيانات (SPL)
</h2>

<h3>
	SplFixedArray
</h3>

<p>
	<strong>الاختلاف عن مصفوفة PHP</strong>
</p>

<p>
	يُنفَّذ نوع المصفوفة الافتراضي في PHP كخرائط hash مرتبة مما يسمح لنا بإنشاء مصفوفات تحتوي على الأزواج قيمة/مفتاح، يمكن أن تكون القيم من أي نوع والمفاتيح إما أرقام أو سلاسل نصية، ومع ذلك فإنّ هذه ليست الطريقة التقليدية لإنشاء المصفوفات.
</p>

<p style="text-align: center;">
	<img alt="01.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="52573" data-unique="4vf3mvow0" src="https://academy.hsoub.com/uploads/monthly_2020_10/01.PNG.a864eb0b5ab06a293f13d2225fa89e5a.PNG"></p>

<p>
	كما تلاحظ في الرسم التوضيحي فإنّه من الممكن أن تُعرض مصفوفة PHP مثل مجموعة مرتبة من الأزواج قيمة/مفتاح حيث يُربَط كل مفتاح إلى أي قيمة. لاحظ أنّه في هذه المصفوفة لدينا مفاتيح عددية ومفاتيح بشكل سلاسل نصية بالإضافة إلى قيم من أنواع مختلفة والمفتاح ليس له تأثير على ترتيب العناصر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_147" style="">
<span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">9</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"foo"</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4.2</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"bar"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$arr </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$key =&gt; $value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تعطينا الشيفرة السابقة ما نتوقعه تمامًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_149" style="">
<span class="lit">9</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> foo </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4.2</span><span class="pln"> bar </span><span class="pun">=&gt;</span></pre>

<p>
	يُحدد حجم مصفوفات PHP العادية ديناميكيًا، ويزداد وينقص هذا الحجم بإضافة أو حذف عناصر إلى ومن المصفوفة بشكلٍ تلقائي، أما في المصفوفات التقليدية يكون الحجم ثابتًا وتتألف المصفوفة بالكامل من نفس نوع القيم ويمكننا الوصول إلى أي قيمة باستخدام الفهارس بدلًا من المفاتيح ويمكن استنتاج الفهرس من إزاحة القيمة في المصفوفة.
</p>

<p style="text-align: center;">
	<img alt="02.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="52574" data-unique="tfqes12f8" src="https://academy.hsoub.com/uploads/monthly_2020_10/02.PNG.aeebaca25d6e1fc9f21ab98d78562ca9.PNG"></p>

<p>
	وبما أننا سنعرف حجم نوع معين والحجم الثابت للمصفوفة فإنّ الإزاحة هي حجم النوع * n، إذ تمثّل n موضع القيمة في المصفوفة، يعطينا <code>‎$arr[0]‎</code> في المثال السابق القيمة 1 ويعطينا العنصر الأول في المصفوفة <code>‎$arr[1]‎</code> القيمة 2 وهكذا…
</p>

<p>
	ومع ذلك لا يقيّد الصنف <code>SplFixedArray</code> نوع القيم إنما يقيد نوع المفاتيح فقط والتي يجب أن تكون عددية، ?وأيضًا ذات حجم ثابت، وهذا يجعل المصفوفات من النوع <code>SplFixedArray</code> أكثر فعاليةٍ من المصفوفات العادية بطريقةٍ معينة فهي أصغر وتتطلب ذاكرة أقل.
</p>

<p>
	<strong>تهيئة المصفوفة</strong>
</p>

<p>
	تُنفَّذ المصفوفة من النوع <code>SplFixedArray</code> ككائن لكن يمكن الوصول إليها بنفس الصياغة التي نصل فيها إلى مصفوفة PHP العادية بما أنّها تنفّذ الواجهة <code>ArrayAccess</code> وتنفّذ أيضًا الواجهات <code>Countable</code> و<code>Iterator</code> لذا لها نفس سلوك مصفوفات PHP العادية الذي اعتدت عليه (أي الأشياء مثل <code>‎count(‎$arr)‎</code> و<code>foreach($arr as $k =&gt; $v)‎</code> تعمل بنفس الطريقة في المصفوفات من النوع <code>SplFixedArray</code> والمصفوفات العادية).
</p>

<p>
	يأخذ باني المصفوفة من النوع <code>SplFixedArray</code> وسيطًا واحدًا يعبّر عن حجم المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_151" style="">
<span class="pln">$arr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SplFixedArray</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln">
$arr</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"foo"</span><span class="pun">;</span><span class="pln">
$arr</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">;</span><span class="pln">
$arr</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"baz"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$arr </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$key =&gt; $value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تعطيك الشيفرة السابقة النتيجة:
</p>

<pre class="ipsCode">
0 =&gt; foo 1 =&gt; bar 2 =&gt; baz 3 =&gt;
</pre>

<p>
	كما أنّ الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_153" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">count</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">));</span></pre>

<p>
	تعطينا ما نتوقع:
</p>

<pre class="ipsCode">
int(4)
</pre>

<p>
	لاحظ أنه في المصفوفات من النوع <code>SplFixedArray</code> يصف المفتاح ترتيب العنصر في المصفوفة لأنه فهرس حقيقي وليس مجرد خريطة كما في المصفوفات العادية.?
</p>

<p>
	<strong>تغيير حجم المصفوفة</strong>
</p>

<p>
	تذكر دائمًا بما أنّ المصفوفة ذات حجم ثابت فإنّ عدّها سيعيد دائمًا القيمة نفسها، لذا طالما أنّ نتيجة <code>unset($arr[1])‎</code> هي <code>‎$arr[1] === null‎</code> تبقى نتيجة <code>count($arr)‎</code> هي 4، وتحتاج لتغيير حجم المصفوفة إلى استدعاء التابع <code>setSize</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_156" style="">
<span class="pln">$arr</span><span class="pun">-&gt;</span><span class="pln">setSize</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">count</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">));</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$arr </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$key =&gt; $value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الآن نحصل على النتيجة:
</p>

<pre class="ipsCode">
int(3) 0 =&gt; foo 1 =&gt; 2 =&gt; baz
</pre>

<p>
	<strong>الاستيراد من SplFixedArray والتصدير إلى SplFixedArray</strong>
</p>

<p>
	يمكنك استيراد/تصدير مصفوفة عادية إلى/من مصفوفة <code>SplFixedArray</code> باستخدام التوابع <code>fromArray</code> و<code>toArray</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4709_158" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
$fixedArray </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SplFixedArray</span><span class="pun">::</span><span class="pln">fromArray</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$fixedArray </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $value</span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// 1 2 3 4 5</span><span class="pln">

$fixedArray </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SplFixedArray</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln">
$fixedArray</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$fixedArray</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
$fixedArray</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
$fixedArray</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
$fixedArray</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> $fixedArray</span><span class="pun">-&gt;</span><span class="pln">toArray</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$array </span><span class="kwd">as</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $value</span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// 1 2 3 4 5</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Executing Upon an Array - Manipulating an Array - Processing Multiple Arrays Together - SPL data structures] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D9%81%D9%8A-php-r1047/" rel="">التعامل مع الوقت والتاريخ في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-php-r1045/" rel="">المصفوفات (Arrays) في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1046</guid><pubDate>Tue, 03 Nov 2020 13:07:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; (Arrays) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-php-r1045/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/7.png.d82f7ece9fb10c62df3941c928c5a680.png" /></p>

<p>
	المصفوفة (array) هي بنية بيانات تخزّن عدة قيم في قيمة واحدة، وهي خريطة مرتبة تربط بين القيم والمفاتيح. تُنشَأ مصفوفة مباشرة عبر الأقواس المعقوفة [] أو عبر الدالة Array()‎ التي تأخذ المعاملات التالية:
</p>

<table>
<tbody></tbody>
<thead><tr>
<th>
				المعامل
			</th>
			<th>
				التفاصيل
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				key (المفتاح)
			</td>
			<td>
				المفتاح هو المعرّف الفريد وفهرس المصفوفة. من الممكن أن يكون سلسلة نصية أو عدد صحيح مثل ‎'foo'‎، '5'، 10، 'a2b'‎
			</td>
		</tr>
<tr>
<td>
				value (القيمة)
			</td>
			<td>
				‏يوجد لكل مفتاح قيمة مقابلة (وإلا تكون null ويمكن أن تكون القيمة من أي نوع‎، وستظهر رسالة خطأ إذا حاولت الوصول إليه)‏ 
			</td>
		</tr>
</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<h2>
	تهيئة مصفوفة
</h2>

<p>
	يمكن أن نُهيأ مصفوفة فارغة عبر الدالة Array()‎ أو الأقواس [] مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_7" style="">
<span class="com">// مصفوفة فارغة</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span></pre>

<p>
	ويمكن أن نُهيأ مصفوفة ونعطيها قيم في نفس الوقت:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_9" style="">
<span class="com">// إنشاء مصفوفة بسيطة من 3 سلاسل نصية</span><span class="pln">
$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار</span><span class="pln">
$fruit </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pun">];</span></pre>

<p>
	ويمكن أيضًا أن نهيأ مصفوفة مع فهارس مخصصة (تسمى مصفوفة ترابطية associative array):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_11" style="">
<span class="com">// مصفوفة ترابطية بسيطة</span><span class="pln">
$fruit </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'first'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apples'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'second'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'third'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// يمكن أن نضبط القيمة والمفتاح كالتالي</span><span class="pln">
$fruit</span><span class="pun">[</span><span class="str">'first'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'apples'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// PHP 5.4 يمكن استخدام هذا التدوين المختزل بدءًا من الإصدار</span><span class="pln">
$fruit </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'first'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apples'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'second'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'pears'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'third'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'oranges'</span><span class="pln">
</span><span class="pun">];</span></pre>

<p>
	ستنشئ PHP المتغير تلقائيًا إذا لم يكن قد اُستخدم سابقًا، وهذا يجعل الشيفرة ملائمة لكنها صعبة القراءة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_13" style="">
<span class="pln">$foo</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Array( [0] =&gt; 1 )</span><span class="pln">
$bar</span><span class="pun">[][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Array( [0] =&gt; Array( [0] =&gt; 2 ) )</span></pre>

<p>
	تتابع PHP الفهرسة من حيث توقفت وتستخدم سلاسل نصية عددية كأعداد صحيحة للفهرسة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_15" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'melon'</span><span class="pun">];</span><span class="pln"> </span><span class="com">// Array( [2] =&gt; apple, [3] =&gt; melon )</span><span class="pln">

$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'2'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'melon'</span><span class="pun">];</span><span class="pln"> </span><span class="com">// نفس المصفوفة السابقة</span><span class="pln">

$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'this is index 3 temporarily'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'3'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'melon'</span><span class="pun">];</span><span class="pln">
</span><span class="com">// نفس المصفوفة السابقة، سيقوم العنصر الأخير بالكتابة فوق العنصر الثاني</span></pre>

<p>
	يمكنك استخدام الصنف <a href="%E2%80%8Fhttps://www.php.net/manual/en/class.splfixedarray.php" rel="">splfixedarray</a> لتهيئة المصفوفة بحجم ثابت:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_17" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SplFixedArray</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">
$array</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln"> </span><span class="com">// RuntimeException</span><span class="pln">

</span><span class="com">// زيادة حجم المصفوفة إلى 10</span><span class="pln">
$array</span><span class="pun">-&gt;</span><span class="pln">setSize</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span></pre>

<p>
	<strong>ملاحظة</strong>: المصفوفة المنشأة باستخدام الصف <code>SplFixedArray</code> لها مساحة ذاكرة منخفضة لمجموعات كبيرة من البيانات، ولكن يجب أن تكون المفاتيح أعدادًا صحيحة.
</p>

<p>
	لتهيئة مصفوفة بحجم ديناميكي وبعدة عناصر غير فارغة يمكنك استخدام حلقة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_19" style="">
<span class="pln">$myArray </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
$sizeOfMyArray </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
$fill </span><span class="pun">=</span><span class="pln"> </span><span class="str">'placeholder'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> $sizeOfMyArray</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $myArray</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $fill</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$myArray</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Array ( [0] =&gt; placeholder [1] =&gt; placeholder [2] =&gt; placeholder [3] =&gt; placeholder [4] =&gt; placeholder )</span></pre>

<p>
	يمكنك استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_fill" rel="">array_fill()‎</a> لإنشاء مصفوفة وإعطاء مفاتيحها نفس القيم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_21" style="">
<span class="pln">array array_fill </span><span class="pun">(</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $start_index </span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $num </span><span class="pun">,</span><span class="pln"> mixed $value </span><span class="pun">)</span></pre>

<p>
	تنشأ التعليمة السابقة وتُرجع مصفوفة فيها العدد <code>num</code> من العناصر التي قيمتها <code>value</code> بدءًا من الفهرس <code>start_index</code>، وإذا كانت قيمة <code>start_index</code> سالبة فستبدأ المصفوفة بفهرس سالب ثم تبدأ قيم الفهارس التالية من الصفر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_23" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> array_fill</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Array ( [5] =&gt; banana, [6] =&gt; banana, ..., [10] =&gt; banana)</span><span class="pln">

$b </span><span class="pun">=</span><span class="pln"> array_fill</span><span class="pun">(-</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="str">'pear'</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Array ( [-2] =&gt; pear, [0] =&gt; pear, ..., [2] =&gt; pear)</span></pre>

<p>
	<strong>نتيجة:</strong> عندما تستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_fill" rel="">array_fill()‎</a> تكون أكثر محدودية فيما تودّ فعله أما الحلقة فهي أكثر مرونة وتتيح لك الكثير من الخيارات.
</p>

<p>
	إذا أردت ملء المصفوفة بمجال أرقام (من 0 إلى 4 مثلًا) يمكنك إما إضافة كل عنصر بشكلٍ مفرد أو استخدام الدالة <a href="%E2%80%8F%E2%80%8Fhttps://wiki.hsoub.com/PHP/range" rel="">range()‎</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_27" style="">
<span class="pln">array range </span><span class="pun">(</span><span class="pln"> mixed $start </span><span class="pun">,</span><span class="pln"> mixed $end </span><span class="pun">[,</span><span class="pln"> number $step </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">]</span><span class="pln"> </span><span class="pun">)</span></pre>

<p>
	تنشأ هذه الدالة مصفوفة تحوي مجال من العناصر، وفيها المعاملان الأول والثاني إلزاميان إذ يحددان بداية ونهاية المجال أما المعامل الثالث فهو خياري ويحدد مقدار زيادة العناصر في المجال. مثال: إنشاء مجال من 0 إلى 4 بمقدار زيادة 1 ستكون نتيجته مصفوفة عناصرها: 0، 1، 2، 3، 4 أما إذا كان مقدار الزيادة 2 فستكون عناصر المصفوفة 0، 2، 4.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_29" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
$array_with_range </span><span class="pun">=</span><span class="pln"> range</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $array</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Array ( [0] =&gt; 1 [1] =&gt; 2 [2] =&gt; 3 [3] =&gt; 4 )</span><span class="pln">

print_r</span><span class="pun">(</span><span class="pln">$array_with_range</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Array ( [0] =&gt; 1 [1] =&gt; 2 [2] =&gt; 3 [3] =&gt; 4 )</span></pre>

<p>
	تعمل الدالة <code>range</code> بشكلٍ صحيح مع الأعداد الصحيحة والعشرية والمنطقية (التي حُوّلت إلى أعداد صحيحة) والسلاسل النصية، ولكن يجب أخذ الحذر عند استخدام الأعداد العشرية كوسيط بسبب مشكلة دقة الفاصلة العائمة.
</p>

<h2>
	التحقق من وجود مفتاح
</h2>

<p>
	يمكنك استخدام الدالة <a href="http://%E2%80%8Fhttps://www.php.net/manual/en/function.array-key-exists.php" rel="external nofollow">array_key_exists()‎</a> أو <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/isset" rel="">isset()‎</a> أو <code>‎!empty()‎</code> للتحقق من وجود مفتاح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_31" style="">
<span class="pln">$map </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'foo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'bar'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'foobar'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

array_key_exists</span><span class="pun">(</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> $map</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
isset</span><span class="pun">(</span><span class="pln">$map</span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
</span><span class="pun">!</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$map</span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
array_key_exists</span><span class="pun">(</span><span class="str">'bar'</span><span class="pun">,</span><span class="pln"> $map</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
isset</span><span class="pun">(</span><span class="pln">$map</span><span class="pun">[</span><span class="str">'bar'</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
</span><span class="pun">!</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$map</span><span class="pun">[</span><span class="str">'bar'</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	لاحظ أن الدالة <code>isset()‎</code> تعامل العنصر الذي قيمته <code>null</code> على أنّه غير موجود، وتعامل <code>‎!empty()‎</code> بالمثل أي عنصر قيمته <code>false</code> (استخدام موازنة ضعيفة مثل <code>null</code>، السلسلة الفارغة ' '، <code>‏0</code> تعاملها كلها على أنها <code>false</code>)، أي أن نتيجة <code>isset($map['foobar'])‎</code> هي <code>true</code> أما نتيجة ‎<code>!empty($map['foobar'])‎</code> هي <code>false</code>، يمكن أن يؤدي هذا إلى مشاكل (فمن الممكن أن تنسى مثلًا أنّ السلسلة النصية <code>'0'</code> تُعامَل على أنّها <code>false</code>) لذا فإنّ استخدام <code>‎!empty()‎</code> يمكن أن يكون غير مقبول.
</p>

<p>
	لاحظ أيضًا أنّ <code>isset()‎</code> و<code>‎!empty()‎</code> سيعملان ويعيدان <code>false</code> إذا كانت <code>‎$map</code> غير معرفة أبدًا وهذا يجعلهم عرضة للخطأ نوعًا ما عند الاستخدام:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_33" style="">
<span class="com">// "long"و "lang" الفرق بين اسمي المتحولين هو في الكلمتين</span><span class="pln">
$my_array_with_a_long_name </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'foo'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">];</span><span class="pln">

array_key_exists</span><span class="pun">(</span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> $my_array_with_a_lang_name</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يظهر تحذير</span><span class="pln">

isset</span><span class="pun">(</span><span class="pln">$my_array_with_a_lang_name</span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	يمكنك أيضًا التحقق في المصفوفات العادية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_35" style="">
<span class="pln">$ord </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">];</span><span class="pln">
</span><span class="com">// [0 =&gt; 'a', 1 =&gt; 'b'] المصفوفة السابقة تكافئ</span><span class="pln">

array_key_exists</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> $ord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
array_key_exists</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> $ord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	لاحظ أنّ أداء <code>isset()‎</code> أفضل من <code>array_key_exists()‎</code> لأنّ الأخيرة هي دالة والأولى هي بنية لغوية، ويمكنك أيضًا استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/key_exists" rel="">key_exists()‎</a> التي تعد كنية للدالة <code>array_key_exists()‎</code>.
</p>

<h2>
	التحقق من نوع المصفوفة
</h2>

<p>
	تُرجع الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/is_array" rel="">is_array()‎</a> القيمة <code>true</code> إذا كان المتغير مصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_37" style="">
<span class="pln">$integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1337</span><span class="pun">;</span><span class="pln">
$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1337</span><span class="pun">,</span><span class="pln"> </span><span class="lit">42</span><span class="pun">];</span><span class="pln">

is_array</span><span class="pun">(</span><span class="pln">$integer</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
is_array</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	يمكنك كتابة تلميح في الدالة أنّ نوع المعامل المفروض هو مصفوفة أي أنّ تمرير أي نوع آخر سيسبب خطأً فادحًا.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_39" style="">
<span class="kwd">function</span><span class="pln"> foo </span><span class="pun">(</span><span class="pln">array $array</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="com">/* هو مصفوفة $array نوع المتغير */</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	يمكنك أيضًا استخدام الدالة <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.gettype.php" rel="">gettype()‎</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_41" style="">
<span class="pln">$integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1337</span><span class="pun">;</span><span class="pln">
$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1337</span><span class="pun">,</span><span class="pln"> </span><span class="lit">42</span><span class="pun">];</span><span class="pln">

gettype</span><span class="pun">(</span><span class="pln">$integer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">'array'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
gettype</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">'array'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// true</span></pre>

<h2>
	إنشاء مصفوفة من المتغيرات
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_43" style="">
<span class="pln">$username </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hadibut'</span><span class="pun">;</span><span class="pln">
$email </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hadibut@example.org'</span><span class="pun">;</span><span class="pln">
$variables </span><span class="pun">=</span><span class="pln"> compact</span><span class="pun">(</span><span class="str">'username'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'email'</span><span class="pun">);</span><span class="pln">
</span><span class="com">// ['username' =&gt; 'Hadibut', 'email' =&gt; 'hadibut@example.org'] هي $variables قيمة</span></pre>

<p>
	يُستخدم هذا التابع غالبًا في إطارات العمل لتمرير مصفوفة متغيرات بين مكونين.
</p>

<h2>
	التحقق من وجود قيمة في مصفوفة
</h2>

<p>
	تُرجع الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/in_array" rel="">in_array()‎</a> القيمة <code>true</code> إذا كان العنصر موجودًا في المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_45" style="">
<span class="pln">$fruits </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">];</span><span class="pln">

$foo </span><span class="pun">=</span><span class="pln"> in_array</span><span class="pun">(</span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> $fruits</span><span class="pun">);</span><span class="pln">
</span><span class="com">//true هي $foo قيمة</span><span class="pln">

$bar </span><span class="pun">=</span><span class="pln"> in_array</span><span class="pun">(</span><span class="str">'orange'</span><span class="pun">,</span><span class="pln"> $fruits</span><span class="pun">);</span><span class="pln">
</span><span class="com">//false هي $bar قيمة</span></pre>

<p>
	ويمكنك أن تستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_search" rel="">array_search()‎</a> لتحصل على مفتاح عنصر ما من المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_47" style="">
<span class="pln">$userdb </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Sandra Shush'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Stefanie Mcmohn'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Michael'</span><span class="pun">];</span><span class="pln">
$pos </span><span class="pun">=</span><span class="pln"> array_search</span><span class="pun">(</span><span class="str">'Stefanie Mcmohn'</span><span class="pun">,</span><span class="pln"> $userdb</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$pos </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Stefanie Mcmohn found at $pos"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>الإصدار PHP 5.x من 5.5 وما فوق</strong>
</p>

<p>
	يمكنك بدءًا من الإصدار PHP 5.5 وما بعده استخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_column" rel="">array_column()‎</a> بالتزامن مع <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_search" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_search" rel="">search()‎</a> ويعدّ هذا مفيدًا بشكلٍ خاص للتحقق من وجود قيمة في المصفوفة الترابطية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_49" style="">
<span class="pln">$userdb </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"uid"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'100'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Sandra Shush'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"url"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'urlof100'</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"uid"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'5465'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Stefanie Mcmohn'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"pic_square"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'urlof100'</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">],</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">
        </span><span class="str">"uid"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'40489'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"name"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Michael'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"pic_square"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'urlof40489'</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">]</span><span class="pln">
</span><span class="pun">];</span><span class="pln">
$key </span><span class="pun">=</span><span class="pln"> array_search</span><span class="pun">(</span><span class="lit">40489</span><span class="pun">,</span><span class="pln"> array_column</span><span class="pun">(</span><span class="pln">$userdb</span><span class="pun">,</span><span class="pln"> </span><span class="str">'uid'</span><span class="pun">));</span></pre>

<h2>
	واجهات <code>ArrayAccess</code> و<code>Iterator</code>
</h2>

<p>
	الميزة المفيدة الأخرى هي الوصول إلى تجميعات الكائن المخصص كمصفوفات في PHP، يوجد واجهتين في PHP بدءًا من الإصدار PHP 5.0.0 لدعم ذلك وهما: <code>ArrayAccess</code> و<code>Iterator</code> يتيحان لك الوصول إلى الكائنات المخصصة على أنّها مصفوفات.
</p>

<h3>
	ArrayAccess
</h3>

<p>
	بفرض لدينا الصنف <code>user</code> يعبر عن مستخدم وجدول في قاعدة البيانات يخزن كل المستخدمين ونريد إنشاء الصنف <code>UserCollection</code> ليقوم بما يلي:
</p>

<ul>
<li>
		يسمح لنا بمخاطبة مستخدم عن طريق معرف الاسم الفريد.
	</li>
	<li>
		أداء العمليات الأساسية (ليس كل عمليات CRUD - الإنشاء والقراءة والتحديث والحذف - إنما على الأقل الإنشاء والاستعادة والحذف) على مجموعة المستخدمين لدينا.
	</li>
</ul>
<p>
	انتبه أننا نستخدم الصياغة القصيرة لإنشاء مصفوفة <code>[]</code> والمتاحة بدءًا من الإصدار 5.4:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_51" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">UserCollection</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">ArrayAccess</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $_conn</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">protected</span><span class="pln"> $_requiredParams </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'username'</span><span class="pun">,</span><span class="str">'password'</span><span class="pun">,</span><span class="str">'email'</span><span class="pun">];</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $config </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Configuration</span><span class="pun">();</span><span class="pln">
        $connectionParams </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="com">// معلومات الاتصال بقاعدة البيانات</span><span class="pln">
        </span><span class="pun">];</span><span class="pln">

        $this</span><span class="pun">-&gt;</span><span class="pln">_conn </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DriverManager</span><span class="pun">::</span><span class="pln">getConnection</span><span class="pun">(</span><span class="pln">$connectionParams</span><span class="pun">,</span><span class="pln"> $config</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> _getByUsername</span><span class="pun">(</span><span class="pln">$username</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $ret </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_conn</span><span class="pun">-&gt;</span><span class="pln">executeQuery</span><span class="pun">(</span><span class="str">'SELECT * FROM `User` WHERE `username` IN (?)'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">$username</span><span class="pun">])-&gt;</span><span class="pln">fetch</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $ret</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// ArrayAccess بدء التوابع المطلوبة من</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> offsetExists</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getByUsername</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> offsetGet</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getByUsername</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> offsetSet</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">,</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">is_array</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> \Exception</span><span class="pun">(</span><span class="str">'value must be an Array'</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        $passed </span><span class="pun">=</span><span class="pln"> array_intersect</span><span class="pun">(</span><span class="pln">array_values</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_requiredParams</span><span class="pun">),</span><span class="pln"> array_keys</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">));</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">count</span><span class="pun">(</span><span class="pln">$passed</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_requiredParams</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> \Exception</span><span class="pun">(</span><span class="str">'value must contain at least the following params: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln">implode</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_requiredParams</span><span class="pun">));</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">_conn</span><span class="pun">-&gt;</span><span class="pln">insert</span><span class="pun">(</span><span class="str">'User'</span><span class="pun">,</span><span class="pln"> $value</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> offsetUnset</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">is_string</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> \Exception</span><span class="pun">(</span><span class="str">'value must be the username to delete'</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">offsetGet</span><span class="pun">(</span><span class="pln">$offset</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> \Exception</span><span class="pun">(</span><span class="str">'user not found'</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">_conn</span><span class="pun">-&gt;</span><span class="kwd">delete</span><span class="pun">(</span><span class="str">'User'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">'username'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $offset</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="com">// ArrayAccess بدء التوابع المطلوبة من</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك يمكننا كتابة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_53" style="">
<span class="pln">$users </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">UserCollection</span><span class="pun">();</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]),</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]));</span><span class="pln">

$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'username'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'testuser'</span><span class="pun">,</span><span class="pln">
                                </span><span class="str">'password'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'testpassword'</span><span class="pun">,</span><span class="pln">
                                </span><span class="str">'email'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'test@test.com'</span><span class="pun">];</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]),</span><span class="pln"> isset</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]),</span><span class="pln"> $users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]);</span><span class="pln">

unset</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]),</span><span class="pln"> isset</span><span class="pun">(</span><span class="pln">$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]));</span></pre>

<p>
	بفرض أنه لا يوجد لدينا المستخدم <code>testuser</code> قبل تنفيذ الشيفرة فسيكون لدينا الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_55" style="">
<span class="kwd">bool</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">bool</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">bool</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">bool</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
array</span><span class="pun">(</span><span class="lit">17</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">[</span><span class="str">"username"</span><span class="pun">]=&gt;</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">8</span><span class="pun">)</span><span class="pln"> </span><span class="str">"testuser"</span><span class="pln">
    </span><span class="pun">[</span><span class="str">"password"</span><span class="pun">]=&gt;</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">12</span><span class="pun">)</span><span class="pln"> </span><span class="str">"testpassword"</span><span class="pln">
    </span><span class="pun">[</span><span class="str">"email"</span><span class="pun">]=&gt;</span><span class="pln"> </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">13</span><span class="pun">)</span><span class="pln"> </span><span class="str">"test@test.com"</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">bool</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">bool</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">)</span></pre>

<p>
	<strong>ملاحظة:</strong> لا تُستدعى الدالة <code>offsetExists</code> عندما تريد التحقق من وجود مفتاح مع دالة <code>array_key_exists</code>، لذا فإنّ الشيفرة التالية سيكون خرجها <code>false</code> مرتين:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_57" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">array_key_exists</span><span class="pun">(</span><span class="str">'testuser'</span><span class="pun">,</span><span class="pln"> $users</span><span class="pun">));</span><span class="pln">
$users</span><span class="pun">[</span><span class="str">'testuser'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'username'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'testuser'</span><span class="pun">,</span><span class="pln">
                                </span><span class="str">'password'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'testpassword'</span><span class="pun">,</span><span class="pln">
                                </span><span class="str">'email'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'test@test.com'</span><span class="pun">];</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">array_key_exists</span><span class="pun">(</span><span class="str">'testuser'</span><span class="pun">,</span><span class="pln"> $users</span><span class="pun">));</span></pre>

<h3>
	Iterator
</h3>

<p>
	سنوسع الصنف في الأعلى بإضافة عدة دوال من الواجهة <code>Iterator</code> لنستطيع استخدام التكرار مع <code>foreach</code> و<code>while</code>.
</p>

<p>
	نحتاج أولًا إلى خاصيّة تحتوي الفهرس الحالي للمكرِّر، سنسميها <code>‎$_position</code> ونضيفها إلى خاصيّات الصنف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_59" style="">
<span class="com">// Iterator موقع المكرِّر الحالي مطلوب من توابع الواجهة</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> $_position </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	ثم نضيف الواجهة <code>Iterator</code> إلى قائمة الواجهات التي سينفذها صنفنا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_61" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">UserCollection</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">ArrayAccess</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Iterator</span><span class="pln"> </span><span class="pun">{</span></pre>

<p>
	ثم نضيف المطلوب من دوال الواجهة <code>Iterator</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_63" style="">
<span class="com">// Iterator بدء التوابع المطلوبة من الواجهة</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> current </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getById</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> key </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="kwd">next</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> rewind </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">_position </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> valid </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getById</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// Iterator نهاية التوابع المطلوبة من الواجهة</span></pre>

<p>
	أصبح لدينا مصدر كامل لتنفيذ الصنف لكِلا الواجهتين، لاحظ أنّ هذا المثال ليس مثاليًا لأنّ المعرفات في قاعدة البيانات قد لا تكون تسلسلية لكن كتبناه لإعطائك فكرةً أساسيةً وهي أنّه بإمكانك مخاطبة تجميعات الكائنات بأي طريقة ممكنة عن طريق تنفيذ الواجهتين <code>ArrayAccess</code> و<code>Iterator</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_65" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">UserCollection</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">ArrayAccess</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Iterator</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="com">// Iterator موقع المكرِّر الحالي المطلوب من توابع الواجهة</span><span class="pln">
</span><span class="kwd">protected</span><span class="pln"> $_position </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="com">// &lt;إضافة التوابع القديمة من الشيفرة السابقة هنا&gt;</span><span class="pln">

</span><span class="com">// Iterator بدء التوابع المطلوبة من الواجهة</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> current </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getById</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> key </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="kwd">next</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> rewind </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">_position </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> valid </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">_getById</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">_position</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// Iterator نهاية التوابع المطلوبة من الواجهة</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولكتابة حلقة تمر على كل الكائنات من نوع <code>user</code> باستخدام <code>foreach</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_67" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$users </span><span class="kwd">as</span><span class="pln"> $user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$user</span><span class="pun">[</span><span class="str">'id'</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سينتج عن الشيفرة السابقة الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_69" style="">
<span class="kwd">string</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="str">"1"</span><span class="pln">
</span><span class="kwd">string</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="str">"2"</span><span class="pln">
</span><span class="kwd">string</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="str">"3"</span><span class="pln">
</span><span class="kwd">string</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="str">"4"</span><span class="pln">
</span><span class="pun">...</span></pre>

<h2>
	تكرار عدة مصفوفات معًا
</h2>

<p>
	قد نحتاج أحيانًا إلى تكرار مصفوفتين لهما نفس الطول معًا مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_71" style="">
<span class="pln">$people </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'Tim'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Tony'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Turanga'</span><span class="pun">];</span><span class="pln">
$foods </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'chicken'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'beef'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'slurm'</span><span class="pun">];</span></pre>

<p>
	أبسط طريقة لتنفيذ ذلك هي استخدام الدالة <code>array_map</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_73" style="">
<span class="pln">array_map</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$person</span><span class="pun">,</span><span class="pln"> $food</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"$person likes $food\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> $people</span><span class="pun">,</span><span class="pln"> $foods</span><span class="pun">);</span></pre>

<p>
	سينتج عن ذلك الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_75" style="">
<span class="kwd">assert</span><span class="pun">(</span><span class="pln">count</span><span class="pun">(</span><span class="pln">$people</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$foods</span><span class="pun">));</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$people</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$people[$i] likes $foods[$i]\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذا لم يكن للمصفوفتين مفاتيح تكرارية يمكننا استخدام <code>array_values($array)[$i]‎</code> بدلًا من <code>‎$array[$i]‎</code>، وإذا كان لهما نفس ترتيب المفاتيح يمكننا استخدام حلقة <code>foreach</code> مع مفتاح على إحداهما:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_77" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$people </span><span class="kwd">as</span><span class="pln"> $index </span><span class="pun">=&gt;</span><span class="pln"> $person</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $food </span><span class="pun">=</span><span class="pln"> $foods</span><span class="pun">[</span><span class="pln">$index</span><span class="pun">];</span><span class="pln">
    echo </span><span class="str">"$person likes $food\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن تكرار المصفوفات المستقلة فقط إذا كان لها نفس الطول ونفس اسم المفتاح، أي أنّه إذا لم يكن للمصفوفات مفاتيحًا فالمفاتيح مرقمة وهذا جيّد أو يمكنك تسمية المفاتيح ووضعهم في نفس الترتيب لكل مصفوفة، ويمكنك أيضًا استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_combine" rel="">array_combine</a>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_79" style="">
<span class="pln">$combinedArray </span><span class="pun">=</span><span class="pln"> array_combine</span><span class="pun">(</span><span class="pln">$people</span><span class="pun">,</span><span class="pln"> $foods</span><span class="pun">);</span><span class="pln">
</span><span class="com">// $combinedArray = ['Tim' =&gt; 'chicken', 'Tony' =&gt; 'beef', 'Turanga' =&gt; 'slurm'];</span></pre>

<p>
	بعدها يمكنك كتابة حلقة تكرار كما في السابق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_81" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$combinedArray </span><span class="kwd">as</span><span class="pln"> $person </span><span class="pun">=&gt;</span><span class="pln"> $meal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$person likes $meal\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	استخدام فهرس تزايدي
</h2>

<p>
	تعمل هذه الطريقة على زيادة عدد صحيح من 0 وحتى أكبر فهرس في المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_83" style="">
<span class="pln">$colors </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'green'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'I am the color '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $colors</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&lt;br&gt;'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك أيضًا المرور على جميع عناصر المصفوفة بترتيب عكسي دون استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_reverse" rel="">array_reverse</a> التي قد تزيد الحِمل إذا كانت المصفوفة كبيرة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_85" style="">
<span class="pln">$colors </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'yellow'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'green'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'I am the color '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $colors</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&lt;br&gt;'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك تخطي أو إرجاع الفهرس بسهولة مستخدمًا هذه الطريقة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_87" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"alpha"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"beta"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"gamma"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"delta"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"epsilon"</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $array</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">],</span><span class="pln"> PHP_EOL</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$array</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">"gamma"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $array</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"zeta"</span><span class="pun">;</span><span class="pln">
        $i </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$array</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">"zeta"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $i</span><span class="pun">++;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
alpha
beta
gamma
beta
zeta
epsilon
</pre>

<p>
	لا يمكن أن نقوم بهذا بشكلٍ مباشر في المصفوفات التي لا تحوي فهارس تزايدية (بما في ذلك المصفوفات التي تكون فهارسها بترتيب عكسي مثل: ‎[1 =&gt; "foo", 0 =&gt; "bar"], ["foo" =&gt; "f", "bar" =&gt; "b"]‎)، لذا نستخدم الدوال <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_values" rel="">array_values</a> أو <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_keys" rel="">array</a>_<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/array_keys" rel="">keys</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_89" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"a"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"alpha"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"b"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"beta"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"c"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"gamma"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"d"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"delta"</span><span class="pun">];</span><span class="pln">
$keys </span><span class="pun">=</span><span class="pln"> array_keys</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $key </span><span class="pun">=</span><span class="pln"> $keys</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">];</span><span class="pln">
    $value </span><span class="pun">=</span><span class="pln"> $array</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">];</span><span class="pln">
    echo </span><span class="str">"$value is $key\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	استخدام مؤشرات المصفوفة الداخلية
</h2>

<p>
	تحوي كل نسخة مصفوفة مؤشرًا داخليًا، يمكن باستخدام هذا المؤشر استعادة عناصر مختلفة من المصفوفة عن طريق نفس الاستدعاء في مرات مختلفة.
</p>

<h3>
	استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/each" rel="">each</a>
</h3>

<p>
	يُرجع كل استدعاء للدالة مفتاح وقيمة عنصر المصفوفة الحالي ويزيد مؤشر المصفوفة الداخلي.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_91" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"f"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"foo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"b"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">list</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> each</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$value begins with $key"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	استخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/next" rel="">next</a>
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_93" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Alpha"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Beta"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Gamma"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Delta"</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">$value </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">next</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">))</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ هذا المثال يفترض أنّه لا يوجد عناصر في المصفوفة معرّفة بالقيمة المنطقية <code>false</code>، لمنع هذا الافتراض نستخدم الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/key" rel="">key</a> للتحقق من وصول المؤشر الداخلي إلى نهاية المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_95" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"Alpha"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Beta"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Gamma"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Delta"</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">key</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo current</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_EOL</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">next</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ويسهّل هذا أيضًا تكرار المصفوفة دون حلقة مباشرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_97" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorPicker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $colors </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"#FF0064"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"#0064FF"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"#64FF00"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"#FF6400"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"#00FF64"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"#6400FF"</span><span class="pun">];</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> nextColor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $result </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">next</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">);</span><span class="pln">
        </span><span class="com">// إذا وصلت لنهاية المصفوفة</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">key</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            reset</span><span class="pun">(</span><span class="pln">$colors</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $result</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	استخدام foreach
</h2>

<h3>
	حلقة مباشرة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_99" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$colors </span><span class="kwd">as</span><span class="pln"> $color</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"I am the color $color&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	حلقة مع مفاتيح
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_101" style="">
<span class="pln">$foods </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'healthy'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Apples'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bad'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Ice Cream'</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$foods </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $food</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Eating $food is $key"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	حلقة بالمرجعية
</h3>

<p>
	إنّ تعديل قيمة (‎$color أو ‎$food) في الأمثلة السابقة بشكلٍ مباشر لا يغيّر قيمتها في المصفوفة إنّما يجب استخدام العامل <code>&amp;</code> لتصبح القيمة هي مؤشر مرجعي للعنصر في المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_103" style="">
<span class="pln">$years </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2001</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2002</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$years </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$year</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$year </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">)</span><span class="pln"> $year </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الشيفرة السابقة مماثلة للشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_105" style="">
<span class="pln">$years </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2001</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2002</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$years</span><span class="pun">);</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    $year </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$years</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">];</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$year </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">)</span><span class="pln"> $year </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	التزامن
</h3>

<p>
	يمكن تعديل مصفوفات PHP أثناء التكرار بدون مشاكل تزامن، إذا كانت المصفوفة تُكرَّر بالمرجع فإنّ التكرارات اللاحقة ستتأثر بتغييرات المصفوفة وإلا فإنّها لن تتأثر (كما لو أنّك تكرر نسخة من المصفوفة نفسها)، وازن التكرار بالقيمة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_107" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$array </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$key </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $array</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17</span><span class="pun">;</span><span class="pln">
        unset</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
echo </span><span class="str">"$key =&gt; $value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
0 =&gt; 1
2 =&gt; 3
4 =&gt; 5
6 =&gt; 7
</pre>

<p>
	أما إذا كانت المصفوفة تُكرَّر بالمرجع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_110" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$array </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$key </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $array</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">17</span><span class="pun">;</span><span class="pln">
        unset</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    echo </span><span class="str">"$key =&gt; $value\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
0 =&gt; 1
2 =&gt; 3
6 =&gt; 17
</pre>

<p>
	لن تُكرَّر مجموعة القيمة-المفتاح <code>4‎ =&gt; 5</code> وستتغير <code>6‎ =&gt; 7</code> إلى <code>‎6 =&gt; 17‎</code>.
</p>

<h2>
	استخدام المكرِّر <code>ArrayObject</code>
</h2>

<p>
	يسمح لك الصنف <code>arrayiterator</code> بتعديل وإلغاء ضبط القيم أثناء تكرار المصفوفات والكائنات. مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9226_112" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'1'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'apple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'2'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'banana'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'3'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'cherry'</span><span class="pun">];</span><span class="pln">

$arrayObject </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln">

$iterator </span><span class="pun">=</span><span class="pln"> $arrayObject</span><span class="pun">-&gt;</span><span class="pln">getIterator</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">$iterator</span><span class="pun">;</span><span class="pln"> $iterator</span><span class="pun">-&gt;</span><span class="pln">valid</span><span class="pun">();</span><span class="pln"> $iterator</span><span class="pun">-&gt;</span><span class="kwd">next</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $iterator</span><span class="pun">-&gt;</span><span class="pln">key</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">' =&gt; '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $iterator</span><span class="pun">-&gt;</span><span class="pln">current</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"&lt;/br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
1 =&gt; apple
2 =&gt; banana
3 =&gt; cherry
</pre>

<p>
	ترجمة -وبتصرف- للفصول [Arrays - Array iteration] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-php-r1046/" rel="">التنفيذ على المصفوفات والتعامل معها في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D8%AC%D8%B9-references-%D9%81%D9%8A-php-r1044/" rel="">المراجع (references) في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1045</guid><pubDate>Sun, 01 Nov 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x631;&#x627;&#x62C;&#x639; (references) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D8%AC%D8%B9-references-%D9%81%D9%8A-php-r1044/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/6.png.b5c4c976556d19aa98b52afc08ea93f4.png" /></p>
<h2>
	الإسناد بالمرجعية (reference)
</h2>

<p>
	هذه المرحلة الأولى للمراجع، عندما تُسند <a href="https://wiki.hsoub.com/PHP/references#.D8.A7.D9.84.D8.A5.D8.B3.D9.86.D8.A7.D8.AF_.D8.A8.D8.A7.D9.84.D9.85.D8.B1.D8.AC.D8.B9.D9.8A.D8.A9" rel="external">بالمرجعية</a> فإنّك تسمح بمشاركة متغيرين لنفس القيمة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_6" style=""><span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$bar</span><span class="pun">;</span></pre>

<p>
	<code>‎$foo</code> و<code>‎$bar</code> متساويان هنا ولا يشيران إلى بعضهما إنما يشيران إلى نفس المكان (القيمة).
</p>

<p>
	يمكنك أيضًا الإسناد بالمرجعية ضمن بنية اللغة <code>array‎()‎</code> بالرغم من أنه ليس إسناد بالمرجعية بشكلٍ دقيق.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_8" style=""><span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hi'</span><span class="pun">;</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(&amp;</span><span class="pln">$foo</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$bar</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span></pre>

<p>
	لاحظ أنّ المراجع داخل المصفوفة قد تكون خطرة، القيام بإسناد عادي (ليس بالمرجعية) مع مرجع على الجانب الأيمن لا يحوّل الجانب الأيسر إلى مرجع، لكن يُحتفظ بالمراجع داخل المصفوفات في هذه الإسنادات العادية، يُطبّق هذا أيضًا على استدعاءات الدالة عندما تُمرّر المصفوفة بالقيمة.
</p>

<p>
	لا يقتصر الإسناد بالمرجعية على المتغيرات والمصفوفات فقط إنما يمكن استخدامه للدوال وكل ارتباطات التمرير بالمرجعية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_10" style=""><span class="kwd">function</span><span class="pln"> incrementArray</span><span class="pun">(&amp;</span><span class="pln">$arr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$arr </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$val</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $val</span><span class="pun">++;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">getArray</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> $arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $arr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

incrementArray</span><span class="pun">(</span><span class="pln">getArray</span><span class="pun">());</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">getArray</span><span class="pun">());</span><span class="pln">
</span><span class="com">// array [2, 3, 4]</span></pre>

<p>
	في الشيفرة السابقة الإسناد هو مفتاح ضمن تعريف الدالة. لا يمكنك تمرير تعبير بالمرجع ويمكنك تمرير قيمة/متغير فقط.
</p>

<h2>
	الإعادة بالمرجعية
</h2>

<p>
	قد تحتاج أحيانًا الإعادة بالمرجعية بشكلٍ ضمني، وتعدّ الإعادة بالمرجعية ضروريةً عندما تريد استخدام دالة لإيجاد المتغير المرتبط بمرجع ما، ولا يستخدم لتحسين الأداء إنما يقوم المحرك بفعل هذا بمفرده، استخدم الإعادة بالمرجعية عندما يكون لديك سببًا تقنيًا واضحًا للقيام بذلك.
</p>

<p>
	يوجد عدة نماذج للإعادة بالمرجعية متضمنةً المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_12" style=""><span class="kwd">function</span><span class="pln"> parent</span><span class="pun">(&amp;</span><span class="pln">$var</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $var</span><span class="pun">;</span><span class="pln">
    $var </span><span class="pun">=</span><span class="pln"> </span><span class="str">"updated"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">child</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"test"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

parent</span><span class="pun">(</span><span class="pln">child</span><span class="pun">());</span><span class="pln"> </span><span class="com">// "test"</span><span class="pln">
parent</span><span class="pun">(</span><span class="pln">child</span><span class="pun">());</span><span class="pln"> </span><span class="com">// "updated"</span></pre>

<p>
	لا تقتصر الإعادة بالمرجعية على الدوال، يمكنك أيضًا القيام بالاستدعاء الضمني:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_14" style=""><span class="kwd">function</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">myFunction</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$bar </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">myFunction</span><span class="pun">();</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="str">"updated"</span><span class="pln">
echo myFunction</span><span class="pun">();</span></pre>

<p>
	لا يمكنك أن ترجع استدعاء دالة بشكلٍ مباشر إنما يجب إسنادها إلى متغير قبل استخدامها، يمكنك أن تجرّب ذلك بكتابة <code>echo &amp;myFunction()‎;‎</code>.
</p>

<p>
	<strong>ملاحظات:</strong>
</p>

<ul>
	<li>
		يجب تحديد مرجع <code>(&amp;)</code> في كِلا المكانين اللذين تريد استخدامه بهما، أي في تعريف الدالة:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_16" style=""><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">myFunction</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{...)‎</span></pre>

<p>
	وفي استدعاء المرجع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_18" style=""><span class="pun">‎(</span><span class="kwd">function</span><span class="pln"> callFunction</span><span class="pun">(&amp;</span><span class="pln">$variable</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{...</span><span class="pln"> </span><span class="kwd">or</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">myFunction</span><span class="pun">();)</span></pre>

<ul>
	<li>
		يمكنك أن ترجع متغير فقط بالمرجع لذا اُستنسخ المتغير <code>‎$a</code> في المثال السابق، أي أنّه لا يمكنك أن ترجع تعبيرًا وإلا سيُنشأ خطأ <code>E_NOTICE</code>:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_23" style=""><span class="pln"> </span><span class="pun">‏(</span><span class="typ">Notice</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Only</span><span class="pln"> variable references should be returned </span><span class="kwd">by</span><span class="pln"> reference </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">......)‎‏‏</span></pre>

<ul>
	<li>
		الإعادة بالمرجعية له حالات استخدام رسمية لكن يجب التحذير من أنّه يجب استخدامه بعد استكشاف جميع الخيارات المحتملة الأخرى لتحقيق نفس الهدف.
	</li>
</ul>

<h2>
	التمرير بالمرجعية
</h2>

<p>
	يسمح لك التمرير بالمرجعية أن تمرر متغيرًا بالمرجع إلى دالة أو عنصر وهذا يساعدك على تعديل المتغير الأصلي.
</p>

<p>
	لا يقتصر التمرير بالمرجعية على المتغيرات فقط، يمكن تمرير ما يلي بالمرجع:
</p>

<ul>
	<li>
		تعليمات <code>new</code> مثل <code>foo(new SomeClass)‎</code>.
	</li>
	<li>
		المراجع المُعادة من الدوال
	</li>
</ul>

<h3>
	المصفوفات
</h3>

<p>
	الاستخدام الشائع <a href="https://wiki.hsoub.com/PHP/references#.D8.A7.D9.84.D8.AA.D9.85.D8.B1.D9.8A.D8.B1_.D8.A8.D8.A7.D9.84.D9.85.D8.B1.D8.AC.D8.B9.D9.8A.D8.A9" rel="external">للتمرير بالمرجعية</a> هو أن تعدّل القيم الابتدائية ضمن مصفوفة دون أن تضطر لإنشاء مصفوفات جديدة أو تملأ فضاء الاسم الخاص بك، يمكنك أن تمرر بالمرجع بأن تضيف <code>&amp;</code> قبل المتغير.
</p>

<p>
	إليك مثال لاستخدام عنصر من مصفوفة وإضافة 1 إلى قيمته الابتدائية ببساطة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_25" style=""><span class="pln">$arr </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$arr </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $num</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّه عندما تستخدم أي عنصر من <code>‎$arr</code> فإنّ العنصر الأصلي سيتغير مع زيادة المرجع يمكنك أن تتأكد بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_27" style=""><span class="pln">print_r</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">);</span><span class="pln">
</span><span class="com">// Array ( [0] =&gt; 2 [1] =&gt; 3 [2] =&gt; 4 [3] =&gt; 5 [4] =&gt; 6 )</span></pre>

<p>
	<strong>ملاحظة:</strong> يجب أن تلاحظ عند استخدام التمرير بالمرجع ضمن الحلقات، في الشيفرة السابقة في نهاية الحلقة سيحمل المتغير <code>‎$num</code> مرجعًا إلى عنصر المصفوفة الأخير، يمكن إسنادها بعد انتهاء الحلقة لمعالجة عنصر المصفوفة الأخير، يمكنك التأكد من أن هذا لن يحصل باستخدام <code>unset‎()‎</code> بعد الحلقة مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_29" style=""><span class="pln">$myArray </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$myArray </span><span class="kwd">as</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $num</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
unset</span><span class="pun">(</span><span class="pln">$num</span><span class="pun">);</span></pre>

<p>
	سيضمن لك هذا عدم حدوث أيّة مشاكل، يمكنك الاطلاع على مشكلة متعلقة بهذا الموضوع من <a href="https://stackoverflow.com/questions/24902742/foreach-loop-and-reference-of-value" rel="external nofollow">هنا</a>.
</p>

<h3>
	الدوال
</h3>

<p>
	الاستخدام الشائع الآخر للتمرير بالمرجعية هو في الدوال إذ يصبح تعديل القيمة الأساسية بسيطًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_31" style=""><span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تعريف الدالة</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(&amp;</span><span class="pln">$var</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$var</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// استدعاء الدالة</span><span class="pln">
add</span><span class="pun">(</span><span class="pln">$var</span><span class="pun">);</span></pre>

<p>
	يمكنك التحقق بطباعة القيمة الأساسية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_391_33" style=""><span class="pln">echo $var</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 6</span></pre>

<p>
	هناك قيود مختلفة حول الدوال وهي حسب توثيق PHP الرسمي:
</p>

<ul>
	<li>
		لا توجد إشارة مرجعية عند استدعاء الدالة، فقط عند تعريف الدالة، إذ أنّ تعريفات الدالة وحدها كافية لتمرير الوسيط بالمرجع. ستحصل على التحذير <code>"call-time pass-by-reference" is deprecated</code> عند استخدام <code>&amp;</code> في <code>foo(&amp;$a);‎</code> بدءًا من PHP 5.3.0 والتحذير <code>call-time pass-by-reference was removed</code> بدءًا من PHP 5.4.0 لذا فإنّ استخدام هذه الإشارة سيرمي خطأً فادحًا (fatal error).
	</li>
</ul>

<p>
	ترجمة -وبتصرف- للفصل [References] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-php-r1045/" rel="">المصفوفات (Arrays) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%B9%D9%88%D8%A7%D9%85%D9%84-operators-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%88%D8%AF%D8%A9-%D9%81%D9%8A-php-r1043/" rel="">أهم العوامل (operators) الموجودة في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1044</guid><pubDate>Fri, 30 Oct 2020 13:06:00 +0000</pubDate></item><item><title>&#x623;&#x647;&#x645; &#x627;&#x644;&#x639;&#x648;&#x627;&#x645;&#x644; (operators) &#x627;&#x644;&#x645;&#x648;&#x62C;&#x648;&#x62F;&#x629; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%B9%D9%88%D8%A7%D9%85%D9%84-operators-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%88%D8%AF%D8%A9-%D9%81%D9%8A-php-r1043/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/5.png.634714561a6095ef2f84fa0ad3c7aacd.png" /></p>

<p>
	العامل هو عنصر يأخذ قيمة واحدة أو أكثر (أو تعابير في المصطلحات البرمجية) ويُنتج قيمة جديدة (لذا تصبح البنية بحد ذاتها تعبيرًا)، ويمكن تجميع العوامل وفقًا لعدد القيم التي تأخذها.
</p>

<h2>
	عامل تجميع Null (‏Null coalescing) (??)
</h2>

<p>
	عُرِّف هذا العامل الجديد في الإصدار PHP 7، يُرجع هذا العامل معامَله (operand) الأول إذا كان ذو قيمة ليست null وإلا فإنّه يرجع معامَله الثاني. إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_7" style="">
<span class="pln">$name </span><span class="pun">=</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> </span><span class="str">'nobody'</span><span class="pun">;</span></pre>

<p>
	وهذه الشيفرة مكافئة لكل من:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_9" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $name </span><span class="pun">=</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'nobody'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	والشيفرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_13" style="">
<span class="pln">$name </span><span class="pun">=</span><span class="pln"> isset</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'nobody'</span><span class="pun">;</span></pre>

<p>
	يمكن أيضًا أن تسلسل هذا العامل (مع دلالات ارتباط صحيحة):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_11" style="">
<span class="pln">$name </span><span class="pun">=</span><span class="pln"> $_GET</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> </span><span class="str">'nobody'</span><span class="pun">;</span></pre>

<p>
	وهذه الشيفرة مكافئة للشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_15" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_GET</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $name </span><span class="pun">=</span><span class="pln"> $_GET</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $name </span><span class="pun">=</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'nobody'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ملاحظة: عند استخدام عامل التجميع لضمّ السلاسل النصية يجب استخدام الأقواس <code>()</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_17" style="">
<span class="pln">$firstName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">;</span><span class="pln">
$lastName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Doe"</span><span class="pun">;</span><span class="pln">
echo $firstName </span><span class="pun">??</span><span class="pln"> </span><span class="str">"Unknown"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">" "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $lastName </span><span class="pun">??</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span></pre>

<p>
	خرج الشيفرة السابقة هو <code>John</code>، لو كانت قيمة المتغير <code>‎$firstName‎</code> هي null وقيمة المتغير <code>‎$lastName</code> هي <code>Doe</code> عندها سيكون الخرج <code>Unknown Doe</code>، ليكون لدينا الخرج <code>John Doe</code> يجب استخدام الأقواس كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_19" style="">
<span class="pln">$firstName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">;</span><span class="pln">
$lastName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Doe"</span><span class="pun">;</span><span class="pln">
echo </span><span class="pun">(</span><span class="pln">$firstName </span><span class="pun">??</span><span class="pln"> </span><span class="str">"Unknown"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">" "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$lastName </span><span class="pun">??</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span></pre>

<h2>
	عامل السفينة الفضائية (&lt;=&gt;)
</h2>

<p>
	عرّفت PHP نوعًا جديدًا من العوامل وهو عامل السفينة الفضائية (Spaceship) يمكن استخدامه للموازنة بين التعابير، يُرجع هذا العامل 1-، 0 أو 1 إذا كان التعبير الأول أقل من، يساوي أو أكبر من التعبير الثاني.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_21" style="">
<span class="com">// الأعداد الصحيحة</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// -1</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

</span><span class="com">// الأعداد العشرية</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1.5</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1.5</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">2.5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// -1</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.5</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

</span><span class="com">// السلاسل النصية</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">"a"</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">"a"</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// -1</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">"b"</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span></pre>

<p>
	لا يمكن الموازنة بين الكائنات وسيؤدي ذلك إلى سلوك غير معرّف.
</p>

<p>
	يعدّ هذا العامل مفيدًا بشكلٍ خاص عند تعريف المستخدم لدالة موازنة باستخدام <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/usort" rel="">usort</a> أو <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/uasort" rel="">uasort</a> أو <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/uksort" rel="">uksort</a>. يمكن لدالة مجهولة استخدام <code>&lt;=&gt;</code> إذا كان الهدف منها ترتيب مصفوفة من الكائنات وفقًا لخاصيّة الوزن بالنظر إلى مصفوفة كائنات يجب ترتيبها وفقًا لخاصية الوزن، يمكن لدالة مجهولة مثلًا استخدام <code>&lt;=&gt;</code> لتُرجع القيمة المتوقعة من دوال الترتيب.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_23" style="">
<span class="pln">usort</span><span class="pun">(</span><span class="pln">$list</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">-&gt;</span><span class="pln">weight </span><span class="pun">&lt;=&gt;</span><span class="pln"> $b</span><span class="pun">-&gt;</span><span class="pln">weight</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">});</span></pre>

<p>
	يتطلب هذا تعبير أكثر تفصيلًا في PHP 5.
</p>

<pre class="ipsCode">
usort($list, function($a, $b) {
    return $a-&gt;weight &lt; $b-&gt;weight ? -1 : ($a-&gt;weight == $b-&gt;weight ? 0 : 1);
});
</pre>

<h2>
	عامل التنفيذ (``)
</h2>

<p>
	يتألف عامل التنفيذ في PHP من علامتي اقتباس مائلتين (``) ويستخدم لتنفيذ أوامر الصدفة، ويرجع خرج الأمر وبالتالي يمكن تخزينه في متغير.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_25" style="">
<span class="com">// أمر الحصول على قائمة بأسماء الملفات</span><span class="pln">
$output </span><span class="pun">=</span><span class="pln"> </span><span class="str">`ls`</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">"&lt;pre&gt;$output&lt;/pre&gt;"</span><span class="pun">;</span></pre>

<p>
	لاحظ أنّ معامل التنفيذ والدالة <a href="%E2%80%8Fhttps://www.php.net/manual/en/function.shell-exec.php" rel="">shell_exec()‎</a> يعطيان نفس النتيجة.
</p>

<h2>
	عوامل الزيادة (++) والنقصان (--)
</h2>

<p>
	يمكن زيادة المتغيرات أو نقصانها بمقدار 1 باستخدام ++، -- على التوالي، ويمكن أن يأتي كل منهما قبل المتغير أو بعده ولكل حالة دلالتها كما سنوضح في الأمثلة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_27" style="">
<span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
echo $i</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

</span><span class="com">// $i بمقدار 1 ثم يرجع $i عامل الزيادة السابقة يزيد المتغير</span><span class="pln">
echo </span><span class="pun">++</span><span class="pln">$i</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 2</span><span class="pln">

</span><span class="com">// $i بمقدار 1 ثم يرجع $i عامل النقصان السابق ينقص المتغير</span><span class="pln">
echo </span><span class="pun">--</span><span class="pln">$i</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

</span><span class="com">//ثم يزيده بمقدار 1 $i عامل الزيادة اللاحقة يرجع المتغير</span><span class="pln">
echo $i</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// 1 (2 الآن هي $i لكن قيمة المتغير)</span><span class="pln">

</span><span class="com">//ثم ينقصه بمقدار 1 $i عامل النقصان اللاحق يرجع المتغير</span><span class="pln">
echo $i</span><span class="pun">--;</span><span class="pln"> </span><span class="com">// 2 (1 الآن هي $i لكن قيمة المتغير)</span></pre>

<p>
	يمكنك الاطلاع على المزيد حول عوامل الزيادة والنقصان من <a href="https://wiki.hsoub.com/PHP/increment_operators" rel="external">هنا</a>.
</p>

<h2>
	العامل الثلاثي (?:)
</h2>

<p>
	يمكن أن تعدّ العامل الثلاثي تعليمة <code>if</code> سطرية، يتألف من 3 أجزاء: العامل وخرجين وله الصياغة العامة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_29" style="">
<span class="pln">$value </span><span class="pun">=</span><span class="pln"> </span><span class="str">&lt;operator&gt;</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="pun">&lt;</span><span class="kwd">true</span><span class="pln"> value</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">&lt;</span><span class="kwd">false</span><span class="pln"> value</span><span class="pun">&gt;</span></pre>

<p>
	إذا قُيِّم العامل على أنّه <code>true</code> ستُرجَع القيمة الموجودة في الكتلة الأولى <code>(&lt;true value&gt;)</code> وإلا ستُرجَع القيمة الموجودة في الكتلة الثانية <code>(&lt;false value&gt;)</code>، وبما أنّه أسندنا نتيجة العامل الثلاثي للمتغير <code>‎$value</code> فستُخزّن القيمة المُرجعة فيه.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_31" style="">
<span class="pln">$action </span><span class="pun">=</span><span class="pln"> empty</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="str">'action'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">'default'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="str">'action'</span><span class="pun">];</span></pre>

<p>
	سيحتوي المتغير <code>‎$action</code> السلسلة 'default' إذا كانت نتيجة التعبير <code>empty($_POST['action'])‎</code> هي <code>true</code> وإلا سيحتوي على قيمة ‎<code>$_POST['action']‎</code>.
</p>

<p>
	يُقيَّم التعبير <code>(expr1) ? (expr2) : (expr3)</code> إلى <code>expr2</code> إذا قُيِّم <code>expr1</code> على أنّه <code>true</code> وإلى <code>expr3</code> إذا قُيِّم <code>expr1</code> على أنّه <code>false</code>.
</p>

<p>
	من الممكن أن تحذف الجزء الأوسط من العامل الثلاثي، يرجع التعبير <code>expr1 ?: expr3</code> قيمة <code>expr1</code> إذا كانت نتيجته هي <code>true</code> وإلا تُرجع قيمة <code>expr3</code>. يُشار عادةً للعامل <code>‎?:‎‎</code> على أنّه عامل إلفيس (Elvis operator).
</p>

<p>
	يتصرف هذا العامل مثل عامل تجميع null <code>??</code> باستثناء أنّ الأخير يتطلّب أن يكون المعامَل اليساري <code>null</code> بينما العامل <code>‎?:‎‎</code> يحاول أن يحلل المعامَل اليساري إلى قيمة منطقية والتحقق فيما إذا كانت قيمته <code>false</code> أو لا.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_33" style="">
<span class="kwd">function</span><span class="pln"> setWidth</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $width </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">){</span><span class="pln">
    $_SESSION</span><span class="pun">[</span><span class="str">"width"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $width </span><span class="pun">?:</span><span class="pln"> getDefaultWidth</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في هذا المثال تقبل الدالة <code>setWidth</code> المعامل <code>width</code> أو ستكون قيمته الافتراضية 0 لتغيير قيمة <code>width</code> في الجلسة. إذا كانت قيمة <code>‎$width</code> هي 0 (أي لم تُعطى قيمة للمتغير <code>‎$width</code>) فستكون قيمته المنطقية <code>false</code> وستُستخدم قيمة <code>getDefaultWidth()‎</code> بدلًا منه، بينما لو كانت قيمة المتغير <code>‎$width</code> المنطقية هي <code>true</code> لن نحتاج لاستدعاء الدالة <code>getDefaultWidth()‎</code>.
</p>

<h2>
	العوامل المنطقية (&amp;&amp;/AND و ||/OR)
</h2>

<p>
	يوجد في PHP صيغتان مختلفتان للعوامل المنطقية <code>AND</code> و<code>OR</code>.
</p>

<table><tbody>
<tr>
<td>
				المعامل
			</td>
			<td>
				إذا كان true تكون النتيجة
			</td>
		</tr>
<tr>
<td>
				$a and $b
			</td>
			<td>
				قيمة كل من $a و $b هي true
			</td>
		</tr>
<tr>
<td>
				$a &amp;&amp; $b
			</td>
			<td>
				قيمة كل من $a و $b هي true
			</td>
		</tr>
<tr>
<td>
				$a or $b
			</td>
			<td>
				قيمة كل من $a أو $b هي true
			</td>
		</tr>
<tr>
<td>
				$a || $b
			</td>
			<td>
				قيمة كل من $a أو $b هي true
			</td>
		</tr>
</tbody></table>
<p>
	لاحظ أن العوامل <code>&amp;&amp;</code> و<code>||</code> لها <a href="https://wiki.hsoub.com/PHP/Operators#.D8.A3.D9.88.D9.84.D9.88.D9.8A.D8.A9_.D8.A7.D9.84.D8.B9.D9.88.D8.A7.D9.85.D9.84_.28Operator_Precedence.29" rel="external">أولوية</a> أعلى من <code>and</code> و<code>or</code>. لاحظ الجدول التالي:
</p>

<table><tbody>
<tr>
<td>
				التقييم
			</td>
			<td>
				نتيجة $e
			</td>
			<td>
				طريقة التقييم
			</td>
		</tr>
<tr>
<td>
				$e = false || true
			</td>
			<td>
				True
			</td>
			<td>
				$e = (false || true)‎
			</td>
		</tr>
<tr>
<td>
				$e = false or true
			</td>
			<td>
				False
			</td>
			<td>
				‎($e = false) or true
			</td>
		</tr>
</tbody></table>
<p>
	لذا من الأفضل استخدام <code>&amp;&amp;</code> و<code>||</code> بدلًا من <code>and</code> و<code>or</code>.
</p>

<h2>
	عوامل السلاسل النصية (String Operators)
</h2>

<p>
	هناك عاملان للسلاسل النصية:
</p>

<ul>
<li>
		عامل الربط (concatenation) <code>(.)</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_35" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">;</span><span class="pln">
$c </span><span class="pun">=</span><span class="pln"> $a </span><span class="pun">.</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $c =&gt; "ab"</span></pre>

<ul>
<li>
		عامل الربط الإسنادي <code>(=.)</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_37" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $a =&gt; "ab"</span></pre>

<h2>
	عوامل الكائن والصنف
</h2>

<p>
	يمكن الوصول لعناصر الكائنات أو الأصناف باستخدام عامل الكائن <code>‎(-&gt;)‎</code> وعامل الصنف <code>(::)</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_39" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> C </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> d</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> e</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">-&gt;</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(1)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">::</span><span class="pln">$b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(2)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">::</span><span class="pln">C</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(3)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pun">::</span><span class="pln">$b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(2)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pun">::</span><span class="pln">C</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(3)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">-&gt;</span><span class="pln">d</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(4)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">::</span><span class="pln">d</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(4)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pun">::</span><span class="pln">e</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(5)</span><span class="pln">

$classname </span><span class="pun">=</span><span class="pln"> </span><span class="str">"MyClass"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$classname</span><span class="pun">::</span><span class="pln">e</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(5)</span></pre>

<p>
	لاحظ أنّه ليس ضروريًا كتابة <code>$</code> بعد عامل الكائن (<code>‎$object-&gt;a</code> بدلًا من <code>‎$object-&gt;$a‎</code>)، وذلك لا ينطبق على عامل الصف أي أنّه من الضروري كتابة <code>$</code>. أما بالنسبة للثابت المعرّف في الصف لا نستخدم <code>$</code> أبدًا.
</p>

<p>
	من الممكن أن نكتب التعليمة <code>var_dump(MyClass::d());‎</code> إذا كانت الدالة <code>function d()‎</code> لا تشير إلى الكائن:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_41" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> d</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">a</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pun">::</span><span class="pln">d</span><span class="pun">());</span><span class="pln"> </span><span class="com">// Error!</span></pre>

<p>
	يسبب هذا ظهور الخطأ:
</p>

<pre class="ipsCode" id="ips_uid_5266_6">
PHP Fatal error: Uncaught Error: Using $this when not in object context</pre>

<p>
	لهذه العوامل ارتباط يساري يمكن استخدامه للتسلسل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_43" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">a </span><span class="pun">+=</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">a</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$object</span><span class="pun">-&gt;</span><span class="pln">add</span><span class="pun">(</span><span class="lit">4</span><span class="pun">)-&gt;</span><span class="kwd">get</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(5)</span></pre>

<p>
	ولها أيضًا الأولوية الأعلى، حتى أعلى من النسخ (clone):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_45" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">a </span><span class="pun">+=</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">a</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$o1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$o2 </span><span class="pun">=</span><span class="pln"> clone $o1</span><span class="pun">-&gt;</span><span class="pln">add</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$o1</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(2)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$o2</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(2)</span></pre>

<p>
	تُضاف قيمة <code>‎$o1</code> قبل أن يُنسَخ الكائن.
</p>

<p>
	لاحظ أنّ استخدام الأقواس للتأثير على الأولوية لا يعمل في PHP الإصدار 5 والأقدم منه (لكنه يؤثر في PHP 7):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_47" style="">
<span class="com">// من الشيفرة السابقة MyClass استخدام الصف</span><span class="pln">
$o1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$o2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">clone $o1</span><span class="pun">)-&gt;</span><span class="pln">add</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// PHP 7 لكنه يعمل بشكل صحيح في PHP 5 السطر السابق يؤدي إلى خطأ في</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">$o1</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(0) in PHP 7</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$o2</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">());</span><span class="pln"> </span><span class="com">// int(2) in PHP 7</span></pre>

<h2>
	عوامل الإسناد المجمّعة (=+ وغيرها)
</h2>

<p>
	عوامل الإسناد المجمّعة هي اختصار لعملية على متغيرٍ ما ثم إسناد قيمة جديدة لهذا المتغير.
</p>

<p>
	العمليات الحسابية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_49" style="">
<span class="com">// إسناد بسيط</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="com">// (1 + 2) =&gt; 3 أي النتيجة '$a = $a + 2'; يُقرأ السطر التالي كأنّه</span><span class="pln">
$a </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// (3 - 1) =&gt; 2 في السطر التالي $a قيمة</span><span class="pln">
$a </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="com">// (2 * 2) =&gt; 4 في السطر التالي $a قيمة</span><span class="pln">
$a </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// (16 / 2) =&gt; 8 في السطر التالي $a قيمة</span><span class="pln">
$a </span><span class="pun">/=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// (باقي القسمة‎) (8 % 5) =&gt; 3 في السطر التالي $a قيمة </span><span class="pln">
$a </span><span class="pun">%=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">

</span><span class="com">// المعامل + في المصفوفات</span><span class="pln">
$arrOne </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
$arrTwo </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
$arrOne </span><span class="pun">+=</span><span class="pln"> $arrTwo</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$arrOne</span><span class="pun">);</span><span class="pln">
</span><span class="com">// array(1) { [0]=&gt; int(1) }</span></pre>

<p>
	ملاحظة: عند استخدام العامل + في المصفوفات فإنّه يُرجع المصفوفة في الطرف اليميني مضافة إلى نهاية المصفوفة في الطرف اليساري، في حال كانت المفتاح نفسه موجودًا في المصفوفتين فإنّه يستخدم القيمة الموجودة في المصفوفة اليسارية ويتجاهل قيمة هذا المفتاح في المصفوفة اليمينية.
</p>

<p>
	معالجة عدة مصفوفات معًا
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_51" style="">
<span class="pln">$a </span><span class="pun">**=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (2مرفوعة للقوة ‏‎ 4) (4 ** 2) =&gt; 16 هي $a تصبح قيمة </span></pre>

<p>
	الربط والإسناد المجمّع لسلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_53" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"a"</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $a =&gt; "ab"</span></pre>

<p>
	عوامل الإسناد المجمّعة لعمليات الأعداد الثنائية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_55" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0b00101010</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 42 الآن هي $a قيمة</span><span class="pln">

$a </span><span class="pun">&amp;=</span><span class="pln"> </span><span class="lit">0b00001111</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (and عملية الأعداد الثنائية) ‎(00101010 &amp; 00001111) =&gt; 00001010 الآن هي $a قيمة</span><span class="pln">

$a </span><span class="pun">|=</span><span class="pln"> </span><span class="lit">0b00100010</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (or عملية الأعداد الثنائية) ‎(00001010 | 00100010) =&gt; 00101010 الآن هي $a قيمة</span><span class="pln">

$a </span><span class="pun">^=</span><span class="pln"> </span><span class="lit">0b10000010</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (xor عملية الأعداد الثنائية) ‎(00101010 ^ 10000010) =&gt; 10101000 الآن هي $a قيمة</span><span class="pln">

$a </span><span class="pun">&gt;&gt;=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (3 انزياح يميني بمقدار) ‎(10101000 &gt;&gt; 3) =&gt; 00010101 الآن هي $a قيمة</span><span class="pln">

$a </span><span class="pun">&lt;&lt;=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (1 انزياح يساري بمقدار) ‎(00010101 &lt;&lt; 1) =&gt; 00101010 الآن هي $a قيمة</span></pre>

<h2>
	تغيير أولوية عامل (مع الأقواس)
</h2>

<p>
	يُحدّد عامل الأولوية (operator precedence) الترتيب الذي تُقيَّم فيه العوامل، ففي المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_57" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span></pre>

<p>
	يأخد المتغير <code>‎$a</code> القيمة 10، في البداية يُقيّم <code>2‎ * 3</code> (الضرب له أولوية أعلى من الجمع) ومحصلة النتيجة الفرعية 6 مضافًا إليها 4 تساوي 10.
</p>

<p>
	يمكن أن تتغير الأولوية باستخدام الأقواس:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_60" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span></pre>

<p>
	في الشيفرة السابقة قيمة المتغير <code>‎$a</code> تصبح 14 لأنّ <code>‎(3 + 4)‎</code> يُقيّم أولًا.
</p>

<h2>
	الإسناد البسيط (=)
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_62" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"some string"</span><span class="pun">;</span></pre>

<p>
	للمتغير <code>‎$a</code> الآن القيمة <code>some string</code>.
</p>

<p>
	نتيجة تعبير الإسناد هي أنّ القيمة تُصبح مُسنَدة، لاحظ أننا استخدمنا الإشارة <code>=</code> للإسناد وليس للمساواة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_64" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span></pre>

<p>
	تقوم الشيفرة السابقة بالتالي:
</p>

<ul>
<li>
		يُسند السطر 1 القيمة 3 للمتغير <code>‎$a</code>.
	</li>
	<li>
		يُسند السطر 2 القيمة 5 للمتغير <code>‎$a</code>. ينتج عن هذا التعبير القيمة 5 أيضًا.
	</li>
	<li>
		ثم يُسند السطر 2 نتيجة التعبير بين القوسين <code>(5)</code> للمتغير <code>‎$b</code>. لذا لدينا الآن قيمة كل من <code>‎$a</code> و<code>‎$b</code> هي 5.
	</li>
</ul>
<h2>
	الارتباط (Association)
</h2>

<h3>
	الارتباط اليساري
</h3>

<p>
	إذا تساوت أولوية عاملين فإنّ الترابط يحدد التجميع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_66" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (5 * 3) % 2 =&gt; (15 % 2) =&gt; 1 الآن هي $a قيمة</span></pre>

<p>
	إنّ <code>*</code> و<code>%</code> لهما الأولوية نفسها وترابط يساري، يُجمَّع الضرب لأنه يحدث أولًا (يسارًا).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_68" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="com">// (5 % 3) * 2 =&gt; (2 * 2) =&gt; 4 الآن هي $a قيمة</span></pre>

<p>
	لاحظ أنّ عامل باقي القسمة يحدث أولًا (يسارًا) ولذا يُجمّع.
</p>

<h3>
	الارتباط اليميني
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_70" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $b </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	لكل من المتغيرين <code>‎$a</code> و<code>‎$b</code> القيمة 2 لأنّ <code>‎$b += 1</code> جُمّعت ثم أُسندت النتيجة (‎$b = 2) للمتغير <code>‎$a</code>.
</p>

<h2>
	عوامل الموازنة
</h2>

<h3>
	المساواة
</h3>

<p>
	نستخدم عامل المساواة <code>==</code> لاختبار المساواة الأساسي، ونستخدم عامل التطابق <code>===</code> لاختبار أكثر شمولية، إذ يعمل عامل التطابق نفس عمل عامل المساواة أي يجب أن يكون للطرفين نفس القيمة ولكن يتطلب أيضًا أن يكون لهما نفس نوع البيانات.
</p>

<p>
	لدينا في المثال التالي المتغيرين <code>‎$a</code> و<code>‎$b</code> متساويين ولكنهما غير متطابقين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_72" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">'4'</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// هذه العبارة ستُطبع</span><span class="pln">
    echo </span><span class="str">'a and b are equal'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">===</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// هذه العبارة لن تُطبع</span><span class="pln">
    echo </span><span class="str">'a and b are identical'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُحوَّل السلاسل النصية العددية إلى أعداد صحيحة عند استخدام عامل المساواة.
</p>

<h3>
	موازنة الكائنات
</h3>

<p>
	يوازن <code>===</code> بين كائنين بالتأكد من إذا كان الطرفان نفس النسخة تمامًا من صنف ما، هذا يعني أنّ نتيجة <code>new stdClass() === ‎new stdClass()‎</code> هي <code>false</code> حتى لو أنشئوا بنفس الطريقة وكان لهما نفس القيم.
</p>

<p>
	يوازن <code>===</code> بين كائنين بشكلٍ متكرر متحققًا من كونهم متساويين (تساويًا عميقًا) (deep equals)، وهذا يعني أنّه <code>‎$a == ‎$b</code> إذا كان <code>‎$a</code> و<code>‎$b</code>:
</p>

<ul>
<li>
		من نفس الصنف.
	</li>
	<li>
		لهم نفس مجموعة الخاصيّات بما في ذلك الخاصيّات الديناميكية.
	</li>
	<li>
		من أجل كل <code>‎$property</code> فإنّ نتيجة كل <code>‎$a-&gt;property == ‎$b-&gt;property‎‎‎</code> هي <code>true</code> (لذا التحقق يتكرر).
	</li>
</ul>
<h3>
	العوامل الأخرى الشائعة الاستعمال
</h3>

<p>
	تتضمن:
</p>

<ul>
<li>
		أكبر من <code>‎(&gt;)‎</code>.
	</li>
	<li>
		أصغر من <code>‎(&lt;)‎</code>.
	</li>
	<li>
		أكبر من أو يساوي <code>‎(&gt;=)‎</code>.
	</li>
	<li>
		أصغر من أو يساوي <code>‎(&lt;=)‎</code>.
	</li>
	<li>
		لا يساوي <code>‎(!=)‎</code>.
	</li>
	<li>
		لا يطابق <code>‎‎(!==)‎</code>.
	</li>
</ul>
<p>
	<strong>أكبر من</strong>:
</p>

<p>
	<code>‎$a &gt; $b‎</code>: تُرجع <code>true</code> إذا كانت قيمة <code>‎$a</code> أكبر من قيمة <code>‎$b</code>، وإلا ترجع <code>false</code>.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_74" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="lit">5</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(false)</span></pre>

<p>
	<strong>أصغر من</strong>:
</p>

<p>
	<code>‎$a &lt; $b</code>: تُرجع <code>true</code> إذا كانت قيمة <code>‎$a</code> أصغر من قيمة <code>‎$b</code>، وإلا ترجع <code>false</code>.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_76" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="lit">5</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(false)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span></pre>

<p>
	<strong>أكبر من أو يساوي</strong>:
</p>

<p>
	<code>‎$a &gt;= $b</code>: تُرجع <code>true</code> إذا كانت قيمة <code>‎$a</code> أكبر من قيمة <code>‎$b</code> أو تساويها، وإلا ترجع <code>false</code>.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_78" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">6</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(false)</span></pre>

<p>
	<strong>أصغر من أو يساوي</strong>:
</p>

<p>
	<code>‎$a &lt;= $b</code>: تُرجع <code>true</code> إذا كانت قيمة <code>‎$a</code> أصغر من قيمة <code>‎$b</code> أو تساويها، وإلا ترجع <code>false</code>.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_80" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="lit">5</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">5</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(true)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="lit">9</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="com">// bool(false)</span></pre>

<p>
	<strong>لا يساوي/يطابق</strong>:
</p>

<p>
	نعيد صياغة المثال السابق حول المساواة لكن في هذا المثال سيكون لدينا <code>‎$a</code> و<code>‎$b</code> غير متطابقين:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_82" style="">
<span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">'4'</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">!=</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// هذه العبارة لن تُطبع</span><span class="pln">
    echo </span><span class="str">'a and b are not equal'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="pun">!==</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// هذه العبارة ستُطبع</span><span class="pln">
    echo </span><span class="str">'a and b are not identical'</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<h2>
	عوامل الأعداد الثنائية (Bitwise Operators)
</h2>

<h3>
	عوامل الأعداد الثنائية البادئة‎
</h3>

<p>
	تشبه العوامل الثنائية العوامل المنطقية لكنها تُنفَّذ لكل بت بدلًا من كل قيمة منطقية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_84" style="">
<span class="com">// يعكس قيمة البتات NOT ~ العامل</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%'06b"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">~</span><span class="lit">0b110110</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 001001</span></pre>

<h3>
	عوامل قناع بتّي-قناع بتّي (Bitmask-bitmask)
</h3>

<p>
	العامل الثنائي AND‎ <code>&amp;</code> يُعيد 1 مكان كل بت له القيمة 1 في كِلا المعامَلين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_86" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">"%'06b"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0b110101</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">0b011001</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 010001</span></pre>

<p>
	العامل الثنائي OR <code>|</code> يُعيد 1 مكان كل بت له القيمة 1 في أحد المعامَلين أو كلاهما.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_88" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">"%'06b"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0b110101</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="lit">0b011001</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 111101</span></pre>

<p>
	العامل الثنائي XOR <code>^</code> يُعيد 1 مكان كل بت له القيمة 1 في أحد المعامَلين فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_90" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">"%'06b"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0b110101</span><span class="pln"> </span><span class="pun">^</span><span class="pln"> </span><span class="lit">0b011001</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 101100</span></pre>

<h3>
	أمثلة لاستخدام الأقنعة البتّية
</h3>

<p>
	يمكن استخدام هذه العوامل للتعامل مع الأقنعة البتّية، مثال على ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_92" style="">
<span class="pln">file_put_contents</span><span class="pun">(</span><span class="str">"file.log"</span><span class="pun">,</span><span class="pln"> LOCK_EX </span><span class="pun">|</span><span class="pln"> FILE_APPEND</span><span class="pun">);</span></pre>

<p>
	اُستخدم هنا العامل <code>|</code> لدمج اثنين من الأقنعة البتّية، بالرغم من أنّ العامل <code>+</code> له نفس التأثير أيضًا إلا أنّ <code>|</code> تؤكد أنّك تدمج الأقنعة البتّية ولست فقط تجمع رقمين صحيحين عاديين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_94" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> OPTION_A </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> OPTION_B </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> OPTION_C </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> OPTION_A </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $options </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">OPTION_A </span><span class="pun">|</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">OPTION_C</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> toggleOption</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $option</span><span class="pun">){</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">options </span><span class="pun">^=</span><span class="pln"> $option</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> enable</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $option</span><span class="pun">){</span><span class="pln">
        </span><span class="com">// بغض النظر عن حالته الأصلية $option تمكين</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">options </span><span class="pun">|=</span><span class="pln"> $option</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> disable</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $option</span><span class="pun">){</span><span class="pln">
        </span><span class="com">// بغض النظر عن حالته الأصلية دون التأثير على البتات الأخرى $option تمكين</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">options </span><span class="pun">&amp;=</span><span class="pln"> </span><span class="pun">~</span><span class="pln">$option</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// تُرجع الدالة التالية فيما إذا كانت إحدى الخيارت ممكّنة</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> isOneEnabled</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $options</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">options </span><span class="pun">&amp;</span><span class="pln"> $option </span><span class="pun">!==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// بت مرتفع فقد نعالج عدد صحيح سالب $options استخدمنا ==! بدلًا من &gt; لأنّه إذا كانت قيمة</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// تُرجع الدالة التالية فيما إذا كانت كل الخيارت ممكّنة</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> areAllEnabled</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $options</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">options </span><span class="pun">&amp;</span><span class="pln"> $options</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> $options</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// لاحظ استخدام الأقواس للحذر من أولوية العامل</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يستخدم هذا المثال (بفرض <code>‎$option</code> يحوي بت واحد دومًا):
</p>

<ul>
<li>
		العامل <code>^</code> لتبديل الأقنعة البتّية بشكلٍ ملائم.
	</li>
	<li>
		العامل <code>|</code> لضبط بت بغض النظر عن حالته الأصلية أو باقي البتات.
	</li>
	<li>
		العامل <code>~</code> لتحويل العدد الصحيح الذي فيه بت واحد مضبوط (قيمته 1) إلى عدد صحيح فيه بت واحد غير مضبوط (قيمته 0).
	</li>
	<li>
		العامل <code>&amp;</code> لإلغاء ضبط بت باستخدام خصائص <code>&amp;</code> التالية:
		<ul>
<li>
				بما أنّ <code>‎&amp;=‎</code> مع بت مضبوط لن تفعل شيء <code>‎((1 &amp; 1) === 1, (0 &amp; 1) === 0)‎</code> فإنّ استخدام <code>‎&amp;=‎</code> مع عدد صحيح له بت واحد غير مضبوط لن يضبط هذا البت بدون التأثير على البتات الأخرى.
			</li>
			<li>
				استخدام <code>‎&amp;=‎</code> مع بت غير مضبوط لن يضبط ذلك البت <code>‎((1 &amp; 0) === 0, (0 &amp; 0) === 0)‎</code>.
			</li>
		</ul>
</li>
	<li>
		استخدام العامل <code>&amp;</code> مع قناع بتّي آخر سيصفّي كل البتات الباقية غير المضبوطة في القناع البتّي هذا.
		<ul>
<li>
				إذا كان في الخرج أي بت مضبوط فهذا يعني أن الخياران ممكّنان.
			</li>
			<li>
				إذا كان في الخرج كل بتات القناع البتّي مضبوطة، هذا يعني أنّ كل خيارات القناع البتّي ممكّنة.
			</li>
		</ul>
</li>
</ul>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<p>
	تذكر دومًا أنّ عوامل الموازنة هذه <code>‎(&lt; &gt; &lt;= &gt;= == === != !== &lt;&gt; &lt;=&gt;)‎</code> لها أولوية أعلى من عوامل قناع بتّي-قناع بتّي <code>(&amp; ^ |)</code>، وبما أنّ نتائج العمليات الثنائية تُوازن عادةً باستخدام عوامل الموازنة هذه فيجب الانتباه إلى هذه النقطة.
</p>

<h3>
	عوامل إزاحة البت (Bit-shifting)
</h3>

<p>
	عامل الإزاحة إلى اليسار <code>‎&lt;&lt;‎</code> يزيح كل البتات إلى اليسار (الأكثر أهمية) وفق عددٍ معطى، ويتجاهل كل البتات المزاحة. يكافئ هذا العامل عدم ضبط بتات <code>‎$x</code> العليا والضرب بالقوة رقم <code>‎$x</code> للعدد 2.?
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_96" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">"%'08b"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0b00001011</span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 00101100</span><span class="pln">

</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">PHP_INT_SIZE </span><span class="pun">===</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln"> </span><span class="com">// نظام 32 بت</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%x, %x"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x5FFFFFFF</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0x1FFFFFFF</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 7FFFFFFC, FFFFFFFF</span></pre>

<p>
	عامل الإزاحة إلى اليمين <code>‎&gt;&gt;‎</code> يزيح البتات إلى اليمين (الأقل أهمية) ويتجاهل البتات المزاحة، يكافئ هذا العامل القسمة على القوة رقم <code>‎$x</code> للعدد 2 ويتجاهل الجزء غير الصحيح.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_98" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">"%x"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFFFFFFFF</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1FFFFFFF</span></pre>

<h3>
	أمثلة لاستخدام عوامل إزاحة البت
</h3>

<p>
	القسمة السريعة على 16 (أداء أفضل من ‎‎/= 16)
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_100" style="">
<span class="pln">$x </span><span class="pun">&gt;&gt;=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span></pre>

<p>
	يتجاهل هذا العامل في أنظمة 32 بت كل البتات في العدد الصحيح ويضبط قيمتها إلى 0، وفي أنظمة 64 بت يؤدي إلى عدم ضبط البتات 32 الأكثر أهمية ويحافظ على الأقل أهمية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_102" style="">
<span class="pln">$x </span><span class="pun">=</span><span class="pln"> $x </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">32</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">32</span><span class="pun">;</span></pre>

<p>
	32 بت الأكثر أهمية تكافئ <code>‎$x &amp; 0xFFFFFFFF</code>. لاحظ أنّه في هذا المثال استخدام <code>printf("%'06b")‎</code> يُرجع القيمة بشكل 6 أرقام ثنائية.
</p>

<h2>
	عوامل الأنواع <code>instanceof</code> (‏type operator)
</h2>

<p>
	يمكننا استخدام العامل <code>instanceof</code> الثنائي بدءًا من PHP الإصدار 5 للتحقق فيما إذا كانت الكائنات من نفس الصنف.
</p>

<p>
	المعامل الأول (اليساري) هو الكائن الذي نريد التحقق منه، إذا لم يكن هذا المتغير كائن فإنّ العامل <code>instanceof</code> سيرجع <code>false</code>، إذا اُستخدم تعبير ثابت سيُرمى خطأ.
</p>

<p>
	المعامل الثاني (اليميني) هو الصنف الذي نريد الموازنة معه، يمكن أن نعبر عن الصنف باسم الصنف نفسه أو بمتغير من نوع سلسلة نصية يعبر عن اسم الصنف (وليس سلسلة نصية ثابتة) أو بكائن من ذلك الصنف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_104" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$o1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$o2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'MyClass'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// true القيمة $a في الحالات التالية يأخذ المتغير</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o1 </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o1 </span><span class="kwd">instanceof</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o1 </span><span class="kwd">instanceof</span><span class="pln"> $o2</span><span class="pun">;</span><span class="pln">

$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o1 </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="str">'MyClass'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// parse error: constant not allowed</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">;</span><span class="pln"> </span><span class="com">// fatal error: constant not allowed</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $b </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// false (ليس كائن $b المتغير)</span></pre>

<p>
	يمكن أيضًا أن نستخدم العامل <code>instanceof</code> للتحقق فيما إذا كان كائن ما نسخة من صنف يوسّع صنف آخر أو يحقق واجهة ما:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_106" style="">
<span class="kwd">interface</span><span class="pln"> </span><span class="typ">MyInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySuperClass</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">MyInterface</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">MySuperClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$o </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pun">();</span><span class="pln">

</span><span class="com">// true القيمة $a في الحالات التالية يأخذ المتغير</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MySubClass</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MySuperClass</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">MyInterface</span><span class="pun">;</span></pre>

<p>
	يمكننا استخدام العامل not <code>!</code> للتحقق فيما إذا كان الكائن ليس من صنف ما:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_108" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">OtherClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$o </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!</span><span class="pln">$o </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">OtherClass</span><span class="pun">;</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	لاحظ أننا لا نحتاج الأقواس حول <code>‎$o instanceof MyClass</code> لأنّ العامل <code>instanceof</code> له أولوية أعلى من <code>!</code> بالرغم من أنّ إضافة الأقواس تجعل الشيفرة أكثر قابلية للقراءة.
</p>

<h3>
	تحذيرات
</h3>

<p>
	إذا لم يكن الصنف موجودًا تُستدعى دوال التحميل التلقائي المسجلّة لمحاولة إيجاد الصنف، في الإصدارات السابقة للإصدار PHP 5.1.0 فإنّ العامل <code>instanceof</code> قد يقوم بهذه الاستدعاءات وبالتالي يحدد الصنف فعليًا (وإذا لم يحدَّد الصنف سيحدث خطأ فادح (fatal error)).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9340_110" style="">
<span class="com">// 5.1.0 الإصدارات السابقة للإصدار</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$o </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">OtherClass</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// غير معرّف OtherClass الصنف</span><span class="pln">
</span><span class="com">/* معرّف في المحمّل التلقائي المسجل فإنّه سيُحمّل OtherClass إذا كان الصنف
وإذا لم يكن هذا الصنف معرّفًا (OtherClass ليس من $a المتغير)  false القيمة $a ويأخذ المتغير 
سيُرمى خطأً فادحًا */</span><span class="pln">

$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'YetAnotherClass'</span><span class="pun">;</span><span class="pln">
$a </span><span class="pun">=</span><span class="pln"> $o </span><span class="kwd">instanceof</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln">
</span><span class="com">// غير معرّف YetAnotherClass الصنف</span><span class="pln">
</span><span class="com">//غير معرّف YetAnotherClass ويبقى الصنف false القيمة المنطقية $a يأخذ المتغير</span></pre>

<p>
	بدءًا من الإصدار 5.1.0 فإنّ المحمّلات التلقائية المسجلّة لن تُستدعى في مثل هذه الحالات.
</p>

<p>
	<strong>الإصدارات الأقدم من PHP (قبل الإصدار 5.0)</strong>
</p>

<p>
	يمكن استخدام الدالة <code>is_a</code> في الإصدارات السابقة للإصدار 5.0 لتحديد فيما إذا كان الكائن من صنف معين، أُهملت هذه الدالة في PHP 5 ولم تُهمل في PHP 5.3.3.
</p>

<p>
	ترجمة -وبتصرف- للفصل [Operators] من كتاب <a href="https://goalkicker.com/PHPBook" rel="external nofollow">PHP Notes for Professionals</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%B1%D8%A7%D8%AC%D8%B9-references-%D9%81%D9%8A-php-r1044/" rel="">المراجع (references) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%B7%D8%A8%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%88%D8%B9%D8%B1%D8%B6%D9%87%D8%A7-%D9%81%D9%8A-php-r1042/" rel="">طباعة القيم وعرضها في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1043</guid><pubDate>Wed, 28 Oct 2020 13:01:00 +0000</pubDate></item><item><title>&#x637;&#x628;&#x627;&#x639;&#x629; &#x627;&#x644;&#x642;&#x64A;&#x645; &#x648;&#x639;&#x631;&#x636;&#x647;&#x627; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%B7%D8%A8%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%88%D8%B9%D8%B1%D8%B6%D9%87%D8%A7-%D9%81%D9%8A-php-r1042/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/4.png.074c037e0568f4972c993e28b8f0df27.png" /></p>

<p>
	من المفيد لبناء برنامج PHP ديناميكي وتفاعلي أن تحصل على خرج من المتغيرات وقيمتها، توفر PHP عدة توابع لعرض قيمة ما، يغطي هذا الفصل التوابع الأساسية لطباعة قيمة في PHP وأين يمكن استخدامها.
</p>

<h2>
	<code>echo</code> و<code>print</code>
</h2>

<p>
	تعدّ <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/echo" rel="">echo</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/print" rel="">print</a> من بنى اللغة وليست دوالًا، لذلك لا حاجة لاستخدام الأقواس لتمرير الوسائط إليها كما نفعل في الدوال (بالرغم من أنه يمكننا دائمًا إضافة أقواس حول أي تعبير PHP لذا يمكننا كتابة <code>echo‎("test‎")‎</code> دون أيّة مشكلة)، وخرجهما عبارة عن تمثيل سلسلة لمتغير أو ثابت أو تعبير ولا يمكن استخدامهما لطباعة مصفوفات أو كائنات.
</p>

<ul>
<li>
		إسناد السلسلة <code>Joel</code> للمتغير <code>‎$name</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_7" style="">
<span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Joel"</span><span class="pun">;</span></pre>

<ul>
<li>
		خرج قيمة المتغير <code>‎$name</code> باستخدام <code>echo</code> و<code>print</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_9" style="">
<span class="pln">echo $name</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// Joel</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> $name</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// Joel</span></pre>

<ul>
<li>
		الأقواس غير ضرورية إلا أنّه يمكنك استخدامها:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_11" style="">
<span class="pln">echo</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Joel</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Joel</span></pre>

<ul>
<li>
		استخدام عدة معاملات (مع <code>echo</code> فقط):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_13" style="">
<span class="pln">echo $name</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Smith"</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// JoelSmith</span><span class="pln">

echo</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">,</span><span class="pln"> </span><span class="str">" "</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Smith"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// Joel Smith</span></pre>

<ul>
<li>
		<code>print</code> هي تعبير يرجع القيمة 1 لذا يمكن أن يكون استخدامها مفيدًا أكثر من <code>echo</code> في بعض الحالات:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_15" style="">
<span class="kwd">print</span><span class="pun">(</span><span class="str">"hey"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="str">" "</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"you"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// you11</span></pre>

<p>
	تكافئ الشيفرة السابقة مايلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_17" style="">
<span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">"hey"</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">" "</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"you"</span><span class="pun">)));</span><span class="pln"> 
</span><span class="com">// you11</span></pre>

<p>
	<strong>الصياغة المختصرة للبنية <code>echo</code></strong>
</p>

<p>
	من الممكن افتراضيًا استخدام الصياغة المختصرة عند <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/basic_syntax#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85_PHP_.D9.85.D8.B9_HTML" rel="">استخدام وسوم PHP خارج شيفرة PHP</a>، وذلك بدءًا بوسم البداية <code>‎&lt;?=‎</code> وانتهاءً بوسم النهاية <code>‎?&gt;‎</code>، مثال عن ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_19" style="">
<span class="tag">&lt;p&gt;</span><span class="pun">&lt;?=</span><span class="pln">$variable</span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pun">&lt;?=</span><span class="pln"> </span><span class="str">"This is also PHP"</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	لاحظ أنّه لم يتم الإنهاء باستخدام الفاصلة المنقوطة <code>;</code>، إلا أنّ هذه الشيفرة تعمل بشكلٍ صحيحٍ لأن وسم نهاية PHP ينهي كل تعليمة، لذلك تُحذف عادةً الفاصلة المنقوطة في الصياغة المختصرة.
</p>

<p>
	<strong>أولوية البنية <code>print</code></strong>
</p>

<p>
	على الرغم من أن <code>print</code> بنية لغة إلا أنّ لها أولوية مثل العامل (operator)، وتوضع بين <code>= += -= *= **= /= .= %= &amp;=</code> والعوامل وتترك ارتباطها. مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_21" style="">
<span class="pln">echo </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'2'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// 511</span></pre>

<p>
	نفس المثال مع أقواس:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_23" style="">
<span class="pln">echo </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="str">'2'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// 511</span></pre>

<p>
	<strong>الفروقات بين <code>echo</code> و<code>print</code></strong>
</p>

<p>
	باختصار، هناك فارقين أساسيّين بينهما:
</p>

<ul>
<li>
		تأخذ <code>print</code> معاملًا واحدًا فقط بينما يمكن أن تأخذ <code>echo</code> عدة معاملات.
	</li>
	<li>
		ترجع <code>print</code> قيمة لذا يمكن استخدامها تعبيرًا (expression).
	</li>
</ul>
<h2>
	إظهار عرض بنيوي للمصفوفات والكائنات
</h2>

<p>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/print_r" rel="">‎print_r()‎</a>: تعرض المصفوفات والكائنات لتنقيح الأخطاء (debugging) وتُظهر المصفوفة أو الكائن بتنسيقٍ مقروءٍ من قِبل الإنسان.
</p>

<p>
	إذا كان لديك متغير عبارة عن كائن أو مصفوفة وحاولت عرضه مستخدمًا <code>echo</code>، فإنّ ذلك سيرمي الخطأ <code>Notice: Array to string conversion</code>، يمكنك استخدام الدالة <code>print_r</code> بدلًا منها لإظهار المتغير بتنسيقٍ مقروء من قبل الإنسان، ويمكنك تمرير <code>true</code> معاملًا ثانيًا للحصول على المحتوى بشكل سلسلة نصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_25" style="">
<span class="pln">$myobject </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">();</span><span class="pln">
$myobject</span><span class="pun">-&gt;</span><span class="pln">myvalue </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello World'</span><span class="pun">;</span><span class="pln">
$myarray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"World"</span><span class="pln"> </span><span class="pun">];</span><span class="pln">
$mystring </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pun">;</span><span class="pln">
$myint </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">;</span><span class="pln">

</span><span class="com">// لعرض بيانات مصفوفة print_r نستخدم</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$myobject</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$mystring</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$myint</span><span class="pun">);</span></pre>

<p>
	خرج الشيفرة السابقة هو:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_27" style="">
<span class="pln">stdClass </span><span class="typ">Object</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">myvalue</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Hello</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">World</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Hello</span><span class="pln"> </span><span class="typ">World</span><span class="pln">
</span><span class="lit">42</span></pre>

<p>
	بالإضافة إلى ذلك يمكن أن نحصل على خرج الدالة <code>print_r</code> بشكل سلسلة نصية بدلًا من طباعته بشكلٍ بسيط، مثلًا تعرض الشيفرة التالية النسخة المنسّقة من <code>‎$myarray</code> في متغير جديد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_31" style="">
<span class="pln">$formatted_array </span><span class="pun">=</span><span class="pln"> print_r</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span></pre>

<p>
	لاحظ أنّه إذا كنت تعرض خرج PHP في متصفح ويتم ترجمته إلى HTML فلن يتم عرض فواصل الأسطر وسيكون الخرج أقل وضوحًا إلا إذا كتبت كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_33" style="">
<span class="pln">echo </span><span class="str">'&lt;pre&gt;'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> print_r</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&lt;/pre&gt;'</span><span class="pun">;</span></pre>

<p>
	لاحظ أنّ فتح الشيفرة المصدرية لصفحة ما سيكتب متغيرك بنفس التنسيق أيضًا بدون استخدام الوسم <code>&lt;pre&gt;</code>.
</p>

<p>
	يمكنك بدلًا من ذلك أن تخبر المتصفح أن ما تعرضه هو نص عادي وليس HTML:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_35" style="">
<span class="pln">header</span><span class="pun">(</span><span class="str">'Content-Type: text/plain; charset=utf-8'</span><span class="pun">);</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">);</span></pre>

<p>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/var_dump" rel="">var_dump()‎</a>: خرجها عبارة عن معلومات تنقيح قابلة للقراءة من قِبل الإنسان حول محتوى الوسيط (الوسطاء) متضمنةً نوعه وقيمته، وخرج هذه الدالة أكثر تفصيلًا من خرج الدالة <code>print_r</code> لأنّ خرجها أيضًا نوع المتغير وقيمته ومعلومات أخرى مثل معرّف الكائن، حجم المصفوفة، طول السلسلة النصية، مؤشر المرجع وغير ذلك…، لذا يمكنك استخدام <code>var_dump</code> لإخراج نسخة أكثر تفصيلًا للتنقيح.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_37" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">$myobject</span><span class="pun">,</span><span class="pln"> $myarray</span><span class="pun">,</span><span class="pln"> $mystring</span><span class="pun">,</span><span class="pln"> $myint</span><span class="pun">);</span></pre>

<p>
	لاحظ أنّ الخرج أكثر تفصيلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_39" style="">
<span class="kwd">object</span><span class="pun">(</span><span class="pln">stdClass</span><span class="pun">)#</span><span class="lit">12</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">[</span><span class="str">"myvalue"</span><span class="pun">]=&gt;</span><span class="pln">
        </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">11</span><span class="pun">)</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
array</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]=&gt;</span><span class="pln">
        </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="str">"Hello"</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]=&gt;</span><span class="pln">
        </span><span class="kwd">string</span><span class="pun">(</span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="str">"World"</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">string</span><span class="pun">(</span><span class="lit">11</span><span class="pun">)</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pln">
</span><span class="kwd">int</span><span class="pun">(</span><span class="lit">42</span><span class="pun">)</span></pre>

<p>
	لاحظ أنّه إذا استخدمت المنقّح xDebug في بيئة التطوير فإنّ خرج <code>var_dump</code> سيكون محدودًا بشكلٍ افتراضي. يمكنك الاطلاع على <a href="https://xdebug.org/docs/display" rel="external nofollow">التوثيق الرسمي</a> لمزيدٍ من المعلومات حول خيارات تغيير هذا الإعداد الافتراضي.
</p>

<p>
	<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/var_export" rel="">var_export()‎</a>: تُخرج هذه الدالة شيفرة PHP صالحة، وتعيد تمثيل المتغير. يمكنك أن تمرر <code>true</code> معاملًا ثانيًا لترجع المحتويات في متغير.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_43" style="">
<span class="pln">var_export</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">);</span><span class="pln">
var_export</span><span class="pun">(</span><span class="pln">$mystring</span><span class="pun">);</span><span class="pln">
var_export</span><span class="pun">(</span><span class="pln">$myint</span><span class="pun">);</span></pre>

<p>
	الخرج هو شيفرة PHP صالحة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_45" style="">
<span class="pln">array </span><span class="pun">(</span><span class="pln">
    </span><span class="lit">0</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'World'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
</span><span class="str">'Hello World'</span><span class="pln">
</span><span class="lit">42</span></pre>

<p>
	يمكنك أن تفعل التالي لتضع المحتوى في متغير:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_47" style="">
<span class="pln">$array_export </span><span class="pun">=</span><span class="pln"> var_export</span><span class="pun">(</span><span class="pln">$myarray</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
$string_export </span><span class="pun">=</span><span class="pln"> var_export</span><span class="pun">(</span><span class="pln">$mystring</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
$int_export </span><span class="pun">=</span><span class="pln"> var_export</span><span class="pun">(</span><span class="pln">$myint</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// أي قيمة توكيد</span></pre>

<p>
	بعد ذلك يمكنك إخراجها كالتالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_49" style="">
<span class="pln">printf</span><span class="pun">(</span><span class="str">'$myarray = %s; %s'</span><span class="pun">,</span><span class="pln"> $array_export</span><span class="pun">,</span><span class="pln"> PHP_EOL</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">'$mystring = %s; %s'</span><span class="pun">,</span><span class="pln"> $string_export</span><span class="pun">,</span><span class="pln"> PHP_EOL</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">'$myint = %s; %s'</span><span class="pun">,</span><span class="pln"> $int_export</span><span class="pun">,</span><span class="pln"> PHP_EOL</span><span class="pun">);</span></pre>

<p>
	ستخرج هذه الشيفرة الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_51" style="">
<span class="pln">$myarray </span><span class="pun">=</span><span class="pln"> array </span><span class="pun">(</span><span class="pln">
    </span><span class="lit">0</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'World'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span><span class="pln">
$mystring </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello World'</span><span class="pun">;</span><span class="pln">
$myint </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">;</span></pre>

<h2>
	ربط السلاسل النصية باستخدام echo
</h2>

<p>
	يمكنك استخدام الربط (concatenation) <a href="https://wiki.hsoub.com/PHP/string_operators" rel="external">لربط السلاسل</a> "نهاية إلى نهاية" عند إخراجها (باستخدام <code>echo</code> أو <code>print</code> مثلًا)، يمكنك دمج المتغيرات باستخدام <code>.</code> (نقطة).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_53" style="">
<span class="com">//متغير بشكل سلسلة نصية</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Joel'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ربط عدة سلاسل نصية (3 سلاسل في مثالنا) في سلسلة نصية واحدة ثم طباعتها</span><span class="pln">
echo </span><span class="str">'&lt;p&gt;Hello '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $name </span><span class="pun">.</span><span class="pln"> </span><span class="str">', Nice to see you.&lt;/p&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "&lt;p&gt;Hello Joel, Nice to see you.&lt;/p&gt;"</span></pre>

<p>
	وبطريقة مشابهة للربط يمكننا استخدام <code>echo</code> (بدون أقواس) لربط السلاسل والمتغيرات معًا (بالإضافة إلى التعابير العشوائية الأخرى) باستخدام الفاصلة <code>(,)</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_55" style="">
<span class="pln">$itemCount </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">'You have ordered '</span><span class="pun">,</span><span class="pln"> $itemCount</span><span class="pun">,</span><span class="pln"> </span><span class="str">' item'</span><span class="pun">,</span><span class="pln"> $itemCount </span><span class="pun">===</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">''</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'s'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "You have ordered 1 item"</span></pre>

<p>
	<strong>موازنة بين دمج السلاسل وتمرير عدة وسائط للبنية <code>echo</code></strong>
</p>

<p>
	يعدّ تمرير عدة وسائط للبنية <code>echo</code> أفضل من دمج السلاسل في بعض الحالات، تُكتب الوسائط في الخرج بنفس الترتيب الذي تُمرّر به.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_57" style="">
<span class="pln">echo </span><span class="str">"The total is: "</span><span class="pun">,</span><span class="pln"> $x </span><span class="pun">+</span><span class="pln"> $y</span><span class="pun">;</span></pre>

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

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_59" style="">
<span class="pln">echo </span><span class="str">"The total is: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x </span><span class="pun">+</span><span class="pln"> $y</span><span class="pun">);</span></pre>

<h2>
	printf أو sprintf
</h2>

<p>
	الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/printf" rel="">printf</a> تعرض سلسلة منسقة باستخدام بدائل. الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/sprintf" rel="">sprintf</a> ترجع سلسلة منسقة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_61" style="">
<span class="pln">$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Jeff'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// أن تتوقع سلسلة نصية PHP `%s` تخبر</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"Hello %s, How's it going?"</span><span class="pun">,</span><span class="pln"> $name</span><span class="pun">);</span><span class="pln">

</span><span class="com">// Hello Jeff, How's it going?</span><span class="pln">

</span><span class="com">// بدلًا من إخراجها مباشرة ($greeting) وضعها في متغير</span><span class="pln">
$greeting </span><span class="pun">=</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="str">"Hello %s, How's it going?"</span><span class="pun">,</span><span class="pln"> $name</span><span class="pun">);</span><span class="pln">
echo $greeting</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Hello Jeff, How's it going?</span></pre>

<p>
	من الممكن أيضًا تنسيق عدد باستخدام هاتين الدالتين، مثلًا عند تنسيق قيمة عشرية لتمثيل المال إذ يوجد لدينا دائمًا رقمين عشريين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_63" style="">
<span class="pln">$money </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25.2</span><span class="pun">;</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">'%01.2f'</span><span class="pun">,</span><span class="pln"> $money</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 25.20 الخرج</span></pre>

<p>
	تعمل الدالتان <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/vprintf" rel="">vprintf</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/vsprintf" rel="">vsprintf</a> مثل <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/printf" rel="">printf</a> و<a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/sprintf" rel="">sprintf</a> لكنهما تقبلان سلسلة تنسيق ومصفوفة من القيم بدلًا من المتغيرات الفردية.
</p>

<h2>
	إظهار أعداد صحيحة كبيرة
</h2>

<p>
	تُحوّل الأعداد الصحيحة الكبيرة الأكبر من PHP<em>INT</em>MAX تلقائيًا إلى أعداد عشرية (float) في أنظمة 32 بت، يمكن إظهار هذه القيم الصحيحة (أي التدوين غير العلمي) بالدالة <code>printf</code> مستخدمًا التمثيل العشري كما هو موضح في الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_65" style="">
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">([</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $p</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $i </span><span class="pun">=</span><span class="pln"> pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> $p</span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"pow(1024, %d) &gt; (%7s) %20s %38.0F"</span><span class="pun">,</span><span class="pln"> $p</span><span class="pun">,</span><span class="pln"> gettype</span><span class="pun">(</span><span class="pln">$i</span><span class="pun">),</span><span class="pln"> $i</span><span class="pun">,</span><span class="pln"> $i</span><span class="pun">);</span><span class="pln">
    echo </span><span class="str">" "</span><span class="pun">,</span><span class="pln"> $i</span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// الخرج</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> integer                 </span><span class="lit">1024</span><span class="pln">                 </span><span class="lit">1024</span><span class="pln">                 </span><span class="lit">1024</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> integer             </span><span class="lit">1048576</span><span class="pln">             </span><span class="lit">1048576</span><span class="pln">             </span><span class="lit">1048576</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> integer         </span><span class="lit">1073741824</span><span class="pln">         </span><span class="lit">1073741824</span><span class="pln">         </span><span class="lit">1073741824</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">double</span><span class="pln">    </span><span class="lit">1099511627776</span><span class="pln">    </span><span class="lit">1099511627776</span><span class="pln">    </span><span class="lit">1099511627776</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="lit">1.1258999068426E+15</span><span class="pln"> </span><span class="lit">1125899906842624</span><span class="pln">
</span><span class="lit">1.1258999068426E+15</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="lit">1.1529215046068E+18</span><span class="pln"> </span><span class="lit">1152921504606846976</span><span class="pln">
</span><span class="lit">1.1529215046068E+18</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="lit">1.2379400392854E+27</span><span class="pln"> </span><span class="lit">1237940039285380274899124224</span><span class="pln">
</span><span class="lit">1.2379400392854E+27</span><span class="pln">
pow</span><span class="pun">(</span><span class="lit">1024</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="lit">1.3292279957849E+36</span><span class="pln"> </span><span class="lit">1329227995784915872903807060280344576</span><span class="pln">
</span><span class="lit">1.3292279957849E+36</span></pre>

<p>
	ملاحظة: انتبه من دقة الأعداد العشرية اللانهائية.
</p>

<p>
	يمكن في هذا المثال المبتكر تمثيل جميع الأعداد كعدد ثنائي لأنّها كلها قوى العدد 1024 (وبالتالي 2)، مثلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_67" style="">
<span class="pln">$n </span><span class="pun">=</span><span class="pln"> pow</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">27</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%s %.0F\n"</span><span class="pun">,</span><span class="pln"> $n</span><span class="pun">,</span><span class="pln"> $n</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 1.0E+27 1000000000000000013287555072</span></pre>

<h2>
	إظهار مصفوفة متعددة الأبعاد مع الفهرس والقيمة وطباعتها ضمن جدول
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_69" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">13</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">category_id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Leaving</span><span class="pln"> </span><span class="typ">Of</span><span class="pln"> </span><span class="typ">Liverpool</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">description</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Leaving</span><span class="pln"> </span><span class="typ">Of</span><span class="pln"> </span><span class="typ">Liverpool</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">price</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1.00</span><span class="pln">
            </span><span class="pun">[</span><span class="kwd">virtual</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">active</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">sort_order</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">13</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">created</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2007</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">24</span><span class="pln"> </span><span class="lit">14</span><span class="pun">:</span><span class="lit">08</span><span class="pun">:</span><span class="lit">03</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">modified</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2007</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">24</span><span class="pln"> </span><span class="lit">14</span><span class="pun">:</span><span class="lit">08</span><span class="pun">:</span><span class="lit">03</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">image</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> NONE
        </span><span class="pun">)</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">16</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">category_id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">7</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Yellow</span><span class="pln"> </span><span class="typ">Submarine</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">description</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Yellow</span><span class="pln"> </span><span class="typ">Submarine</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">price</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1.00</span><span class="pln">
            </span><span class="pun">[</span><span class="kwd">virtual</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">active</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">sort_order</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">16</span><span class="pln">
            </span><span class="pun">[</span><span class="pln">created</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2007</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">24</span><span class="pln"> </span><span class="lit">14</span><span class="pun">:</span><span class="lit">10</span><span class="pun">:</span><span class="lit">02</span><span class="pln">
</span><span class="pun">[</span><span class="pln">modified</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2007</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">24</span><span class="pln"> </span><span class="lit">14</span><span class="pun">:</span><span class="lit">10</span><span class="pun">:</span><span class="lit">02</span><span class="pln">
</span><span class="pun">[</span><span class="pln">image</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> NONE
        </span><span class="pun">)</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	إظهار مصفوفة متعددة الأبعاد مع الفهرس والقيمة في جدول
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6891_71" style="">
<span class="tag">&lt;table&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$products </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$value </span><span class="kwd">as</span><span class="pln"> $k </span><span class="pun">=&gt;</span><span class="pln"> $v</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"&lt;tr&gt;"</span><span class="pun">;</span><span class="pln">
        echo </span><span class="str">"&lt;td&gt;$k&lt;/td&gt;"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Get index.</span><span class="pln">
        echo </span><span class="str">"&lt;td&gt;$v&lt;/td&gt;"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Get value.</span><span class="pln">
        echo </span><span class="str">"&lt;/tr&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;/table&gt;</span></pre>

<p>
	ترجمة -وبتصرف- للفصل [Outputting the Value of a Variable] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%B9%D9%88%D8%A7%D9%85%D9%84-operators-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%88%D8%AF%D8%A9-%D9%81%D9%8A-php-r1043/" rel="">أهم العوامل (operators) الموجودة في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="http://%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%20%D8%B0%D8%A7%D8%AA%20%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%20%D8%A7%D9%84%D8%B9%D8%A7%D9%85%20%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%8A%20(Superglobal%20Variables)%20%D9%81%D9%8A%20PHP%20" rel="">المتغيرات ذات النطاق العام العالي (Superglobal Variables) في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1042</guid><pubDate>Sun, 25 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x630;&#x627;&#x62A; &#x627;&#x644;&#x646;&#x637;&#x627;&#x642; &#x627;&#x644;&#x639;&#x627;&#x645; &#x627;&#x644;&#x639;&#x627;&#x644;&#x64A; (Superglobal Variables) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D8%B0%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D8%B9%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%8A-superglobal-variables-%D9%81%D9%8A-php-r1041/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/3.png.fdf84e90f17e1a6d16cc2626fc907d70.png" /></p>

<p>
	هي متغيرات مدمجة معرّفة مسبقًا في لغة PHP على أنّها متغيرات ذات نطاق عام عالي، وهذا يعني أنّها متاحة دائمًا في جميع نطاقات السكربت دون الحاجة لتعريفها باستخدام الكلمة المفتاحية <code>global</code> للوصول إليها من داخل الدوال أو التوابع.
</p>

<h2>
	شرح المتغيرات ذات النطاق العام العالي
</h2>

<p>
	ببساطة هي المتغيرات المتاحة في كل نطاقات ملفات السكربت لديك، وهذا يعني أنّه لا حاجة لتمريرها كمعاملات للدوال أو تخزينها خارج كتلة الشيفرة لتصبح متاحة في مختلف النطاقات.
</p>

<h3>
	ما هو المتغير ذو النطاق العام العالي؟
</h3>

<p>
	بدءًا من الإصدار 7.1.3 PHP هناك 9 متغيرات ذات نطاق عام عالي وهي:
</p>

<ul>
<li>
		<code>‎$GLOBALS‎</code>: تشير إلى كل المتغيرات المتاحة في النطاق العام
	</li>
	<li>
		<code>‎$_SERVER‎</code>: معلومات الخادم وبيئة التنفيذ
	</li>
	<li>
		<code>‎$_GET</code>: متغيرات طلب HTTP باستخدام GET
	</li>
	<li>
		<code>‎$_POST</code>: متغيرات طلب HTTP باستخدام POST
	</li>
	<li>
		<code>‎$_FILES</code>: متغيرات طلب HTTP لتحميل ملف
	</li>
	<li>
		<code>‎$_COOKIE</code>: ملفات تعريف ارتباط HTTP ‏(HTTP Cookies)
	</li>
	<li>
		<code>‎$_SESSION</code>: متغيرات الجلسة
	</li>
	<li>
		<code>‎$_REQUEST</code>: متغيرات طلب HTTP
	</li>
	<li>
		<code>‎:</code>$_ENV متغيرات البيئة
	</li>
</ul>
<p>
	يمكنك الاطلاع عليها في <a href="https://www.php.net/manual/en/language.variables.superglobals.php" rel="external nofollow">التوثيق الرسمي</a>
</p>

<p>
	إليك المزيد من المعلومات حول هذه المتغيرات:
</p>

<h3>
	‎$GLOBALS
</h3>

<p>
	مصفوفة ترابطية (associative array) تحوي مراجعًا لكل المتغيرات المعرّفة في النطاق العام للسكربت، وتمثّل المفاتيح فيها أسماء المتغيرات وقيمة عناصرها هي محتويات تلك المتغيرات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_7" style="">
<span class="com">// تعريف متغير خارج النطاق</span><span class="pln">
$myGlobal </span><span class="pun">=</span><span class="pln"> </span><span class="str">"global"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// تعريف متغير داخل النطاق</span><span class="pln">
    $myLocal </span><span class="pun">=</span><span class="pln"> </span><span class="str">"local"</span><span class="pun">;</span><span class="pln">
    </span><span class="com">// طباعة كلا المتغيرين</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$myLocal</span><span class="pun">);</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$GLOBALS</span><span class="pun">[</span><span class="str">"myGlobal"</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// تنفيذ الدالة</span><span class="pln">
test</span><span class="pun">();</span><span class="pln">
</span><span class="pun">لم</span><span class="pln"> </span><span class="pun">يعرّف</span><span class="pln"> </span><span class="pun">ضمن</span><span class="pln"> </span><span class="pun">النطاق</span><span class="pln"> </span><span class="pun">العام</span><span class="pln"> $myLocal </span><span class="pun">‏‎‏فقط</span><span class="pln"> </span><span class="pun">بما</span><span class="pln"> </span><span class="pun">أنّ</span><span class="pln"> $myGlobal </span><span class="pun">ستُطبَع</span><span class="pln"> </span><span class="pun">قيمة</span><span class="pln"> </span><span class="pun">المتغير</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$myLocal</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$myGlobal</span><span class="pun">);</span></pre>

<p>
	خرج الشيفرة السابقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_9" style="">
<span class="kwd">string</span><span class="pln"> </span><span class="str">'local'</span><span class="pln"> </span><span class="pun">(</span><span class="pln">length</span><span class="pun">=</span><span class="lit">5</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> </span><span class="str">'global'</span><span class="pln"> </span><span class="pun">(</span><span class="pln">length</span><span class="pun">=</span><span class="lit">6</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">null</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> </span><span class="str">'global'</span><span class="pln"> </span><span class="pun">(</span><span class="pln">length</span><span class="pun">=</span><span class="lit">6</span><span class="pun">)</span></pre>

<p>
	في المثال السابق لم تُعرض قيمة المتغير <code>‎$myLocal</code> في المرة الثانية لأنّه معرّف داخل الدالة <code>test‎‎()‎</code> ودُمِّر بعد إغلاقها.
</p>

<h3>
	تعريف متغير عام
</h3>

<p>
	هناك طريقتان للتعريف: الطريقة الأولى: استخدام الكلمة المفتاحية <code>global</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_11" style="">
<span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">global</span><span class="pln"> $myLocal</span><span class="pun">;</span><span class="pln">
    $myLocal </span><span class="pun">=</span><span class="pln"> </span><span class="str">"local"</span><span class="pun">;</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$myLocal</span><span class="pun">);</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$GLOBALS</span><span class="pun">[</span><span class="str">"myGlobal"</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تسبق الكلمة المفتاحية <code>global</code> اسم المتغير ليصبح جزءًا من النطاق العام، ولا يمكن إسناد قيمة للمتغير في نفس التعليمة التي تعرّفه متغيرًا عامًا لذا أُسندَت القيمة له في سطرٍ منفصلٍ من الشيفرة السابقة، يمكن ذلك فقط في حال كتبت الشيفرة في سطرٍ واحد بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_13" style="">
<span class="kwd">global</span><span class="pln"> $myLocal</span><span class="pun">;</span><span class="pln"> $myLocal </span><span class="pun">=</span><span class="pln"> </span><span class="str">"local"</span><span class="pun">;</span></pre>

<p>
	لكن سيؤثر ذلك بالتأكيد على أناقة الشيفرة.
</p>

<p>
	الطريقة الثانية: مصفوفة <code>‎$GLOBALS</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_15" style="">
<span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    $GLOBALS</span><span class="pun">[</span><span class="str">"myLocal"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"local"</span><span class="pun">;</span><span class="pln">
    $myLocal </span><span class="pun">=</span><span class="pln"> $GLOBALS</span><span class="pun">[</span><span class="str">"myLocal"</span><span class="pun">];</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$myLocal</span><span class="pun">);</span><span class="pln">
    var_dump</span><span class="pun">(</span><span class="pln">$GLOBALS</span><span class="pun">[</span><span class="str">"myGlobal"</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في هذا المثال أعدت إسناد القيمة <code>["‎$GLOBAL["myLocal للمتغير ‎$myLocal</code> إذ وجدت أن كتابة اسم المتغير أسهل من كتابة المصفوفة الترابطية.
</p>

<h3>
	‎$_SERVER
</h3>

<p>
	<code>‎$_SERVER</code> هي مصفوفة تتضمن معلومات مثل الترويسات والمسارات وأماكن وجود السكربت. ينشئ خادم الويب مداخل هذه المصفوفة لكن ليس هناك ما يضمن أن خادم الويب سيزودنا بهذه المعلومات فقد يحذف خادم الويب بعضها أو قد يزودنا بمعلومات إضافية، يمكنك الاطلاع على جميع المتغيرات المتوقعة <a href="http://www.faqs.org/rfcs/rfc3875.html" rel="external nofollow">هنا</a>.
</p>

<p>
	إليك مثال خرج يمكن أن يكون كالتالي (يمكنك تشغيله عبر جهاز بنظام تشغيل ويندوز على الخادم WAMP):
</p>

<pre class="ipsCode">
C:\wamp64\www\test.php:2:
array (size=36)
    'HTTP_HOST' =&gt; string 'localhost' (length=9)
    'HTTP_CONNECTION' =&gt; string 'keep-alive' (length=10)
    'HTTP_CACHE_CONTROL' =&gt; string 'max-age=0' (length=9)
    'HTTP_UPGRADE_INSECURE_REQUESTS' =&gt; string '1' (length=1)
    'HTTP_USER_AGENT' =&gt; string 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/57.0.2987.133 Safari/537.36' (length=110)
    'HTTP_ACCEPT' =&gt; string
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' (length=74)
    'HTTP_ACCEPT_ENCODING' =&gt; string 'gzip, deflate, sdch, br' (length=23)
    'HTTP_ACCEPT_LANGUAGE' =&gt; string 'en-US,en;q=0.8,en-GB;q=0.6' (length=26)
    'HTTP_COOKIE' =&gt; string 'PHPSESSID=0gslnvgsci371ete9hg7k9ivc6' (length=36)
    'PATH' =&gt; string 'C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files
(x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS
Client\;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;E:\Program Files\ATI Technologies\ATI.ACE\Core-
Static;E:\Program Files\AMD\ATI.ACE\Core-Static;C:\Program Files (x86)\AMD\ATI.ACE\Core-
Static;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Intel\Intel(R)
Managemen'... (length=1169)
    'SystemRoot' =&gt; string 'C:\WINDOWS' (length=10)
    'COMSPEC' =&gt; string 'C:\WINDOWS\system32\cmd.exe' (length=27)
    'PATHEXT' =&gt; string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY' (length=57)
    'WINDIR' =&gt; string 'C:\WINDOWS' (length=10)
    'SERVER_SIGNATURE' =&gt; string '&lt;address&gt;Apache/2.4.23 (Win64) PHP/7.0.10 Server at localhost
Port 80&lt;/address&gt;' (length=80)
    'SERVER_SOFTWARE' =&gt; string 'Apache/2.4.23 (Win64) PHP/7.0.10' (length=32)
    'SERVER_NAME' =&gt; string 'localhost' (length=9)
    'SERVER_ADDR' =&gt; string '::1' (length=3)
    'SERVER_PORT' =&gt; string '80' (length=2)
    'REMOTE_ADDR' =&gt; string '::1' (length=3)
    'DOCUMENT_ROOT' =&gt; string 'C:/wamp64/www' (length=13)
    'REQUEST_SCHEME' =&gt; string 'http' (length=4)
    'CONTEXT_PREFIX' =&gt; string '' (length=0)
    'CONTEXT_DOCUMENT_ROOT' =&gt; string 'C:/wamp64/www' (length=13)
    'SERVER_ADMIN' =&gt; string 'wampserver@wampserver.invalid' (length=29)
    'SCRIPT_FILENAME' =&gt; string 'C:/wamp64/www/test.php' (length=26)
    'REMOTE_PORT' =&gt; string '5359' (length=4)
    'GATEWAY_INTERFACE' =&gt; string 'CGI/1.1' (length=7)
    'SERVER_PROTOCOL' =&gt; string 'HTTP/1.1' (length=8)
    'REQUEST_METHOD' =&gt; string 'GET' (length=3)
    'QUERY_STRING' =&gt; string '' (length=0)
    'REQUEST_URI' =&gt; string '/test.php' (length=13)
    'SCRIPT_NAME' =&gt; string '/test.php' (length=13)
    'PHP_SELF' =&gt; string '/test.php' (length=13)
    'REQUEST_TIME_FLOAT' =&gt; float 1491068771.413
    'REQUEST_TIME' =&gt; int 1491068771
</pre>

<p>
	هناك الكثير من الأشياء التي يمكن أن نتحدث عنها لكن سنختار الأهم من بينها، يمكنك الاطلاع عليها كلها من خلال <a href="https://www.php.net/manual/en/reserved.variables.server.php#refsect1-reserved.variables.server-indices" rel="external nofollow">قسم الفهارس</a> من التوثيق.
</p>

<p>
	لنوضح بعضها نفرض أنّ لدينا الرابط التالي <code><a href="http://www.example.com/index.php" ipsnoembed="true" rel="external nofollow">http://www.example.com/index.php</a></code>
</p>

<ul>
<li>
		HTTP_HOST: عنوان المضيف، يرجع <code>www.example.com</code>.
	</li>
	<li>
		HTTP_USER_AGENT: محتويات وكيل المستخدم (user agent)، عبارة عن سلسلة نصية تحوي كل معلومات متصفح العميل (client's browser) بما في ذلك نظام التشغيل.
	</li>
	<li>
		HTTP_COOKIE: جميع ملفات تعريف الارتباط (cookies) في سلسلة متسلسلة يفصل بين عناصرها فاصلة منقوطة.
	</li>
	<li>
		SERVER_ADDR: عنوان IP الخادم الذي ينفذ السكربت، يرجع القيمة <code>93.184.216.34</code>.
	</li>
	<li>
		PHP_SELF: اسم ملف السكربت المنفّذ حاليًا نسبةً إلى المستند الجذر، يرجع في حالتنا القيمة <code>/index.php</code>.
	</li>
	<li>
		REQUEST_TIME_FLOAT: الختم الزمني (timestamp) لبداية الطلب بدقة أجزاء الثانية، متاح من الإصدار PHP 5.4.0.
	</li>
	<li>
		REQUEST_TIME: الختم الزمني لبداية الطلب، متاح من الإصدار PHP 5.1.0.
	</li>
</ul>
<h3>
	‎:$_GET
</h3>

<p>
	مصفوفة ترابطية من المتغيرات الممررة عبر معاملات الرابط إلى السكربت الحالي، أي ما يأتي بعد ? في الرابط.
</p>

<p>
	بفرض لدينا الرابط <code><a href="http://www.example.com/index.php?myVar=myVal" ipsnoembed="true" rel="external nofollow">http://www.example.com/index.php?myVar=myVal</a></code>، يمكننا الحصول من الرابط على قيمة <code>‎$_GET["myVar"]‎</code> وستكون النتيجة هي <code>myVal</code>، يمكننا التعبير عن ذلك بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_18" style="">
<span class="com">// URL = http://www.example.com/index.php?myVar=myVal</span><span class="pln">
echo $_GET</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"myVal"</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">"true"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"false"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	يستخدم المثال السابق العامل الثلاثي (ternary operator)، ويبيّن كيفية الوصول للقيمة من الرابط باستخدام المتغير ذو النطاق العام العالي <code>‎$_GET</code>.
</p>

<p>
	إليك مثال آخر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_20" style="">
<span class="com">// URL = http://www.example.com/index.php?myVar=myVal&amp;myVar2=myVal2</span><span class="pln">
echo $_GET</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">];</span><span class="pln"> </span><span class="com">// "myVal"</span><span class="pln">
echo $_GET</span><span class="pun">[</span><span class="str">"myVar2"</span><span class="pun">];</span><span class="pln"> </span><span class="com">// "myVal2"</span></pre>

<p>
	يمكن إرسال عدة متغيرات عبر الرابط ويُفصل بينها بالمحرف <code>(&amp;)</code>.
</p>

<p>
	<strong>الخطر الأمني</strong>
</p>

<p>
	من المهم جدًا عدم إرسال معلومات حساسة عبر الرابط لأنها تبقى في سجل الحاسوب وستكون مرئية لأي شخص يمكنه الوصول للمتصفح.
</p>

<h3>
	‎$_POST
</h3>

<p>
	مصفوفة ترابطية من المتغيرات الممررة للسكربت الحالي بطريقة HTTP POST عند استخدام نوع المحتوى (Content-Type) لطلب HTTP ‏<code>application/x-www-form-urlencoded</code> أو <code>multipart/form-data</code>، وتشبه مصفوفة <code>‎$_GET</code> أنّ البيانات ممررة من مكان لآخر.
</p>

<p>
	سنبدأ فورًا بمثال (تجاهلت الخاصيّة <code>attribute</code> حتى تُرسل المعلومات إلى نفس صفحة النموذج).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_22" style="">
<span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"POST"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"myVar"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"myVal"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Submit"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_24" style="">
<span class="pln">echo $_POST</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// "myVal"</span></pre>

<p>
	<strong>الخطر الأمني</strong>
</p>

<p>
	إنّ إسال البيانات باستخدام POST ليس آمنًا دائمًا، يجب استخدام HTTPS لضمان أمن المعلومات بشكلٍ أكبر.
</p>

<h3>
	‎$_FILES
</h3>

<p>
	مصفوفة ترابطية من العناصر المحمّلة إلى السكربت الحالي بطريقة HTTP POST، بنية هذه المصفوفة مبينة <a href="https://www.php.net/manual/en/features.file-upload.post-method.php" rel="external nofollow">هنا</a>.
</p>

<p>
	لنبدأ مع نموذج أساسي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_26" style="">
<span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"POST"</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"myVar"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Submit"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	لاحظ أنّني تجاهلت خاصيّة <code>action</code> أيضًا (لنفس السبب السابق)، وأضفت <code>enctype="multipart/form-data"‎</code> وهذا ضروري لأيّ نموذج يتعامل مع تحميل الملفات.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_28" style="">
<span class="com">// التأكد من عدم وجود خطأ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"error"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> UPLOAD_ERR_OK</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    $folderLocation </span><span class="pun">=</span><span class="pln"> </span><span class="str">"myFiles"</span><span class="pun">;</span><span class="pln"> 
    </span><span class="com">// مثلًا "path/to/file" مسار منسوب يمكن أن يكون</span><span class="pln">

    </span><span class="com">// إذا لم يوجد المجلد المطلوب أنشئه</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$folderLocation</span><span class="pun">))</span><span class="pln"> mkdir</span><span class="pun">(</span><span class="pln">$folderLocation</span><span class="pun">);</span><span class="pln">

    </span><span class="com">// انقل الملف داخل المجلد</span><span class="pln">
    move_uploaded_file</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"tmp_name"</span><span class="pun">],</span><span class="pln"> </span><span class="str">"$folderLocation/"</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
    basename</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">]));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يُستخدم هذا لتحميل ملف واحد، يوجد الخاصيّة <code>multiple</code> تساعدك في تحميل أكثر من ملف.
</p>

<p>
	إليك مثال لإرسال نموذج بعدة ملفات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_30" style="">
<span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"POST"</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"myVar[]"</span><span class="pln"> </span><span class="atn">multiple</span><span class="pun">=</span><span class="atv">"multiple"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Submit"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	لاحظ أنّ التغييرات قليلة جدًا:
</p>

<ul>
<li>
		خاصيّة <code>name</code> للحقل <code>input</code> لها أقواس معقوفة <code>[]</code>. ذلك لأنّه نريد إخبار النموذج أنّه لدينا مصفوفة ملفات مُختارة لإرسالها وتجاهل هذه الأقواس سيؤدي لإرسال الملف الأخير فقط إلى <code>‎$_FILES["myVar"]‎</code>.
	</li>
	<li>
		الخاصيّة <code>multiple="multiple"‎</code>، تُخبر المتصفح أنّه يمكن للمستخدم اختيار أكثر من ملف.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_32" style="">
<span class="com">// حساب عدد الملفات المُرسلة</span><span class="pln">
$total </span><span class="pun">=</span><span class="pln"> isset</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">])</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">])</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="com">// تكرار لكل ملف من الملفات</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> $total</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// إذا لم يوجد خطأ</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"error"</span><span class="pun">][</span><span class="pln">$i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> UPLOAD_ERR_OK</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// مثلًا "path/to/file" مسار منسوب يمكن أن يكون</span><span class="pln">
        $folderLocation </span><span class="pun">=</span><span class="pln"> </span><span class="str">"myFiles"</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// إذا لم يوجد المجلد أنشئه</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$folderLocation</span><span class="pun">))</span><span class="pln"> mkdir</span><span class="pun">(</span><span class="pln">$folderLocation</span><span class="pun">);</span><span class="pln">

        </span><span class="com">// انقل الملف إلى المجلد</span><span class="pln">
        move_uploaded_file</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"tmp_name"</span><span class="pun">][</span><span class="pln">$i</span><span class="pun">],</span><span class="pln"> </span><span class="str">"$folderLocation/"</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
basename</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">][</span><span class="pln">$i</span><span class="pun">]));</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// وإلّا أخبر عن الخطأ</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">][</span><span class="str">"error"</span><span class="pun">][</span><span class="pln">$i</span><span class="pun">])</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_INI_SIZE</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_FORM_SIZE</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_PARTIAL</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 3; The uploaded file was only partially uploaded."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_NO_FILE</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 4; No file was uploaded."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_NO_TMP_DIR</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 6; Missing a temporary folder. Introduced in PHP 5.0.3."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_CANT_WRITE</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> UPLOAD_ERR_EXTENSION</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"Value: 8; A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
            echo </span><span class="str">"An unknown error has occurred."</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذا مثال بسيط جدًا ولا يعالج مشاكل مثل امتدادات الملفات الغير مسموح بها أو الملفات المسمّاة بأسماء شيفرة PHP (مثل ما يعادل حقن SQL في PHP).
</p>

<p>
	الخطوة الأولى هي التأكد من وجود ملفات وإذا وجدت أسند عددهم للمتغير <code>‎$total</code>. ثم نستخدم الحلقة for للمرور على عناصر المصفوفة <code>‎$_FILES</code> الواحد تلو الآخر، عند كل ملف إذا لم يواجه مشاكل عندها تكون نتيجة الشرط if هي true ويُحمّل الملف، أما إذا وجدت مشكلة ما تُنفّذ الكتلة switch ويتم إخبارنا بالخطأ الحاصل الذي أوقف عملية تحميل هذا الملف.
</p>

<h3>
	‎$_COOKIE
</h3>

<p>
	مصفوفة ترابطية من المتغيرات الممررة للسكربت الحالي باستخدام ملفات تعريف ارتباط HTTP (‏HTTP Cookies‏‏‏)‏.
</p>

<p>
	ملفات تعريف الارتباط هي متغيرات تحوي بيانات وتخزّن في حاسوب العميل، وعلى عكس المتغيرات ذات النطاق العام العالي فإنّه يجب إنشاؤها مع وظيفة (وليس إسناد قيمة لها)، إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_34" style="">
<span class="pln">setcookie</span><span class="pun">(</span><span class="str">"myVar"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"myVal"</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3600</span><span class="pun">);</span></pre>

<p>
	في المثال السابق حُدِّد اسم ملف تعريف الارتباط ("myVar")، وإعطاء قيمة له ("myVal")، ويمكن تمرير متغير لإسناد قيمته لملف تعريف الارتباط، ثم وقت انتهاء الصلاحية (في مثالنا هو ساعة بما أنّ 3600 ثانية تعادل ساعة).
</p>

<p>
	يمكن الوصول إلى ملف تعريف الارتباط بنفس الطرق السابقة بالرغم من أنّ طريقة إنشائه مختلفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_36" style="">
<span class="pln">echo $_COOKIE</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">];</span><span class="pln"> </span><span class="com">// "myVal"</span></pre>

<p>
	لتدمير ملف تعريف الارتباط يجب إعادة استدعاء الدالة <code>setcookie</code> لكن تُعطى قيمة وقت انتهاء الصلاحية أي وقت ماضٍ. كما في المثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_38" style="">
<span class="pln">setcookie</span><span class="pun">(</span><span class="str">"myVar"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// null</span></pre>

<p>
	سيلغي هذا تعيين ملف الارتباط ويزيله من حاسوب العميل.
</p>

<h3>
	‎$_SESSION
</h3>

<p>
	مصفوفة ترابطية تحوي متغيرات الجلسة المتاحة للسكربت الحالي، يمكنك الاطلاع على توثيق <a href="https://wiki.hsoub.com/%D8%AA%D8%B5%D9%86%D9%8A%D9%81:PHP_Session" rel="external">دوال الجلسات</a> لمزيدٍ من المعلومات.
</p>

<p>
	تشبه الجلسات ملفات تعريف الارتباط إلى حد كبير باستثناء أنّها من جانب الخادم.
</p>

<p>
	يجب استدعاء الدالة <code>session_start()‎</code> في بداية السكربت للسماح باستخدام الجلسات، وتعيين متغير الجلسة مثل تعيين أي متغير آخر، لاحظ المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_40" style="">
<span class="pln">$_SESSION</span><span class="pun">[</span><span class="str">"myVar"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"myVal"</span><span class="pun">;</span></pre>

<p>
	يُعيَّن في بداية الجلسة معرّف عشوائي (random ID) في ملف تعريف ارتباط يسمّى "PHPSESSID" سيحتوي معرّف الجلسة الحالية، ويمكن الوصول له باستدعاء الدالة <code>session_id()‎</code>.
</p>

<p>
	يمكن تدمير متغيرات الجلسة باستدعاء الدالة <code>unset</code>، مثل (unset($_SESSION["myVar"]‎) سيدمر هذا المتغير.
</p>

<p>
	الحل البديل هو استدعاء الدالة <code>session_destory()‎</code>، سيدمر هذا كامل الجلسة أي لن يبقى لدينا أيّ من متغيراتها.
</p>

<h3>
	‎$_REQUEST
</h3>

<p>
	مصفوفة ترابطية تحوي افتراضيًا محتويات المصفوفات ‎ $<em>GET و‎$</em>POST و‎$_COOKIE.
</p>

<p>
	بما أنّه من الممكن أن تحوي هذه المصفوفات الثلاثة على فهرس بنفس الاسم فإنّه يوجد إعداد في ملف <code>php.ini</code> يسمى <code>request_order</code> يحدد الأولوية لهذه المصفوفات، مثلًا إذا ضُبط للقيمة <code>"GPC"</code> عندها ستُستخدم قيمة <code>‎$_COOKIE</code>، فقراءتها من اليسار لليمين تعني أنّ <code>‎$_REQUEST</code> ستضبط قيمتها ل<code>‎$_GET</code> ثم <code>‎$_POST</code> ثم <code>‎$_COOKIE</code> وبما أنّ <code>‎$_COOKIE</code> هي الأخيرة فهي القيمة الموجودة في <code>‎$_REQUEST</code>.
</p>

<h3>
	‎$_ENV
</h3>

<p>
	مصفوفة ترابطية من المتغيرات الممررة إلى السكربت الحالي عن طريق البيئة.
</p>

<p>
	تُستورد هذه المتغيرات إلى مجال الأسماء العام في PHP من البيئة التي يُنفَّذ فيها محلل PHP. وتزوَّد العديد منها من الصدفة التي تُنفَّذ فيها PHP إذ أنّ الأنظمة المختلفة تشغّل أنواع مختلفة من الصدف ومن الصعب حصرها في قائمة محددة، يمكنك الاطلاع على توثيق صدفتك لتشاهد قائمة من متغيرات البيئة المعرّفة.
</p>

<p>
	تتضمن متغيرات البيئة الأخرى متغيرات CGI، بغض النظر إن كانت PHP تُنفّذ كوحدة خادم أو معالج CGI.
</p>

<p>
	كل ما يُخزّن ضمن <code>‎$_ENV</code> يأتي من البيئة التي تُنفّذ فيها PHP، وتُملأ فقط إذا سُمح بها ضمن الملف <code>php.ini</code>.
</p>

<h2>
	3.2: متغيرات النطاق العام العالي في PHP5
</h2>

<p>
	هذه المتغيرات هي:
</p>

<ul>
<li>
		<code>‎$GLOBALS</code>
	</li>
	<li>
		<code>‎$_REQUEST</code>
	</li>
	<li>
		<code>‎$_GET</code>
	</li>
	<li>
		<code>‎$_POST</code>
	</li>
	<li>
		<code>‎$_FILES</code>
	</li>
	<li>
		<code>‎$_SERVER</code>
	</li>
	<li>
		<code>‎$_ENV</code>
	</li>
	<li>
		<code>‎$_COOKIE</code>
	</li>
	<li>
		<code>‎$_SESSION</code>
	</li>
</ul>
<h3>
	‎$GLOBALS
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي للوصول إلى المتغيرات العامة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_42" style="">
<span class="pun">&lt;?</span><span class="pln">php
$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(){</span><span class="pln">
    echo $GLOBALS</span><span class="pun">[</span><span class="str">'a'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// وهي 10 a سيطبع هذا قيمة المتغير العام</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<h3>
	‎$_REQUEST
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي لجمع البيانات المرسلة من نموذج HTML.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_44" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_REQUEST</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">])){</span><span class="pln">
    echo $_REQUEST</span><span class="pun">[</span><span class="str">'user'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// POST و/أو GET والمُرسل بطريقة `name = user` الذي لديه الخاصية HTML ستُطبع قيمة حقل</span></pre>

<h3>
	‎$_GET
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي لجمع البيانات المرسلة من نموذج HTML بالطريقة GET.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_46" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_GET</span><span class="pun">[</span><span class="str">'username'</span><span class="pun">])){</span><span class="pln">
    echo $_GET</span><span class="pun">[</span><span class="str">'username'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// (1)</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	في الموضع (1) ستُطبع قيمة حقل HTML الذي له الخاصية <code>name = username</code> والمُرسل بطريقة GET.
</p>

<h3>
	‎$_POST
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي لجمع البيانات المرسلة من نموذج HTML بالطريقة POST.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_48" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="str">'username'</span><span class="pun">])){</span><span class="pln">
    echo $_POST</span><span class="pun">[</span><span class="str">'username'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// (1)</span></pre>

<p>
	في الموضع (1) ستُطبع قيمة حقل HTML الذي له الخاصية <code>name = username</code> والمُرسل بطريقة POST.
</p>

<h3>
	‎$_FILES
</h3>

<p>
	يحمل هذا المتغير ذو النطاق العام العالي معلومات الملفات المحمّلة عبر HTTP بالطريقة POST.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_50" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">'picture'</span><span class="pun">]){</span><span class="pln">
    echo </span><span class="str">"&lt;pre&gt;"</span><span class="pun">;</span><span class="pln">
    print_r</span><span class="pun">(</span><span class="pln">$_FILES</span><span class="pun">[</span><span class="str">'picture'</span><span class="pun">]);</span><span class="pln">
    echo </span><span class="str">"&lt;/pre&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p>
	ستطبع الشيفرة السابقة تفاصيل الملف مع اسم الصورة المحمّلة عبر النموذج الذي له الخاصيّات <code>method="post"‎</code> و<code>enctype="multipart/form-data"‎</code> تتضمن التفاصيل اسم الملف، نوع الملف، موقع الملف المؤقت وشيفرة الخطأ (في حال حصل أي خطأ أثناء تحميل الملف) وحجم الملف بالبايتات، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_52" style="">
<span class="typ">Array</span><span class="pln">
</span><span class="pun">(</span><span class="pln">
    </span><span class="pun">[</span><span class="pln">picture</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
        </span><span class="pun">(</span><span class="pln">
            </span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Array</span><span class="pln">
                </span><span class="pun">(</span><span class="pln">
                    </span><span class="pun">[</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">400.png</span><span class="pln">
                    </span><span class="pun">[</span><span class="pln">type</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> image</span><span class="pun">/</span><span class="pln">png
                    </span><span class="pun">[</span><span class="pln">tmp_name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">php5Wx0aJ
                    </span><span class="pun">[</span><span class="pln">error</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
                    </span><span class="pun">[</span><span class="pln">size</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">15726</span><span class="pln">
                </span><span class="pun">)</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
</span><span class="pun">)</span></pre>

<h3>
	‎$_SERVER
</h3>

<p>
	يحمل هذا المتغير ذو النطاق العام العالي معلومات حول السكربتات وترويسات HTTP ومسارات الخادم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_54" style="">
<span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"&lt;pre&gt;"</span><span class="pun">;</span><span class="pln">
    print_r</span><span class="pun">(</span><span class="pln">$_SERVER</span><span class="pun">);</span><span class="pln">
    echo </span><span class="str">"&lt;/pre&gt;"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">/** ستطبع هذه الشيفرة التفاصيل التالية على الخادم المحلي
    (XAMPP مثل)

    Array
(
    [MIBDIRS] =&gt; C:/xampp/php/extras/mibs
    [MYSQL_HOME] =&gt; \xampp\mysql\bin
    [OPENSSL_CONF] =&gt; C:/xampp/apache/bin/openssl.cnf
    [PHP_PEAR_SYSCONF_DIR] =&gt; \xampp\php
    [PHPRC] =&gt; \xampp\php
    [TMP] =&gt; \xampp\tmp
    [HTTP_HOST] =&gt; localhost
    [HTTP_CONNECTION] =&gt; keep-alive
    [HTTP_CACHE_CONTROL] =&gt; max-age=0
    [HTTP_UPGRADE_INSECURE_REQUESTS] =&gt; 1
    [HTTP_USER_AGENT] =&gt; Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/52.0.2743.82 Safari/537.36
    [HTTP_ACCEPT] =&gt; text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8
    [HTTP_ACCEPT_ENCODING] =&gt; gzip, deflate, sdch
    [HTTP_ACCEPT_LANGUAGE] =&gt; en-US,en;q=0.8
    [PATH] =&gt; C:\xampp\php;C:\ProgramData\ComposerSetup\bin;
    [SystemRoot] =&gt; C:\Windows
    [COMSPEC] =&gt; C:\Windows\system32\cmd.exe
    [PATHEXT] =&gt; .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] =&gt; C:\Windows
    [SERVER_SIGNATURE] =&gt; Apache/2.4.16 (Win32) OpenSSL/1.0.1p PHP/5.6.12 Server at localhost Port 80
    [SERVER_SOFTWARE] =&gt; Apache/2.4.16 (Win32) OpenSSL/1.0.1p PHP/5.6.12
    [SERVER_NAME] =&gt; localhost
    [SERVER_ADDR] =&gt; ::1
    [SERVER_PORT] =&gt; 80
    [REMOTE_ADDR] =&gt; ::1
    [DOCUMENT_ROOT] =&gt; C:/xampp/htdocs
    [REQUEST_SCHEME] =&gt; http
    [CONTEXT_PREFIX] =&gt;
    [CONTEXT_DOCUMENT_ROOT] =&gt; C:/xampp/htdocs
    [SERVER_ADMIN] =&gt; postmaster@localhost
    [SCRIPT_FILENAME] =&gt; C:/xampp/htdocs/abcd.php
    [REMOTE_PORT] =&gt; 63822
    [GATEWAY_INTERFACE] =&gt; CGI/1.1
    [SERVER_PROTOCOL] =&gt; HTTP/1.1
    [REQUEST_METHOD] =&gt; GET
    [QUERY_STRING] =&gt;
    [REQUEST_URI] =&gt; /abcd.php
    [SCRIPT_NAME] =&gt; /abcd.php
    [PHP_SELF] =&gt; /abcd.php
    [REQUEST_TIME_FLOAT] =&gt; 1469374173.88
    [REQUEST_TIME] =&gt; 1469374173
)
*/</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<h3>
	‎$_ENV
</h3>

<p>
	يحمل هذا المتغير ذو النطاق العام العالي معلومات متغيرات بيئة الصدفة التي تُنفّذ فيها شيفرة PHP.
</p>

<h3>
	‎$_COOKIE
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي لاسترجاع قيمة ملف تعريف الارتباط مع مفتاح مُعطى.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_56" style="">
<span class="pun">&lt;?</span><span class="pln">php
$cookie_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"data"</span><span class="pun">;</span><span class="pln">
$cookie_value </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo Bar"</span><span class="pun">;</span><span class="pln">
setcookie</span><span class="pun">(</span><span class="pln">$cookie_name</span><span class="pun">,</span><span class="pln"> $cookie_value</span><span class="pun">,</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">86400</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">30</span><span class="pun">),</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// 86400 = يوم واحد</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_COOKIE</span><span class="pun">[</span><span class="pln">$cookie_name</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Cookie named '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $cookie_name </span><span class="pun">.</span><span class="pln"> </span><span class="str">"' is not set!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"Cookie '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $cookie_name </span><span class="pun">.</span><span class="pln"> </span><span class="str">"' is set!&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Value is: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $_COOKIE</span><span class="pun">[</span><span class="pln">$cookie_name</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
Cookie 'data' is set!
Value is: Foo Bar
*/</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<h3>
	‎$_SESSION
</h3>

<p>
	يُستخدم هذا المتغير ذو النطاق العام العالي لضبط واسترجاع قيمة الجلسة المخزنة على الخادم.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_3778_58" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// ابدأ الجلسة</span><span class="pln">
session_start</span><span class="pun">();</span><span class="pln">

</span><span class="com">/**
ضبط متغيرات الجلسة التي يمكن الوصول إليها من صفحات مختلفة من الخادم الذي خزنها
*/</span><span class="pln">
$_SESSION</span><span class="pun">[</span><span class="str">"username"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John Doe"</span><span class="pun">;</span><span class="pln">
$_SESSION</span><span class="pun">[</span><span class="str">"user_token"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"d5f1df5b4dfb8b8d5f"</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">"Session is saved successfully"</span><span class="pun">;</span><span class="pln">

</span><span class="com">/**
Session is saved successfully
*/</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	ترجمة -وبتصرف- للفصول [Superglobal Variables PHP] من كتاب <a href="https://goalkicker.com/PHPBook/" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%B7%D8%A8%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%88%D8%B9%D8%B1%D8%B6%D9%87%D8%A7-%D9%81%D9%8A-php-r1042/" rel="">طباعة القيم وعرضها في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%81%D9%8A-php-r1040/" rel="">المتغيرات والثوابت في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1041</guid><pubDate>Fri, 23 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x62B;&#x648;&#x627;&#x628;&#x62A; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%81%D9%8A-php-r1040/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/2.png.8ee003183a58caf1d2fa6372c82998ce.png" /></p>

<h2>
	الوصول الديناميكي إلى المتغير عن طريق الاسم (المتغيرات المتغيرة)
</h2>

<p>
	يمكن الوصول إلى المتغيرات عبر أسماء المتغيرات الديناميكية. يمكن تخزين اسم المتغير في متغير آخر، مما يسمح بالوصول إليه بشكلٍ ديناميكي وتُعرف هذه المتغيرات باسم المتغيرات المتغيرة (variable variables).
</p>

<p>
	لتغيير المتغير إلى متغير قابل للتغيير نضع إشارة $ إضافية أمام المتغير.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_7" style="">
<span class="pln">$variableName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// "bar" فيما يلي كل التعليمات متكافئة وكل الخرج سيكون </span><span class="pln">
echo $foo</span><span class="pun">;</span><span class="pln">
echo $</span><span class="pun">{</span><span class="pln">$variableName</span><span class="pun">};</span><span class="pln">
echo $$variableName</span><span class="pun">;</span><span class="pln">

</span><span class="com">// بشكلٍ مماثل</span><span class="pln">
$variableName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
$$variableName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">;</span><span class="pln">


</span><span class="com">// 'bar' التعليمات التالية ستنتج أيضًا الخرج  </span><span class="pln">
echo $foo</span><span class="pun">;</span><span class="pln">
echo $$variableName</span><span class="pun">;</span><span class="pln">
echo $</span><span class="pun">{</span><span class="pln">$variableName</span><span class="pun">};</span></pre>

<p>
	المتغيرات المتغيرة مفيدة لتحديد استدعاءات الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_9" style="">
<span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$funcName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'add'</span><span class="pun">;</span><span class="pln">

echo $funcName</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// outputs 3</span></pre>

<p>
	سيكون هذا مفيدًا في أصناف (classes) لغة PHP:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_11" style="">
<span class="kwd">class</span><span class="pln"> myClass </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $functionName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'doSomething'</span><span class="pun">;</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">$functionName</span><span class="pun">(</span><span class="str">'Hello World'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo $string</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Outputs "Hello World"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	من الممكن، ولكن ليس من الضروري وضع <code>‎$variableName</code> بين <code>{}</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_15" style="">
<span class="pln">$</span><span class="pun">{</span><span class="pln">$variableName</span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $value</span><span class="pun">;</span></pre>

<p>
	الأمثلة التالية متكافئة والخرج "baz":
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_17" style="">
<span class="pln">$fooBar </span><span class="pun">=</span><span class="pln"> </span><span class="str">'baz'</span><span class="pun">;</span><span class="pln">
$varPrefix </span><span class="pun">=</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">

echo $fooBar</span><span class="pun">;</span><span class="pln"> </span><span class="com">// "baz" الخرج </span><span class="pln">
echo $</span><span class="pun">{</span><span class="pln">$varPrefix </span><span class="pun">.</span><span class="pln"> </span><span class="str">'Bar'</span><span class="pun">};</span><span class="pln"> </span><span class="com">// "baz" الخرج أيضًا </span></pre>

<p>
	استخدام القوسين <code>{}</code> يكون إلزاميًا فقط عندما يكون اسم المتغير في حد ذاته تعبيرًا، مثل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_23" style="">
<span class="pln">$</span><span class="pun">{</span><span class="pln">$variableNamePart1 </span><span class="pun">.</span><span class="pln"> $variableNamePart2</span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $value</span><span class="pun">;</span></pre>

<p>
	ومع ذلك يُنصح دائمًا باستخدام القوسين {}، لأنهما أكثر قابلية للقراءة. على الرغم من أنه لا يوصى بذلك، إلا أنه من الممكن وضع سلسلة لهذا السلوك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_27" style="">
<span class="pln">$$$$$$$$DoNotTryThisAtHomeKids </span><span class="pun">=</span><span class="pln"> $value</span><span class="pun">;</span></pre>

<p>
	من المهم ملاحظة أنّ العديد من المطورين يعدون الاستخدام المفرط للمتغيرات المتغيرة ممارسةً سيئةً، لأنّها غير مناسبة تمامًا للتحليل الثابت من قِبل بيئات التطوير المتكاملة (IDE)، إذ يمكن أن تصبح الشيفرات الأساسية (codebases) الكبيرة مع الكثير من المتغيرات المتغيرة (أو استدعاءات التوابع الديناميكية) صعبة الصيانة.
</p>

<h3>
	الفروقات بين PHP5 وPHP7‎
</h3>

<p>
	السبب الآخر لاستخدام القوسين <code>{}</code> أو <code>()</code> دائمًا هو أنّ PHP5 وPHP7 يختلفان قليلًا في طريقة التعامل مع المتغيرات الديناميكية وقد يؤدي ذلك في بعض الحالات إلى خرجٍ مختلف. ‫ في PHP7، ستُعالج المتغيرات الديناميكية (dynamic variables) والخاصيات (properties) والتوابع (methods) بالترتيب من اليسار إلى اليمين (بما أن الشيفرة تُكتَب من اليسار إلى اليمين) على عكس PHP5 التي تتضمن العديد من الحالات الخاصة، تُظهر الأمثلة أدناه كيف يتغير ترتيب المعالجة
</p>

<h3>
	الحالة 1: <code>‎$$foo['bar']['baz']‎‎</code>
</h3>

<ul>
<li>
		ترجمة PHP5:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_29" style="">
<span class="pln">$</span><span class="pun">{</span><span class="pln">$foo</span><span class="pun">[</span><span class="str">'bar'</span><span class="pun">][</span><span class="str">'baz'</span><span class="pun">]}</span></pre>

<ul>
<li>
		ترجمة PHP7:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_31" style="">
<span class="pun">(</span><span class="pln">$$foo</span><span class="pun">)[</span><span class="str">'bar'</span><span class="pun">][</span><span class="str">'baz'</span><span class="pun">]</span></pre>

<h3>
	الحالة 2: <code>‎$foo-&gt;$bar['baz']‎</code>
</h3>

<ul>
<li>
		ترجمة PHP5:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_33" style="">
<span class="pln">$foo</span><span class="pun">-&gt;{</span><span class="pln">$bar</span><span class="pun">[</span><span class="str">'baz'</span><span class="pun">]}</span></pre>

<ul>
<li>
		ترجمة PHP7:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_35" style="">
<span class="pun">(</span><span class="pln">$foo</span><span class="pun">-&gt;</span><span class="pln">$bar</span><span class="pun">)[</span><span class="str">'baz'</span><span class="pun">]</span></pre>

<h3>
	الحالة 3: <code>‎$foo-&gt;$bar['baz']()‎‎</code>
</h3>

<ul>
<li>
		ترجمة PHP5:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_37" style="">
<span class="pln">$foo</span><span class="pun">-&gt;{</span><span class="pln">$bar</span><span class="pun">[</span><span class="str">'baz'</span><span class="pun">]}()</span></pre>

<ul>
<li>
		ترجمة PHP7:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_39" style="">
<span class="pun">(</span><span class="pln">$foo</span><span class="pun">-&gt;</span><span class="pln">$bar</span><span class="pun">)[</span><span class="str">'baz'</span><span class="pun">]()</span></pre>

<h3>
	الحالة 4: Foo::$bar['baz']()‎
</h3>

<ul>
<li>
		ترجمة PHP5:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_41" style="">
<span class="typ">Foo</span><span class="pun">::{</span><span class="pln">$bar</span><span class="pun">[</span><span class="str">'baz'</span><span class="pun">]}()</span></pre>

<ul>
<li>
		ترجمة PHP7:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_43" style="">
<span class="pun">(</span><span class="typ">Foo</span><span class="pun">::</span><span class="pln">$bar</span><span class="pun">)[</span><span class="str">'baz'</span><span class="pun">]()</span></pre>

<h2>
	أنواع البيانات
</h2>

<p>
	يوجد أنواع مختلفة من البيانات في PHP لتحقيق الأغراض المختلفة، ولا نحتاج إلى تعريف صريح لنوع البيانات المحتواة في المتغير بل تعيّنه اللغة بالاعتماد على نوع القيمة التي أُسنِدت إليه أو على النوع الذي حُوِّل إليه. هذه نظرة عامة مختصرة عن الأنواع، راجع موضوع أنواع PHP للحصول على توثيق وأمثلة مفصلة.
</p>

<p>
	يوجد في PHP أنواع البيانات التالية:
</p>

<ul>
<li>
		null
	</li>
	<li>
		boolean: القيم المنطقية
	</li>
	<li>
		integer: الأعداد الصحيحة
	</li>
	<li>
		float: الأعداد العشرية
	</li>
	<li>
		string: السلاسل النصية
	</li>
	<li>
		object: الكائنات
	</li>
	<li>
		resources: الموارد
	</li>
	<li>
		array: المصفوفات
	</li>
</ul>
<h3>
	NULL
</h3>

<p>
	تُسنَد القيمة المعدومة Null إلى أي متغيّر وتمثل متغيرًا دون قيمة أو عديم القيمة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_45" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span></pre>

<p>
	تُبطل null المتغير وترجع قيمة غير معرّف (undefined) أو void إذا استُدعيَ.
</p>

<h3>
	النوع boolean: القيم المنطقية
</h3>

<p>
	هذا أبسط نوع وله قيمتين ممكنتين فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_47" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span></pre>

<p>
	يمكن أن تُستخدم القيم المنطقية للتحكم بتدفق الشيفرة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_49" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"true"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"false"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	النوع integer: الأعداد الصحيحة
</h3>

<p>
	العدد الصحيح هو عدد سالب أو موجب، يمكن استخدامه مع أيّ أساس عددي ويختلف حجمه حسب المنصة. لا تدعم PHP الأعداد الصحيحة دون إشارة (unsigned).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_51" style="">
<span class="com">// عدد صحيح سالب</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// (‎كقيمة منطقية) false أو null الصفر يمكن أن يكون</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// عدد عشري موجب </span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// ‏عدد بالنظام الثماني = 83 بالنظام العشري</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0123</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// ‏عدد بالنظام الست عشري = 171 بالنظام العشري</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0xAB</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// عدد بالنظام الثنائي = 10 بالنظام العشري</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0b1010</span><span class="pun">;</span><span class="pln"> 

var_dump</span><span class="pun">(</span><span class="lit">0123</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xAB</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0b1010</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// int(83), int(171), int(10) </span></pre>

<h3>
	النوع float: الأعداد العشرية
</h3>

<p>
	الأعداد ذات الفاصلة العشرية التي تتمثل بالنوعين: "doubles" وهو عدد عشري مضاعف الدقة أو "floats" وهو عدد عشري عادي (دقة افتراضية).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_53" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.23</span><span class="pun">;</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10.0</span><span class="pun">;</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="pln">INF</span><span class="pun">;</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> NAN</span><span class="pun">;</span></pre>

<h3>
	النوع array: المصفوفات
</h3>

<p>
	تشبه المصفوفة لائحة قيم، وأبسط صيغة لها هي المصفوفة المُفهرسة (indexed) بأعداد صحيحة ومرتبة حسب الفهرس مع ارتباط العنصر الأول بالفهرس 0.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_55" style="">
<span class="com">// مصفوفة من الأعداد الصحيحة</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">

</span><span class="com">// وما بعدها PHP5.4 صياغة مختصرة للمصفوفة في</span><span class="pln">
</span><span class="pun">‎</span><span class="pln">$bar </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"A"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln"> </span><span class="pun">‎</span><span class="pln">

echo $bar</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "A" </span><span class="pln">

echo $bar</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// true </span><span class="pln">

echo $bar</span><span class="pun">[</span><span class="lit">123</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// 5 </span><span class="pln">

echo $bar</span><span class="pun">[</span><span class="lit">1234</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// null </span></pre>

<p>
	يمكن أيضًا أن يكون المفتاح مختلفًا عن العدد الصحيح، في PHP كل المصفوفات خلف الكواليس هي مصفوفات ترابطية (associative) لكن عندما نذكر "مصفوفة ترابطية" (associative arrays) بشكلٍ صريح فإننا نعني أنّ أغلب المفاتيح ليست أعدادًا صحيحةً.
</p>

<p>
	<strong>ملاحظة</strong>: خصصت بعض لغات البرمجة أنواعًا خاصة بالمصفوفة الترابطية مثل Object أو Dictionary أو Map.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_57" style="">
<span class="pln">$array </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"foo"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="str">"baz"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"quux"</span><span class="pun">;</span><span class="pln">
$array</span><span class="pun">[</span><span class="lit">42</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"hello"</span><span class="pun">;</span><span class="pln">

echo $array</span><span class="pun">[</span><span class="str">"foo"</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "bar" الخرج</span><span class="pln">

echo $array</span><span class="pun">[</span><span class="str">"bar"</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "quux" الخرج</span><span class="pln">

echo $array</span><span class="pun">[</span><span class="lit">42</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// "hello" الخرج</span></pre>

<h3>
	النوع string: السلاسل النصية
</h3>

<p>
	تشبه السلسلة النصية مصفوفة محارف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_59" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">;</span></pre>

<p>
	يمكن فهرسة السلسلة النصية لتُرجع محارفها الإفرادية تمامًا مثل المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_61" style="">
<span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">;</span><span class="pln">

echo $foo</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> 
</span><span class="com">// الحرف الأول من السلسلة النصية 'b'‎ يطبع</span></pre>

<h3>
	النوع object: الكائنات
</h3>

<p>
	الكائن هو نسخة من الصنف، يمكن الوصول إلى متغيراته وتوابعه بالعامل <code>‎-&gt;‎</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_63" style="">
<span class="com">// المعرّف مسبقًا صنف فارغ stdClass إنشاء كائن جديد من الصنف</span><span class="pln">
$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">();</span><span class="pln"> 
$foo</span><span class="pun">-&gt;</span><span class="pln">bar </span><span class="pun">=</span><span class="pln"> </span><span class="str">"baz"</span><span class="pun">;</span><span class="pln">

echo $foo</span><span class="pun">-&gt;</span><span class="pln">bar</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// "baz" الخرج</span><span class="pln">

</span><span class="com">// أو يمكننا تحويل المصفوفة إلى كائن</span><span class="pln">
$quux </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">object</span><span class="pun">)</span><span class="pln"> </span><span class="pun">[</span><span class="str">"foo"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">];</span><span class="pln">

echo $quux</span><span class="pun">-&gt;</span><span class="pln">foo</span><span class="pun">;</span><span class="pln"> </span><span class="com">// "bar" الخرج</span></pre>

<h3>
	النوع resources: الموارد
</h3>

<p>
	تحمل الموارد مقابض (handles) لفتح الملفات، اتصالات قاعدة البيانات، مجاري الدخل والخرج، مناطق الصورة وما يشبه ذلك (كما ذُكر في <a href="https://www.php.net/manual/en/language.types.resource.php#language.types.resource.casting" rel="external nofollow">المرجع</a>).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_65" style="">
<span class="com">//الدالة التي تفتح ملفًا على القرص على أنّه مورد fopen()</span><span class="pln">
$fp </span><span class="pun">=</span><span class="pln"> fopen</span><span class="pun">(</span><span class="str">'file.ext'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'r'</span><span class="pun">);</span><span class="pln"> 

var_dump</span><span class="pun">(</span><span class="pln">$fp</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// resource(2) of type (stream) </span></pre>

<p>
	نستخدم الدالة <code>gettype()‎</code> للحصول على نوع المتغير على شكل سلسلة نصية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_67" style="">
<span class="pln">echo gettype</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// "integer" الخرج</span><span class="pln">

echo gettype</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
 </span><span class="com">// "boolean"</span></pre>

<h2>
	التلميح عن النوع
</h2>

<h3>
	ميزة التلميح عن نوع الأصناف والواجهات
</h3>

<p>
	أُضيفت ميزة التلميح عن نوع (Type hinting) الأصناف والواجهات في الإصدار PHP 5.
</p>

<p>
	<strong>التلميح عن نوع الصنف</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_69" style="">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Chris'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">School</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'University of Edinburgh'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> enroll</span><span class="pun">(</span><span class="typ">Student</span><span class="pln"> $student</span><span class="pun">,</span><span class="pln"> </span><span class="typ">School</span><span class="pln"> $school</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    echo $student</span><span class="pun">-&gt;</span><span class="pln">name </span><span class="pun">.</span><span class="pln"> </span><span class="str">' is being enrolled at '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $school</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$student </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pun">();</span><span class="pln">
$school </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">School</span><span class="pun">();</span><span class="pln">
enroll</span><span class="pun">(</span><span class="pln">$student</span><span class="pun">,</span><span class="pln"> $school</span><span class="pun">);</span></pre>

<p>
	خرج السكربت السابق:
</p>

<pre class="ipsCode">
Chris is being enrolled at University of Edinburgh
</pre>

<p>
	<strong>التلميح عن نوع الواجهة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_72" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Enrollable</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Attendable</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Chris</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Enrollable</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Chris'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">UniversityOfEdinburgh</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Attendable</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'University of Edinburgh'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> enroll</span><span class="pun">(</span><span class="typ">Enrollable</span><span class="pln"> $enrollee</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Attendable</span><span class="pln"> $premises</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    echo $enrollee</span><span class="pun">-&gt;</span><span class="pln">name </span><span class="pun">.</span><span class="pln"> </span><span class="str">' is being enrolled at '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $premises</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$chris </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Chris</span><span class="pun">();</span><span class="pln">
$edinburgh </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">UniversityOfEdinburgh</span><span class="pun">();</span><span class="pln">
enroll</span><span class="pun">(</span><span class="pln">$chris</span><span class="pun">,</span><span class="pln"> $edinburgh</span><span class="pun">);</span></pre>

<p>
	خرج الشيفرة السابقة هو نفس خرج المثال الأول:
</p>

<pre class="ipsCode">
Chris is being enrolled at University of Edinburgh
</pre>

<p>
	<strong>التلميح باستخدام الكلمة المفتاحية self</strong>
</p>

<p>
	يمكن استخدام الكلمة المفتاحية <code>self</code> كتلميح عن النوع للإشارة إلى أنّ القيمة يجب أن تكون نسخة من الصنف الذي يصرّح عن التابع.
</p>

<h3>
	التلميح عن النوع للأنواع العددية والمصفوفات والأنواع القابلة للاستدعاء
</h3>

<p>
	أُضيفَ دعم التلميح عن نوع معاملات المصفوفة في الإصدار PHP 5.1 (والقيم المعادة بعد الإصدار PHP 7.1) باستخدام الكلمة المفتاحية <code>array</code>، تعدّ أيّة مصفوفة مهما كان نوعها وأبعادها وحتى المصفوفات الصفرية قيمةً صحيحةً.
</p>

<p>
	أُضيف دعم التلميح عن النوع القابل للاستدعاء (callable) في الإصدار PHP 5.4، وتعدّ أي قيمة قابلة للاستدعاء صحيحةً للمعاملات والقيم المعادة الملمّح عنها أنّها قابلة للاستدعاء، مثل كائنات المُغلِّف والسلاسل النصية التي تعبّر عن اسم الدالة والمصفوفة <code>‎array(class_name|object,method_name)‎</code>.
</p>

<p>
	إذا حدث خطأ كتابي في اسم الدالة وأصبحت غير قابلة للاستدعاء تظهر رسالة خطأ أقل وضوحًا:
</p>

<pre class="ipsCode">
Fatal error: Uncaught TypeError: Argument 1 passed to foo() must be of the type callable, string/array given
</pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_74" style="">
<span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">callable $c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
foo</span><span class="pun">(</span><span class="str">"count"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
foo</span><span class="pun">(</span><span class="str">"Phar::running"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
foo</span><span class="pun">([</span><span class="str">"Phar"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"running"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
foo</span><span class="pun">([</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ReflectionClass</span><span class="pun">(</span><span class="str">"stdClass"</span><span class="pun">),</span><span class="pln"> </span><span class="str">"getName"</span><span class="pun">]);</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
foo</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{});</span><span class="pln">

foo</span><span class="pun">(</span><span class="str">"no_such_function"</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// callable expected, string given</span></pre>

<p>
	يمكن أيضًا تمرير التوابع غير الساكنة على أنّها قابلة للاستدعاء بصيغة ثابتة مما يؤدي إلى ظهور تحذير مُهمَل وخطأ من المستوى <code>E_STRICT</code> في كل من PHP 7 وPHP 5 على الترتيب.
</p>

<p>
	يجب أن ننتبه أيضًا إلى مرئية التابع، إذا كان سياق التابع مع المعامل القابل للاستدعاء لا يمكنهما الوصول إلى المعامل القابل للاستدعاء سينتهي الأمر كما لو أنّ التابع غير موجود.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_76" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> f</span><span class="pun">(){</span><span class="pln">
        echo </span><span class="str">"Good"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_EOL</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> r</span><span class="pun">(</span><span class="pln">callable $c</span><span class="pun">){</span><span class="pln">
        $c</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> r</span><span class="pun">(</span><span class="pln">callable $c</span><span class="pun">){}</span><span class="pln">

</span><span class="typ">Foo</span><span class="pun">::</span><span class="pln">r</span><span class="pun">([</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"f"</span><span class="pun">]);</span><span class="pln">

r</span><span class="pun">([</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"f"</span><span class="pun">]);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode">
Fatal error: Uncaught TypeError: Argument 1 passed to r() must be callable, array given
</pre>

<p>
	أُضيف دعم التلميح عن الأنواع العددية في PHP 7، أي حصلنا على دعم التلميح عن <code>booleans</code> (القيم المنطقية) و<code>integers</code> (الأعداد الصحيحة) و<code>floats</code> (الأعداد العشرية) و<code>strings</code> (السلاسل النصية).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_78" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">add</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// "int(3)"</span></pre>

<p>
	تحاول PHP بشكلٍ افتراضي تحويل أي وسيط مُعطى ليطابق تلميحه عن النوع، إذا غيّرنا الاستدعاء للشيفرة <code>add(1.5, 2)‎</code> سنحصل على نفس الخرج تمامًا لأن PHP تحول العدد العشري <code>1.5</code> إلى عدد صحيح، لنوقف هذا السلوك نضيف الشيفرة التالية <code>declare(strict_types=1);‎</code> في بداية كل ملف PHP مصدري يتطلب ذلك، مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_80" style="">
<span class="pun">&lt;?</span><span class="pln">php
declare</span><span class="pun">(</span><span class="pln">strict_types</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> add</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">add</span><span class="pun">(</span><span class="lit">1.5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">));</span></pre>

<p>
	تنتج الشيفرة السابقة خطأً فادحًا:
</p>

<pre class="ipsCode">
Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given
</pre>

<p>
	<strong>استثناء: أنواع خاصة</strong>
</p>

<p>
	قد تعيد بعض دوال PHP قيمة من النوع <code>resource</code>، وبما أنّ هذه ليست قيمة عددية إنّما نوع خاص فمن غير الممكن التلميح عن نوعها، فمثلًا تعيد كل من الدالتين <code>curl_init()‎</code> و<code>fopen()‎</code> موردًا وهذين الموردين غير متوافقين بالطبع لذا ترمي PHP 7 خطأ من الصنف <code>TypeError</code> عند كتابة تلميح عن النوع مورد بشكلٍ صريح:
</p>

<pre class="ipsCode">
TypeError: Argument 1 passed to sample() must be an instance of resource, resource given
</pre>

<h3>
	التلميح عن النوع Nullable
</h3>

<p>
	<strong>المعاملات</strong>
</p>

<p>
	أُضيف التلميح عن النوع <code>Nullable</code> في الإصدار PHP 7.1 باستخدام العامل <code>?</code> قبل التلميح عن النوع.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_83" style="">
<span class="kwd">function</span><span class="pln"> f</span><span class="pun">(?</span><span class="kwd">string</span><span class="pln"> $a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> g</span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
f</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln"> 

g</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// TypeError: Argument 1 passed to g() must be of the type string, null given</span></pre>

<p>
	قبل الإصدار PHP 7.1 إذا كان للمعامل تصريح عن النوع يجب أن يصرّح عن قيمة افتراضية <code>null</code> لقبول هذه القيمة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_85" style="">
<span class="kwd">function</span><span class="pln"> f</span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $a </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> g</span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> $a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
f</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln">

g</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// TypeError: Argument 1 passed to g() must be of the type string, null given</span></pre>

<p>
	<strong>القيم المعادة</strong>
</p>

<p>
	في الإصدار PHP 7.0 لا يمكن للدوال مع قيمة معادة أن تعيد قيمة فارغة <code>null</code>، وبدءًا من الإصدار PHP 7.1 يمكن للدوال التصريح عن تلميح نوع القيمة المعادة أنّها <code>nullable</code> وعندها يجب أن تعيد الدالة قيمة فارغة <code>null</code> وليس <code>void</code> (أي من غير الممكن عدم كتابة تعليمة <code>return</code> أو كتابتها فارغة).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_87" style="">
<span class="kwd">function</span><span class="pln"> f</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">?</span><span class="kwd">string</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> g</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">?</span><span class="kwd">string</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> h</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">?</span><span class="kwd">string</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// شيفرة صحيحة</span><span class="pln">
f</span><span class="pun">();</span><span class="pln"> 

g</span><span class="pun">();</span><span class="pln"> 
</span><span class="com">// TypeError: Return value of g() must be of the type string or null, none returned</span><span class="pln">

h</span><span class="pun">();</span><span class="pln"> 
</span><span class="com">// TypeError: Return value of h() must be of the type string or null, none returned</span></pre>

<h3>
	التصريح عن نوع الكائنات العامة
</h3>

<p>
	بما أنّ كائنات PHP لا ترث من أي صنف أساسي (بما في ذلك الصنف <code>stdClass</code>) فلا يوجد دعم للتصريح عن نوع الكائنات العامة، مثلًا الشيفرة التالية غير صحيحة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_89" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="kwd">object</span><span class="pln"> $obj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $obj</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassOne</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassTwo</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

$classOne</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassOne</span><span class="pun">();</span><span class="pln">
$classTwo</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassTwo</span><span class="pun">();</span><span class="pln">

doSomething</span><span class="pun">(</span><span class="pln">$classOne</span><span class="pun">);</span><span class="pln">
doSomething</span><span class="pun">(</span><span class="pln">$classTwo</span><span class="pun">);</span></pre>

<p>
	وسترمي الخطأ الفادح:
</p>

<pre class="ipsCode">
Fatal error: Uncaught TypeError: Argument 1 passed to doSomething() must be an instance of object, instance of OperationOne given
</pre>

<p>
	الحل البديل لذلك هو التصريح عن واجهة لا تعرّف أي توابع ثم نجعل كل الكائنات تنفّذ هذه الواجهة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_91" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">interface</span><span class="pln"> </span><span class="typ">Object</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">(</span><span class="typ">Object</span><span class="pln"> $obj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $obj</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassOne</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Object</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassTwo</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">Object</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

$classOne </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassOne</span><span class="pun">();</span><span class="pln">
$classTwo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassTwo</span><span class="pun">();</span><span class="pln">

doSomething</span><span class="pun">(</span><span class="pln">$classOne</span><span class="pun">);</span><span class="pln">
doSomething</span><span class="pun">(</span><span class="pln">$classTwo</span><span class="pun">);</span></pre>

<h3>
	التصريح عن نوع دون قيمة معادة (Void)
</h3>

<p>
	أُضيف نوع القيمة المعادة <code>void</code> في الإصدار PHP 7.1، على الرغم من أنّ PHP ليس فيها قيمة <code>void</code> فعلية إلا أنّه من المعروف عمومًا في عالم البرمجة أنّ الدالة التي لا تعيد شيئًا فإنّ القيمة المعادة هي <code>void</code>. يجب ألّا نخلط بين القيمة المعادة <code>void</code> والقيمة المعادة الفارغة <code>null</code> إذ أنّ القيمة <code>null</code> هي قيمة يمكن إعادتها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_93" style="">
<span class="kwd">function</span><span class="pln"> lacks_return</span><span class="pun">():</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// شيفرة صحيحة</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّه إذا صرّحت عن القيمة المعادة أنّها <code>void</code> لا يمكنك أن تعيد أي قيم وإلا ستحصل على خطأ فادح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_95" style="">
<span class="kwd">function</span><span class="pln"> should_return_nothing</span><span class="pun">():</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// Fatal error: A void function must not return a value</span></pre>

<p>
	إلا أنّه يمكن استخدام <code>return</code> للخروج من الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_97" style="">
<span class="kwd">function</span><span class="pln"> returns_nothing</span><span class="pun">():</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// شيفرة صحيحة</span><span class="pln">
    </span><span class="kwd">return</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<h2>
	تحويل الأنواع ومشاكل الموازنة غير الصارمة
</h2>

<h3>
	ما هو تحويل النوع (Type Juggling)؟
</h3>

<p>
	تعدّ PHP لغة متهاونة في تحديد النوع (loosely typed) أي أنّها لا تتطلب أن يكون المعامَلات (operands) في تعبير ما من نفس النوع (أو من أنواع متوافقة)، فمثلًا يمكنك أن تتوقع أنّ إضافة رقم إلى سلسلة نصية ستعمل بشكلٍ صحيح.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_99" style="">
<span class="pln">var_dump </span><span class="pun">(</span><span class="str">"This is example number "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	الخرج:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_101" style="">
<span class="kwd">string</span><span class="pun">(</span><span class="lit">24</span><span class="pun">)</span><span class="pln"> </span><span class="str">"This is example number 1"</span></pre>

<p>
	تحقق PHP هذا عن طريق التحويل بين أنواع المتغيرات غير المتوافقة بشكلٍ تلقائي مما يسمح بإجراء العملية المطلوبة، ستحوّل PHP في مثالنا السابق العدد 1 إلى سلسلة نصية وتصبح قابلة للدمج مع السلسلة النصية التي تسبقها، هذا ما يسمى التحويل بين الأنواع (type juggling) وهذه ميزة قوية جدًا في PHP لكنها في نفس الوقت يمكن أن تؤدي إلى الكثير من الحيرة إذا لم تنتبه لها ومن الممكن أن تؤدي إلى مشاكل في الحماية أيضًا.
</p>

<p>
	بفرض لدينا الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_103" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> $variable</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// القيام بشيء ما</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يبدو أنّ المبرمج يقصد من الشيفرة السابقة التأكّد من أنّ قيمة المتغير هي 1،لكن ما الذي يحدث إذا كانت قيمته "1‎ and a half"، قد يفاجئك الجواب:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_105" style="">
<span class="pln">$variable </span><span class="pun">=</span><span class="pln"> </span><span class="str">"1 and a half"</span><span class="pun">;</span><span class="pln">
var_dump </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> $variable</span><span class="pun">);</span></pre>

<p>
	النتيجة هي:
</p>

<pre class="ipsCode">
bool(true)
</pre>

<p>
	يحدث هذا لأنّ PHP تدرك أنّ السلسلة النصية "1‎ and a half" ليست عددًا صحيحًا، لكنها تحتاج للموازنة مع العدد الصحيح 1، فتقوم بمحاولة تحويل المتغير إلى عدد صحيح، وذلك بأخذ كل المحارف في بداية السلسلة النصية التي يمكن تحويلها إلى عدد صحيح وتحوّلها ثم تتوقف عندما تواجه محرفًا لا يمكنها التعامل معه كرقم، لذا ستُحوَّل "1‎ and a half" إلى 1.
</p>

<p>
	يوضّح لنا المثال السابق هذه القضية، ستغطي الأمثلة القليلة التالية بعض الحالات التي قد يؤدي تحويل النوع فيها إلى أخطاء في التطبيقات الحقيقية.
</p>

<h3>
	القراءة من ملف
</h3>

<p>
	نحتاج عند القراءة من ملف أن نكون قادرين على معرفة متى نصل إلى نهايته، يمكننا استخدام الدالة <code>fgets()‎</code> كشرط في حلقة إذ أنّها تُرجع القيمة <code>false</code> عند نهاية الملف، لكن ذلك قد يسبب قطع الحلقة في وقت سابق لأوانه إذا كانت البيانات المُرجعَة من القراءة الأخيرة تُقيَّم على أنّها القيمة المنطقية <code>false</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_108" style="">
<span class="pln">$handle </span><span class="pun">=</span><span class="pln"> fopen </span><span class="pun">(</span><span class="str">"/path/to/my/file"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"r"</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$handle </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln"> </span><span class="pun">(</span><span class="str">"Failed to open file for reading"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$data </span><span class="pun">=</span><span class="pln"> fgets</span><span class="pun">(</span><span class="pln">$handle</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="pun">(</span><span class="str">"Current file line is $data\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

fclose </span><span class="pun">(</span><span class="pln">$handle</span><span class="pun">);</span></pre>

<p>
	إذا كان الملف المقروء يحتوي سطرًا فارغًا فإنّ حلقة <code>while</code> ستنتهي عند تلك النقطة لأنَّ السلسلة النصية الفارغة تُقيَّم على أنّها القيمة المنطقية <code>false</code>.
</p>

<p>
	يمكننا بدلًا من ذلك التحقق من القيمة المنطقية <code>false</code> بشكلٍ صريح باستخدام عامل المساواة الصارمة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_110" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">$data </span><span class="pun">=</span><span class="pln"> fgets</span><span class="pun">(</span><span class="pln">$handle</span><span class="pun">))</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="pun">(</span><span class="str">"Current file line is $data\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ هذا المثال نظري أما في التطبيقات العملية نستخدم الحلقة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_112" style="">
<span class="kwd">while</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">feof</span><span class="pun">(</span><span class="pln">$handle</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $data </span><span class="pun">=</span><span class="pln"> fgets</span><span class="pun">(</span><span class="pln">$handle</span><span class="pun">);</span><span class="pln">
    echo </span><span class="pun">(</span><span class="str">"Current file line is $data\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أو استبدال كل ذلك بالشيفرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_114" style="">
<span class="pln">$filedata </span><span class="pun">=</span><span class="pln"> file</span><span class="pun">(</span><span class="str">"/path/to/my/file"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$filedata </span><span class="kwd">as</span><span class="pln"> $data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="pun">(</span><span class="str">"Current file line is $data\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	مفاجآت Switch
</h3>

<p>
	تستخدم تعليمات <code>switch</code> الموازنة غير الصارمة لتحديد التطابقات، يمكن أن يؤدي هذا إلى بعض <a href="%E2%80%8Fhttps://stackoverflow.com/questions/4098104/odd-behaviour-in-a-switch-statement" rel="">المفاجآت السيئة</a>، ليكن لدينا الشيفرة التالية مثلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_116" style="">
<span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'input 1'</span><span class="pun">:</span><span class="pln">
        $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">'output_1'</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'input 2'</span><span class="pun">:</span><span class="pln">
        $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">'output_2'</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
        $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">'unknown'</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الشيفرة السابقة بسيطة جدًا وتعمل كما هو متوقع عندما يكون المتغير <code>‎$name</code> سلسلة نصية وإلا ستسبب بعض المشاكل، فمثلًا إذا كان المتغير عددًا صحيحًا <code>0</code> سيتحول النوع عند الموازنة، لكن يتم التعامل مع القيمة الحرفية المُحوّلة في تعليمة <code>case</code> وليس في شرط تعليمة <code>switch</code>، تُحوَّل السلسلة النصية "input 1" إلى العدد الصحيح <code>0</code> والذي يُطابق القيمة المدخلة للعدد الصحيح <code>0</code>. النتيجة النهائية إذا كانت قيمة العدد الصحيح <code>0</code> هي تنفيذ الحالة الأولى دائمًا.
</p>

<p>
	يوجد بعض الحلول لهذه المشكلة: <strong>التحويل الصريح بين الأنواع</strong> يمكن تحويل نوع القيمة إلى سلسلة نصية قبل الموازنة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_118" style="">
<span class="kwd">switch</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">string</span><span class="pun">)</span><span class="pln">$name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أو يمكننا استخدام دالة تُرجع سلسلة نصية كما في الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_120" style="">
<span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">strval</span><span class="pun">(</span><span class="pln">$name</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">...</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تضمن كِلا الطريقتين أن تكون القيمة من نفس نوع القيمة في تعليمات <code>case</code>.
</p>

<p>
	<strong>تجنب switch</strong>
</p>

<p>
	يوفر لنا استخدام تعليمة <code>if</code> التحكم في كيفية حدوث الموازنة مما يسمح لنا باستخدام عوامل الموازنة الصارمة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_122" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$name </span><span class="pun">===</span><span class="pln"> </span><span class="str">"input 1"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">"output_1"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$name </span><span class="pun">===</span><span class="pln"> </span><span class="str">"input 2"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">"output_2"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $mode </span><span class="pun">=</span><span class="pln"> </span><span class="str">"unknown"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	الكتابة الصارمة (Strict typing)
</h3>

<p>
	يمكن التخفيف من بعض الآثار الضارة لتحويل النوع بدءًا من الإصدار PHP 7.0 باستخدام <a href="https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict" rel="external nofollow">الكتابة الصارمة</a>، تفرض PHP التصريح عن نوع المعامل والقيمة المعادة برمي استثناء <code>TypeError</code> من خلال تضمين تعليمة <code>declare</code> في السطر الأول من الملف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_124" style="">
<span class="pln">declare</span><span class="pun">(</span><span class="pln">strict_types</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	فمثلًا في الشيفرة التالية استخدام تعريفات نوع المعامل سيرمي استثناءً قابلًا للالتقاط من النوع <code>TypeError</code> عند التنفيذ:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_126" style="">
<span class="pun">&lt;?</span><span class="pln">php
declare</span><span class="pun">(</span><span class="pln">strict_types</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> sum</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> $a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
echo sum</span><span class="pun">(</span><span class="str">"1"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	وبالتالي تستخدم هذه الشيفرة التصريح عن نوع القيمة المُعادة وسترمي استثناءً إذا كانت القيمة من أي نوع غير العدد الصحيح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_128" style="">
<span class="pun">&lt;?</span><span class="pln">php
declare</span><span class="pun">(</span><span class="pln">strict_types</span><span class="pun">=</span><span class="lit">1</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> returner</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">):</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

returner</span><span class="pun">(</span><span class="str">"this is a string"</span><span class="pun">);</span></pre>

<h2>
	أفضل ممارسات المتغيرات العامة (Global variable)
</h2>

<p>
	سنوضح مشكلةً مع هذه الشيفرة الزائفة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_130" style="">
<span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">global</span><span class="pln"> $bob</span><span class="pun">;</span><span class="pln">
    $bob</span><span class="pun">-&gt;</span><span class="pln">doSomething</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سؤالك الأول هنا بالطبع هو: مين أين أتى المتغير <code>‎$bob</code>؟
</p>

<p>
	هل شعرت بالحيرة؟ إذن قد عرفت لماذا تسبب المتغيرات العامة حيرةً وتعد ممارسةً سيئةً.
</p>

<p>
	إذا كان هذا برنامجًا حقيقيًا فستكون خطوتك التالية تتبع كل المتغيرات <code>‎$bob</code> وآمل أن تجد المتغير الصحيح (من السيء أن يكون اُستعمل بشكلٍ متكرر)، والأسوأ أن يكون شخصًا ما قد عرّفه (أو نسيت وأعدت استخدام هذا المتغير) وعندها ستتوقف شيفرتك، ففي مثال الشيفرة السابق، سيسبب وجود كائن خاطئ أو عدم وجود كائن على الإطلاق خطأً فادحًا (fatal error).
</p>

<p>
	جميع برامج PHP الفعلية تستخدم شيفرة مثل <code>include('file.php');‎</code> لذا كلما ضُمّنت المزيد من الملفات فإنّ مهمتك في إصلاح الشيفرة تصحيح أصعب، وهذا أيضًا يجعل مهمة اختبار التطبيق أصعب، افترض أنّك استخدمت متغيرًا عامًا ليحمل اتصالك بقاعدة البيانات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_132" style="">
<span class="pln">$dbConnector </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DBConnector</span><span class="pun">(...);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">global</span><span class="pln"> $dbConnector</span><span class="pun">;</span><span class="pln">
    $dbConnector</span><span class="pun">-&gt;</span><span class="pln">execute</span><span class="pun">(</span><span class="str">"..."</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يجب تجاوز المتغير العام <code>‎$dbConnector‎</code> لكتابة وحدة اختبار لهذه الدالة ونفّذ الاختبار ثمّ أعد تعيينه بقيمته الأصلية وهذا شيء معرّض للخطأ بشكلٍ كبير:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_134" style="">
<span class="com">/**
* @اختبار
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> testSomething</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">global</span><span class="pln"> $dbConnector</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// قُم بنسخ احتياطي</span><span class="pln">
    $bkp </span><span class="pun">=</span><span class="pln"> $dbConnector</span><span class="pun">;</span><span class="pln"> 

    </span><span class="com">// تجاوز</span><span class="pln">
    $dbConnector </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Mock</span><span class="pun">::</span><span class="pln">create</span><span class="pun">(</span><span class="str">'DBConnector'</span><span class="pun">);</span><span class="pln">

    assertTrue</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">());</span><span class="pln">

    </span><span class="com">// أعد التخزين</span><span class="pln">
    $dbConnector </span><span class="pun">=</span><span class="pln"> $bkp</span><span class="pun">;</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<h3>
	كيف نتجنب المتغيرات العامة؟
</h3>

<p>
	تُدعى أفضل طريقة لتجنب المتغيرات العامة فلسفيًا "إضافة الاعتماديّات" (Dependency Injection)، تسمح لنا هذه الطريقة بإضافة الأدوات التي نحتاجها داخل الدالة أو الصنف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_136" style="">
<span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">\Bar $bob</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $bob</span><span class="pun">-&gt;</span><span class="pln">doSomething</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذه الطريقة أسهل للفهم والإصلاح، إذ ليس هناك تخمين أين أعُدَّ المتغير <code>‎$bob</code> لأنّ المستدعي مسؤول عن معرفة ذلك (يمرر لنا ما نحتاج معرفته). والأفضل من ذلك أنّه يمكننا استخدام <a href="https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration" rel="external nofollow">تصريحات النوع</a> لتقييد ما يتم تمريره.
</p>

<p>
	لذا نعلم أنّ المتغير <code>‎$bob</code> إما نسخةً من الصنف <code>Bar</code> أو من الصنف الابن له وهذا يعني أنّه يمكننا استخدام توابع هذا الصنف، نستطيع الآن بالاشتراك مع محمّل آلي قياسي (متوفر من الإصدار PHP 5.3) تتبّع أين عُرِّف <code>Bar</code>. يشتمل الإصدار PHP 7.0 وما بعده على تصريحات نوع موسّعة حيث يمكنك أن تستعمل الأنواع العددية (مثل <code>int</code> أو <code>string</code>).
</p>

<h3>
	المتغيرات ذات النطاق العام العالي (Superglobal variables)
</h3>

<p>
	المتغيرات ذات النطاق العام العالي في PHP هي متغيرات معرّفة مسبقًا ومتوفرة دائمًا ويمكن الوصول إليها من أي نطاق في أي مكان من الملف البرمجي (ضمن الدوال أو الأصناف أو الملفات) دون الحاجة لأن تعرّفها بالكلمة المفتاحية <code>global</code>.
</p>

<p>
	المتغيرات ذات النطاق العام العالي في PHP هي:
</p>

<ul>
<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.globals.php" rel="external nofollow">$_GLOBALS</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.server.php" rel="external nofollow">$_SERVER</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.request.php" rel="external nofollow">$_REQUEST</a>
	</li>
	<li>
		‎<a href="http://php.net/manual/en/reserved.variables.post.php" rel="external nofollow">$_POST</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.get.php" rel="external nofollow">$_GET</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.files.php" rel="external nofollow">$_FILES</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.environment.php" rel="external nofollow">$_ENV</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.cookies.php" rel="external nofollow">$_COOKIE</a>
	</li>
	<li>
		‎<a href="https://www.php.net/manual/en/reserved.variables.session.php" rel="external nofollow">$_SESSION</a>
	</li>
</ul>
<h2>
	القيم الافتراضية للمتغيرات غير المُهيَّأة (uninitialized)
</h2>

<p>
	تهيئة المتغيرات في PHP ليس أمرًا ضروريًا لكنه يعدّ ممارسةً جيّدةً، للمتغيرات غير المُهيَّأة قيمةً افتراضيةً لنوعها وفقًا للسياق الذي اُستخدموا به.
</p>

<p>
	لنرى ما هي قيمة متغيِّر لم تُسنَد له قيمة وليس مرجعًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_138" style="">
<span class="pln">var_dump</span><span class="pun">(</span><span class="pln">$unset_var</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// ‏NULL الخرج</span></pre>

<p>
	سنهيئ المتغير بالأنواع التالية:
</p>

<h3>
	boolean: القيم المنطقية
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_140" style="">
<span class="pln">echo</span><span class="pun">(</span><span class="pln">$unset_bool </span><span class="pun">?</span><span class="pln"> </span><span class="str">"true\n"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"false\n"</span><span class="pun">);</span><span class="pln">
 </span><span class="com">// 'false' الخرج</span></pre>

<h3>
	string: السلاسل النصية
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_142" style="">
<span class="pln">$unset_str </span><span class="pun">.=</span><span class="pln"> </span><span class="str">'abc'</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$unset_str</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// 'string(3) "abc"' الخرج</span></pre>

<h3>
	integer: الأعداد الصحيحة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_144" style="">
<span class="pln">$unset_int </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">25</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 0 + 25 =&gt; 25</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$unset_int</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// 'int(25)' الخرج</span></pre>

<h3>
	Float/double: الأعداد العشرية
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_146" style="">
<span class="pln">$unset_float </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1.25</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$unset_float</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 'float(1.25)' </span></pre>

<h3>
	array: المصفوفات
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_148" style="">
<span class="pln">$unset_arr</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"def"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$unset_arr</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// array(1) { [3]=&gt; string(3) "def" }</span></pre>

<h3>
	object: الكائنات
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_150" style="">
<span class="pln">$unset_obj</span><span class="pun">-&gt;</span><span class="pln">foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$unset_obj</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// object(stdClass)#1 (1) { ["foo"]=&gt; string(3) "bar" } </span></pre>

<p>
	يعدّ الاعتماد على القيمة الافتراضية لمتغير غير مُهيّأ مشكلةً إذا ضُمِّن ملف داخل ملف آخر يستعمل نفس اسم المتغير.
</p>

<h2>
	توكيد قيمة المتغير وعامل التطابق
</h2>

<p>
	تملك قيمة المتغير في PHP "توكيدًا" مرتبطًا حتى أنّ القيم غير المنطقية ستساوي <code>true</code> أو <code>false</code>، وهذا سيجعل من الممكن استخدام أي متغيّر في كتلة الشيفرة الشرطية، مثل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_152" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">/* مثال واضح */</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">/* ضمنيًأ $var == true */</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	بعض القواعد الأساسية لأنواع مختلفة من قيم المتغير:
</p>

<ul>
<li>
		السلاسل النصية ذات الطول غير الصفري تساوي <code>true</code> متضمنةً السلاسل التي تحوي فراغًا فقط مثل <code>' '</code>.
	</li>
	<li>
		السلاسل الفارغة '' تساوي <code>false</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_154" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> </span><span class="str">' '</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span></pre>

<ul>
<li>
		الأعداد الصحيحة تساوي <code>true</code> إذا كانت غير صفرية، أما الصفر يساوي <code>false</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_156" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
</span><span class="com">// true</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">99</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span></pre>

<ul>
<li>
		القيمة null تساوي <code>false</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_160" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span></pre>

<ul>
<li>
		السلاسل الفارغة '' والسلسلة الصفرية '0' تساوي <code>false</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_162" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span></pre>

<ul>
<li>
		الأعداد العشرية تساوي <code>true</code> إذا كانت غير صفرية وتساوي <code>false</code> إذا كانت صفرية.

		<ul>
<li>
				القيمة <code>NAN</code> (‏Not-A-Number) تساوي <code>true</code>، أي نتيجة <code>NAN == true</code> هي <code>true</code> لأنّ NAN هي قيمة عشرية غير صفرية.
			</li>
			<li>
				القيم الصفرية تتضمن <code>0-</code> و<code>0+</code> كما عرّفها معيار IEEE 754. لا تميّز PHP بين 0- و0+ في الأعداد العشرية ذات الدقة المضاعفة أي نتيجة <code>floatval('0') == floatval('-0')‎</code> هي <code>true</code>.
				<ul>
<li>
						إنّ <code>floatval('0') === floatval('-0')‎</code>.
					</li>
					<li>
						بالإضافة إلى ذلك <code>floatval('0') == false</code> و<code>floatval('-0') == false</code>.
					</li>
				</ul>
</li>
		</ul>
</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_164" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> NAN</span><span class="pun">;</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> floatval</span><span class="pun">(</span><span class="str">'-0'</span><span class="pun">);</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">

$var </span><span class="pun">=</span><span class="pln"> floatval</span><span class="pun">(</span><span class="str">'0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> floatval</span><span class="pun">(</span><span class="str">'-0'</span><span class="pun">);</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$var </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// true</span></pre>

<h3>
	عامل التطابق
</h3>

<p>
	يوجد عامل التطابق <code>===</code> في <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/comparison_operators%E2%80%8E" rel="">التوثيق الرسمي لعوامل الموازنة في لغة PHP</a>، يمكن أن يُستخدم هذا العامل للتحقق إذا كان المتغير مطابقًا لقيمة مرجعية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_166" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
$var_is_null </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// false</span></pre>

<p>
	ويوجد عامل مقابل له وهو عامل عدم التطابق <code>==!</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_168" style="">
<span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
$var_is_null </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// false</span><span class="pln">
$var_is_true </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// true</span><span class="pln">
$var_is_false </span><span class="pun">=</span><span class="pln"> $var </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// true</span></pre>

<p>
	يمكن أن يُستخدم عامل التطابق بدلًا عن بعض دوال اللغة مثل دالة <code>is_null()‎</code>.
</p>

<h3>
	حالة استخدام مع دالة <code>strpos()‎</code>
</h3>

<p>
	تحدد الدالة <code>strpos($haystack, $needle)‎</code> موقع أول ظهور لمحارف المعامل <code>‎$needle‎</code> ضمن السلسلة النصية <code>‎$haystack</code> أو عدم ظهوره أبدًا في السلسلة وهي دالة حساسة لحالة الأحرف، يمكنك استخدام الدالة <code>stripos($haystack, $needle)‎</code> إذا أردت دالةً تؤدي نفس العمل ولكن غير حساسة لحالة الأحرف.
</p>

<p>
	تتضمن الدالتان <code>strpos</code> و<code>stripos</code> معاملًا ثالثًا <code>offset (int)‎</code> وهو اختياري يحدد إزاحة المؤشر قبل أن يبدأ البحث وعلى عكس دالتي <code>strrpos</code> و<code>strripos</code> لا يمكن أن يكون هذا العدد سالبًا.
</p>

<p>
	يمكن أن تُرجع الدالة:
</p>

<ul>
<li>
		<code>0</code> إذا وُجِد <code>‎$needle‎</code> في بداية السلسلة النصية <code>‎$haystack</code>.
	</li>
	<li>
		عددًا صحيحًا غير صفريًا يحدد موقع وجود <code>‎$needle‎</code> إذا وُجد في مكان غير بداية السلسلة النصية <code>‎$haystack</code>.
	</li>
	<li>
		القيمة <code>false</code> إذا لم يوجد <code>‎$n‎eedle</code> في السلسلة النصية <code>‎$haystack</code>.
	</li>
</ul>
<p>
	إنّ كلّ من <code>0</code> و<code>false</code> لهما توكيد <code>false</code> في PHP ولكنهما يمثلان حالات مختلفة بالنسبة لدالة <code>strpos</code> لذا من المهم أن نميز بينهما باستخدام عامل التطابق <code>===</code> لنميز بين القيمة <code>false</code> والقيمة <code>0</code> التي تساوي <code>false</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_170" style="">
<span class="pln">$idx </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$haystack</span><span class="pun">,</span><span class="pln"> $needle</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$idx </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// $haystack ضمن $needle‎‎ ‏‎‏منطقية عندما لا يوجد المعامل for تعليمة </span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// $haystack ضمن $needle‎‎ ‏‎‏منطقية عندما يوجد المعامل for تعليمة  </span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن استخدام عامل عدم التطابق بدلًا من ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_172" style="">
<span class="pln">$idx </span><span class="pun">=</span><span class="pln"> substr</span><span class="pun">(</span><span class="pln">$haystack</span><span class="pun">,</span><span class="pln"> $needle</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$idx </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// $haystack ضمن $needle‎‎ ‏‎‏منطقية عندما يوجد المعامل for تعليمة  </span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// $haystack ضمن $needle‎‎ ‏‎‏منطقية عندما لا يوجد المعامل for تعليمة </span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	نطاق المتغيرات
</h2>

<p>
	يشير نطاق المتغير (Variable scope) إلى مناطق الشيفرة التي يمكن منها الوصول للمتغير، وهذا ما يُسمّى أيضًا بالمرئية (visibility)، يُعرّف نطاق كتل الشيفرة في PHP بالدوال، الأصناف، ونطاق عام متاح عبر التطبيق.
</p>

<h3>
	المتغيرات ذات النطاق العام العالي (Superglobal variables)
</h3>

<p>
	إنّ المتغيرات ذات النطاق العام العالي (Superglobal variables) معرّفة في PHP ويمكن استخدامها في أي مكان بدون الكلمة المفتاحية <code>global</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_174" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> getPostValue</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $default </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ‎متغير ذو نطاق عام عالي‎‌ $_POST</span><span class="pln">
    </span><span class="com">// ‎'global $_POST;'‎ لذا يمكن استخدامه دون ذكر</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$_POST</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $_POST</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">];</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $default</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// $_POST['username'] يسترجع</span><span class="pln">
echo getPostValue</span><span class="pun">(</span><span class="str">'username'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// $default ويسند سلسلة فارغة للمتغير $_POST['email'] يسترجع</span><span class="pln">
echo getPostValue</span><span class="pun">(</span><span class="str">'email'</span><span class="pun">,</span><span class="pln"> </span><span class="str">''</span><span class="pun">);</span></pre>

<h3>
	الخاصيّات الساكنة والمتغيرات
</h3>

<p>
	تعدّ خاصيّات الصنف الساكنة المعرّفة مع المرئية <code>public</code> وظيفيًا نفس المتغيرات العامة، يمكن الوصول إليها من أيّ مكان في الصنف الذي عُرّفت ضمنه.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_176" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">SomeClass</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> $counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// من أي مكان $counter يمكن قراءة/كتابة المتغير الساكن</span><span class="pln">
</span><span class="com">// ولا يتطلب ذلك إنشاء نسخة من الصنف </span><span class="pln">
</span><span class="typ">SomeClass</span><span class="pun">::</span><span class="pln">$counter </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	يمكن أن تعرّف الدوال أيضًا متغيرات ساكنة داخل نطاقها الخاص، تبقى هذه المتغيرات ثابتةً عند استدعاءات الدالة المتعددة على عكس المتغيرات العادية المعرّفة ضمن نطاق الدالة، ويمكن أن يكون هذا أسلوبًا سهلًا وبسيطًا جدًا لتحقيق <a href="https://wiki.hsoub.com/Design_Patterns/singleton" rel="external">نمط التصميم المتفرّد</a> (Singleton design pattern).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_178" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> getInstance</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="com">// عندما تنتهي الدالة $instance لا يُحذف المتغير الساكن</span><span class="pln">
        </span><span class="kwd">static</span><span class="pln"> $instance</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// (1)</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$instance</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// (2)</span><span class="pln">
            $instance </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $instance</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

$instance1 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">();</span><span class="pln">
$instance2 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Singleton</span><span class="pun">::</span><span class="pln">getInstance</span><span class="pun">();</span><span class="pln">

</span><span class="com">// (3)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$instance1 </span><span class="pun">===</span><span class="pln"> $instance2</span><span class="pun">);</span></pre>

<p>
	في الموضع (1) لن يدخل الاستدعاء الثاني إلى تعليمة <code>if</code> لأنّ نسخة من الصنف <code>Singleton</code> خُزِّنت في المتغير <code>‎$instance</code> وتبقى ثابتةً عبر الاستدعاءات المتعددة.
</p>

<p>
	سيصل الاستدعاء الأول لهذه الدالة إلى الموضع (2) لأنّ المتغير <code>‎$instance</code> صُرِّح عنه ولم يُهيَّئ.
</p>

<p>
	بموازنة الكائنات في الموضع (3) باستخدام العامل '===' الذي يتحقق من تطابق الكائنات ستُطبع <code>true</code> لأنّ المتغير الساكن <code>‎$instance</code> يبقى ثابتًا عبر الاستدعاءات المتعددة للتابع <code>getInstance()‎</code>.
</p>

<h3>
	المتغيرات العامة التي يعرّفها المستخدم
</h3>

<p>
	النطاق العام هو النطاق الموجود خارج أيّ دالة أو صنف، ويبقى النطاق نفسه عندما يتضمن النص البرمجي المكتوب بلغة PHP نصًا برمجيًا آخر (باستخدام <code>include</code> أو <code>require</code>)، إذا ضُمِّن الملف البرمجي خارج الدوال والأصناف فإنّ متغيراته العامة تكون أيضًا بالنطاق العام للملف المُضمِّن أمّا إذا ضُمِّن داخل دالة فإنّ متغيراته تبقى ضمن نطاق الدالة.
</p>

<p>
	يمكن استخدام الكلمة المفتاحية <code>global</code> لينشئ المستخدم متغيرات عامة ضمن نطاق الدالة أو تابع الصنف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_180" style="">
<span class="pun">&lt;?</span><span class="pln">php
    $amount_of_log_calls </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> log_message</span><span class="pun">(</span><span class="pln">$message</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// الوصول للمتغير العام من نطاق الدالة يتطلب هذه التعليمة الصريحة</span><span class="pln">
        </span><span class="kwd">global</span><span class="pln"> $amount_of_log_calls</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// هذا التعديل على المتغير العام ثابت</span><span class="pln">
        $amount_of_log_calls </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
        echo $message</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

</span><span class="com">// عندما تكون في النطاق العام يمكن استخدام المتغيرات العامة العادية</span><span class="pln">
</span><span class="com">// 'global $variable;' بدون التعليمة الصريحة </span><span class="pln">
echo $amount_of_log_calls</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">

log_message</span><span class="pun">(</span><span class="str">"First log message!"</span><span class="pun">);</span><span class="pln">
echo $amount_of_log_calls</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

log_message</span><span class="pun">(</span><span class="str">"Second log message!"</span><span class="pun">);</span><span class="pln">
echo $amount_of_log_calls</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 2</span></pre>

<p>
	الطريقة الثانية للوصول للمتغيرات من النطاق العام هي باستخدام مصفوفة PHP المعرّفة <code>‎$GLOBALS</code>، وهي مصفوفة ترابطية (associative) فيها المفتاح هو اسم المتغير العام وقيمة عنصر المصفوفة هي محتوى المتغير وهي مصفوفة ذات نطاق عام عالي لذا يمكن الوصول إليها من أي نطاق. هذا يعني أنه يمكن إعادة كتابة الدالة <code>log_message()‎</code> بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_184" style="">
<span class="kwd">function</span><span class="pln"> log_message</span><span class="pun">(</span><span class="pln">$message</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// $amount_of_log_calls الوصول إلى المتغير العام</span><span class="pln">
    </span><span class="com">// 'global $GLOBALS;' لا يحتاج إلى التصريح $GLOBALS باستخدام المصفوفة </span><span class="pln">
    </span><span class="com">// لأنها ذات نطاق عام عالي</span><span class="pln">
    $GLOBALS</span><span class="pun">[</span><span class="str">'amount_of_log_calls'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    echo $messsage</span><span class="pun">;</span></pre>

<p>
	قد تتساءل لماذا نستخدم المصفوفة ‎ $GLOBALS‎‎بينما يمكننا استخدام الكلمة المفتاحية <code>global</code> للحصول على قيمة المتغير العام؟ السبب الرئيسي هو أنّ استخدام الكلمة المفتاحية <code>global</code> ستجلب المتغير إلى النطاق وعندها لا يمكنك إعادة استخدام نفس اسم المتغير في النطاق المحلي (local scope).
</p>

<h2>
	تعريف الثوابت
</h2>

<p>
	تُنشأ الثوابت بالتعليمة <code>const</code> مع الدالة <code>define</code>، ومن الشائع استخدام الأحرف الكبيرة في تسميتها.
</p>

<h3>
	تعريف ثابت باستخدام القيم الصريحة
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_186" style="">
<span class="com">// عدد عشري</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> PI </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.14</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// قيمة منطقية</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"EARTH_IS_FLAT"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">// null</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="str">"UNKNOWN"</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> 

</span><span class="com">// سلسلة نصية</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"APP_ENV"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"dev"</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">// عدد صحيح باستخدام تعبير عددي</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> MAX_SESSION_TIME </span><span class="pun">=</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pun">;</span><span class="pln">

</span><span class="com">// مصفوفة</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> APP_LANGUAGES </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"de"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"en"</span><span class="pun">];</span><span class="pln"> 
define</span><span class="pun">(</span><span class="str">"BETTER_APP_LANGUAGES"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">"lu"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"de"</span><span class="pun">]);</span><span class="pln"> </span></pre>

<h3>
	تعريف ثابت باستخدام ثابت آخر
</h3>

<p>
	يمكنك الاعتماد على ثابت موجود لديك لتسمية ثابت جديد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_188" style="">
<span class="kwd">const</span><span class="pln"> TAU </span><span class="pun">=</span><span class="pln"> PI </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"EARTH_IS_ROUND"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">!</span><span class="pln">EARTH_IS_FLAT</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"MORE_UNKNOWN"</span><span class="pun">,</span><span class="pln"> UNKNOWN</span><span class="pun">);</span><span class="pln">

</span><span class="com">// يمكن أيضًا استخدام توابع تعديل السلاسل النصية </span><span class="pln">
</span><span class="com">// const المثال التالي (استدعاء دالة) لا يعمل مع</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"APP_ENV_UPPERCASE"</span><span class="pun">,</span><span class="pln"> strtoupper</span><span class="pun">(</span><span class="pln">APP_ENV</span><span class="pun">));</span><span class="pln">

</span><span class="com">// لأن الوقت ليس تعبير عددي ثابت (fatal error) التعليمة التالية ترمي خطأً فادحًا</span><span class="pln">
</span><span class="com">// const TIME = time();</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"MAX_SESSION_TIME_IN_MINUTES"</span><span class="pun">,</span><span class="pln"> MAX_SESSION_TIME </span><span class="pun">/</span><span class="pln"> </span><span class="lit">60</span><span class="pun">);</span><span class="pln">

</span><span class="com">// تعديل المصفوفات</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> APP_FUTURE_LANGUAGES </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"es"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> APP_LANGUAGES</span><span class="pun">;</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"APP_BETTER_FUTURE_LANGUAGES"</span><span class="pun">,</span><span class="pln"> array_merge</span><span class="pun">([</span><span class="str">"fr"</span><span class="pun">],</span><span class="pln"> APP_BETTER_LANGUAGES</span><span class="pun">));</span></pre>

<h3>
	الثوابت المحجوزة
</h3>

<p>
	يوجد بعض أسماء الثوابت المحجوزة في PHP والتي لا يمكن إعادة تعريفها، إليك بعض الأمثلة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_190" style="">
<span class="com">// ثابت محلي</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"true"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

</span><span class="com">// ثابت محلي</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"false"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// محمّلة curl سيحدث خطأ إذا كانت الإضافة</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"CURLOPT_AUTOREFERER"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"something"</span><span class="pun">);</span></pre>

<p>
	وسيظهر لك الخطأ <code>Constant ... already defined in ...‎</code>
</p>

<h3>
	تعريف الثوابت الشرطي
</h3>

<p>
	إذا كان لديك عدة ملفات تعرّف فيها نفس المتغير (مثلًا في ملف الإعدادات الرئيسي وملف الإعدادات المحلي) عندها فإنّ الصيغة التالية ستساعدك لتجنّب التضارب:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_192" style="">
<span class="com">// إذا لم يُعرَّف من قبل PI عرّف الثابت</span><span class="pln">
</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">"PI"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> define</span><span class="pun">(</span><span class="str">"PI"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.1415</span><span class="pun">);</span></pre>

<p>
	<strong>const مقابل define</strong>
</p>

<p>
	<code>define</code> تعبير يُستدعى أثناء التنفيذ (runtime expression) أما <code>const</code> يُستدعى عند التفسير، لذا يسمح <code>define</code> بالقيم الديناميكية (مثل استدعاءات الدالة، المتغيرات…) وبالأسماء الديناميكية والتعريف الشرطي، لكن يُعرَّف عادةً نسبةً إلى فضاء اسم الجذر. بينما <code>const</code> هو ثابت (كما هو مسموح في العمليات مع الثوابت الأخرى والأعداد أو المصفوفات ومجموعة محدودة منها فقط ما يسمى التعابير العددية الثابتة أي العوامل الحسابية والمنطقية والموازنة والمصفوفة) ولكن يُسبق تلقائيًا بفضاء الاسم الفعال حاليًا. وتدعم <code>const</code> الثوابت الأخرى والأعداد كالقيم ولا توجد عمليات.
</p>

<h2>
	ثوابت الصنف
</h2>

<p>
	تُعرّف الثوابت داخل الأصناف باستخدام الكلمة المفتاحية <code>const</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_194" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> BAR_TYPE </span><span class="pun">=</span><span class="pln"> </span><span class="str">"bar"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// self:: مرجع من داخل الصنف باستخدام</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> myMethod</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">BAR_TYPE</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// &lt;اسم الصنف‎&gt;:: مرجع من خارج الصنف باستخدام‎‎</span><span class="pln">
echo </span><span class="typ">Foo</span><span class="pun">::</span><span class="pln">BAR_TYPE</span><span class="pun">;</span></pre>

<p>
	يعدّ هذا مفيدًا لتخزين أنواع من العناصر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_196" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LEVEL_INFO </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LEVEL_WARNING </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> LEVEL_ERROR </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// يمكن أن نسند للثابت قيمةً افتراضيةً</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> log</span><span class="pun">(</span><span class="pln">$message</span><span class="pun">,</span><span class="pln"> $level </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">LEVEL_INFO</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"Message level "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $level </span><span class="pun">.</span><span class="pln"> </span><span class="str">": "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $message</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$logger </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Logger</span><span class="pun">();</span><span class="pln">

</span><span class="com">// استخدام القيمة الافتراضية</span><span class="pln">
$logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Info"</span><span class="pun">);</span><span class="pln"> 

</span><span class="com">// استخدام المتغير</span><span class="pln">
$logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Warning"</span><span class="pun">,</span><span class="pln"> $logger</span><span class="pun">::</span><span class="pln">LEVEL_WARNING</span><span class="pun">);</span><span class="pln">

</span><span class="com">// استخدام الصنف</span><span class="pln">
$logger</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">(</span><span class="str">"Error"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Logger</span><span class="pun">::</span><span class="pln">LEVEL_ERROR</span><span class="pun">);</span><span class="pln"> </span><span class="com">// using class</span></pre>

<h2>
	التحقق من تعريف الثابت
</h2>

<h3>
	تحقق بسيط
</h3>

<p>
	نستخدم الدالة <code>defined</code> للتحقق من تعريف ثابت ما، لا تهتم هذه الدالة لقيمة الثابت إنما فقط هل الثابت موجود أم لا حتى إذا كانت قيمته <code>null</code> أو <code>false</code> فسترجع <code>true</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_198" style="">
<span class="pun">&lt;?</span><span class="pln">php
define</span><span class="pun">(</span><span class="str">"GOOD"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">"GOOD"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// "GOOD is defined" يطبع السطر التالي</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"GOOD is defined"</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">GOOD</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// false هي GOOD لا يطبع السطر التالي شيئًا بما أنّ</span><span class="pln">
        </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"GOOD is true"</span><span class="pln"> </span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">"AWESOME"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لذا يجب تعريفه AWESOME لم يُعرّف الثابت</span><span class="pln">
    define</span><span class="pun">(</span><span class="str">"AWESOME"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّ الثوابت تصبح مرئيةً في شيفرتك في السطر التالي مباشرةً لتعريفها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_200" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">"GOOD"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لم يُعرّف بعد GOOD لا يطبع السطر التالي شيئًا بما أنّ</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"GOOD is defined"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

define</span><span class="pun">(</span><span class="str">"GOOD"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">"GOOD"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// "GOOD is defined" يطبع السطر التالي</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"GOOD is defined"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	الحصول على كل الثوابت المعرفة
</h3>

<p>
	نستخدم الدالة <code>get_defined_constants</code> لمعرفة كل الثوابت المعرّفة حتى تلك المُنشأة من قِبل PHP:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_202" style="">
<span class="pun">&lt;?</span><span class="pln">php
$constants </span><span class="pun">=</span><span class="pln"> get_defined_constants</span><span class="pun">();</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$constants</span><span class="pun">);</span><span class="pln">
</span><span class="com">// ستظهر لك قائمة كبيرة</span></pre>

<p>
	يمكنك استدعاء الدالة في بداية ونهاية السكربت (عادةً بعد استدعاء bootstrap) لتحصل على الثوابت المعرّفة في تطبيقك فقط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_204" style="">
<span class="pun">&lt;?</span><span class="pln">php
$constants </span><span class="pun">=</span><span class="pln"> get_defined_constants</span><span class="pun">();</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"HELLO"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"hello"</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">"WORLD"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"world"</span><span class="pun">);</span><span class="pln">
$new_constants </span><span class="pun">=</span><span class="pln"> get_defined_constants</span><span class="pun">();</span><span class="pln">
$myconstants </span><span class="pun">=</span><span class="pln"> array_diff_assoc</span><span class="pun">(</span><span class="pln">$new_constants</span><span class="pun">,</span><span class="pln"> $constants</span><span class="pun">);</span><span class="pln">
var_export</span><span class="pun">(</span><span class="pln">$myconstants</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
الخرج
array (
'HELLO' =&gt; 'hello',
'WORLD' =&gt; 'world',
)
*/</span></pre>

<p>
	إنّ هذه الدالة مفيدة أحيانًا للتنقيح.
</p>

<h3>
	استخدام الثوابت
</h3>

<p>
	تستخدم الثابت ببساطة بواسطة اسمه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_206" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">EARTH_IS_FLAT</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Earth is flat"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> APP_ENV_UPPERCASE</span><span class="pun">;</span></pre>

<p>
	ويمكنك استخدام الدالة <code>constant</code> إذا لم تكن تعرف اسم الثابت مسبقًا، إليك الشيفرة التالية المكافئة للشيفرة السابقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_208" style="">
<span class="pln">$const1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"EARTH_IS_FLAT"</span><span class="pun">;</span><span class="pln">
$const2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"APP_ENV_UPPERCASE"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">constant</span><span class="pun">(</span><span class="pln">$const1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"Earth is flat"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> constant</span><span class="pun">(</span><span class="pln">$const2</span><span class="pun">);</span></pre>

<h3>
	5.5: المصفوفات الثابتة
</h3>

<p>
	يمكن أن تُستخدم المصفوفات كثوابت بسيطة أو ثوابت صنف من الإصدار PHP 5.6 وما بعده:
</p>

<p>
	<strong>مثال على ثابت صنف</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_210" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Answer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> C </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="typ">Answer</span><span class="pun">::</span><span class="pln">C</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="typ">Answer</span><span class="pun">::</span><span class="pln">C</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 42</span></pre>

<p>
	<strong>مثال على ثابت بسيط</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_212" style="">
<span class="kwd">const</span><span class="pln"> ANSWER </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> ANSWER</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> ANSWER</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 42</span></pre>

<p>
	نُقلت هذه الوظيفة إلى الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/defined" rel="">define</a> منذ الإصدار PHP 7.0 من أجل الثوابت البسيطة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_214" style="">
<span class="pln">define</span><span class="pun">(</span><span class="str">'VALUES'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">]);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'MY_ARRAY'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    VALUES</span><span class="pun">,</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="kwd">print</span><span class="pln"> MY_ARRAY</span><span class="pun">[</span><span class="lit">1</span><span class="pun">][</span><span class="lit">1</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 3</span></pre>

<h3>
	الثوابت السحرية
</h3>

<p>
	<strong>الفرق بين <strong>FUNCTION</strong> و<strong>METHOD</strong></strong>
</p>

<p>
	ترجع <code>__FUNCTION__</code> اسم الدالة فقط بينما تُرجع <code>__METHOD__</code> اسم الصنف مع اسم الدالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_216" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> trick
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doit</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo __FUNCTION__</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> doitagain</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo __METHOD__</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> trick</span><span class="pun">();</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">doit</span><span class="pun">();</span><span class="pln"> </span><span class="com">// doit</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">doitagain</span><span class="pun">();</span><span class="pln"> </span><span class="com">// trick::doitagain</span></pre>

<p>
	<strong>الفرق بين <strong>CLASS</strong> وget_class()‎ وget_called_class()‎</strong>
</p>

<p>
	يُرجع الثابت السحري <code>__CLASS__</code> نفس نتيجة استدعاء الدالة <code>get_class()‎</code> بدون معاملات ويُرجع كلاهما اسم الصنف حيث يُعرّف (أي حيث كتبت استدعاء الدالة/ اسم الثابت).
</p>

<p>
	وفي المقابل فإنّ كلًا من استدعاء الدوال <code>get_class($this)‎</code> و<code>get_called_class()‎</code> يُرجع اسم الصنف الفعلي الذي اُستنسخ:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_218" style="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Definition_Class</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> say</span><span class="pun">(){</span><span class="pln">
        echo </span><span class="str">'__CLASS__ value: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> __CLASS__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
        echo </span><span class="str">'get_called_class() value: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> get_called_class</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
        echo </span><span class="str">'get_class($this) value: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> get_class</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
        echo </span><span class="str">'get_class() value: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> get_class</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Actual_Class</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Definition_Class</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
$c </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Actual_Class</span><span class="pun">();</span><span class="pln">
$c</span><span class="pun">-&gt;</span><span class="pln">say</span><span class="pun">();</span><span class="pln">

</span><span class="com">// الخرج</span><span class="pln">
</span><span class="com">// __CLASS__ value: Definition_Class</span><span class="pln">
</span><span class="com">// get_called_class() value: Actual_Class</span><span class="pln">
</span><span class="com">// get_class($this) value: Actual_Class</span><span class="pln">
</span><span class="com">// get_class() value: Definition_Class</span></pre>

<p>
	<strong>ثوابت الملف والمجلد</strong>
</p>

<ul>
<li>
		الملف الحالي: يمكنك الحصول على ملف PHP الحالي (مع المسار المطلق) باستخدام الثابت السحري <code>__FILE__</code>، يستخدم هذا غالبًا للتنقيح/ التسجيل (logging):
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_220" style="">
<span class="pln">echo </span><span class="str">"We are in the file:"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> __FILE__ </span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span></pre>

<ul>
<li>
		المجلد الحالي: يمكنك استخدام الثابت السحري <code>__DIR__</code> للحصول على المسار المطلق للمجلد الذي يوجد فيه الملف الحالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_222" style="">
<span class="pln">echo </span><span class="str">"Our script is located in the:"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> __DIR__ </span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span></pre>

<p>
	يمكنك استخدام <code>dirname(__FILE__)‎</code> للحصول على المسار المطلق للمجلد الذي يوجد فيه الملف الحالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_224" style="">
<span class="pln">echo </span><span class="str">"Our script is located in the:"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> dirname</span><span class="pun">(</span><span class="pln">__FILE__</span><span class="pun">)</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span></pre>

<p>
	تُستخدم ثوابت الحصول على المجلد الحالي غالبًا من قِبل أطر عمل PHP لضبط المجلد الأساسي (base directory):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_226" style="">
<span class="com">// لإطار العمل index.php</span><span class="pln">
</span><span class="com">// استخدام الثابت السحري لتعريف ثابت عادي</span><span class="pln">
define</span><span class="pun">(</span><span class="pln">BASEDIR</span><span class="pun">,</span><span class="pln"> __DIR__</span><span class="pun">);</span><span class="pln">

</span><span class="com">// somefile.php looks for views:</span><span class="pln">
</span><span class="com">// views إذا أردت الوصول لمسار ملف ما في مجلد </span><span class="pln">
$view </span><span class="pun">=</span><span class="pln"> </span><span class="str">'page'</span><span class="pun">;</span><span class="pln">
$viewFile </span><span class="pun">=</span><span class="pln"> BASEDIR </span><span class="pun">.</span><span class="pln"> </span><span class="str">'/views/'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $view</span><span class="pun">;</span></pre>

<p>
	<strong>الفواصل</strong>
</p>

<p>
	يفهم نظام ويندوز الخط المائل <code>/</code> في المسارات لذا يُستخدم <code>DIRECTORY_SEPARATOR</code> بشكلٍ أساسي عند تحليل المسارات.
</p>

<p>
	وبالإضافة إلى الثوابت السحرية يوجد في PHP بعض الثوابت الثابتة للعمل مع المسارات مثل الثابت <code>DIRECTORY_SEPARATOR</code> لفصل المجلدات في مسار، يأخد القيمة <code>/</code> في ‎*nix‎ و<code>\</code> في ويندوز، يمكن كتابة المثال السابق بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8372_228" style="">
<span class="pln">$view </span><span class="pun">=</span><span class="pln"> </span><span class="str">'page'</span><span class="pun">;</span><span class="pln">
$viewFile </span><span class="pun">=</span><span class="pln"> BASEDIR </span><span class="pun">.</span><span class="pln"> DIRECTORY_SEPARATOR </span><span class="pun">.</span><span class="str">'views'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DIRECTORY_SEPARATOR </span><span class="pun">.</span><span class="pln"> $view</span><span class="pun">;</span></pre>

<p>
	نادرًا ما يستخدم الثابت <code>PATH_SEPARATOR</code> لفصل المسارات في متغير البيئة <code>‎$PATH</code> وقيمته <code>;</code> في ويندوز و<code>:</code> في غيره.
</p>

<p>
	ترجمة -وبتصرف- للفصول [Variables - Variable Scope - Constants - Magic Constants] من كتاب <a href="https://goalkicker.com/PHPBook" rel="external nofollow">PHP Notes for Professionals book</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D8%B0%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D8%B9%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%8A-superglobal-variables-%D9%81%D9%8A-php-r1041/" rel="">المتغيرات ذات النطاق العام العالي (Superglobal Variables) في PHP</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%85%D8%B9-php-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A%D9%87%D8%A7-r1039/" rel="">البدء مع PHP والتعرف على أنواع البيانات فيها</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1040</guid><pubDate>Wed, 21 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x62F;&#x621; &#x645;&#x639; PHP &#x648;&#x627;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x641;&#x64A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D9%85%D8%B9-php-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A%D9%87%D8%A7-r1039/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_10/1.png.af0de088696a198d33123c9dd6781c43.png" /></p>
<h2>
	إصدارات PHP
</h2>

<p>
	نسخة PHP 7.x:
</p>

<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				<strong>النسخة</strong>
			</th>
			<th>
				<strong>مدعومة حتى تاريخ</strong>
			</th>
			<th>
				<strong>تاريخ الإصدار</strong>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<a href="https://www.php.net/releases/7_4_0.php" rel="external nofollow">7.4</a>
			</td>
			<td>
				2021-11-28
			</td>
			<td>
				2019-11-28
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/7_3_0.php" rel="external nofollow">7.3</a>
			</td>
			<td>
				2020-12-06
			</td>
			<td>
				2018-12-06
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/7_2_0.php" rel="external nofollow">7.2</a>
			</td>
			<td>
				2019-11-30
			</td>
			<td>
				2017-11-30
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/7_1_0.php" rel="external nofollow">7.1</a>
			</td>
			<td>
				2019-12-01
			</td>
			<td>
				2016-12-01
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/7_0_0.php" rel="external nofollow">7.0</a>
			</td>
			<td>
				2019-01-10
			</td>
			<td>
				2015-12-03
			</td>
		</tr>
	</tbody>
</table>

<p>
	نسخة PHP 5.x:
</p>

<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				النسخة
			</th>
			<th>
				مدعومة حتى تاريخ
			</th>
			<th>
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_6_0.php" rel="external nofollow">5.6</a>
			</td>
			<td>
				2018-12-31
			</td>
			<td>
				2014-08-28
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_5_0.php" rel="external nofollow">5.5</a>
			</td>
			<td>
				2016-07-21
			</td>
			<td>
				2013-06-20
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_4_0.php" rel="external nofollow">5.4</a>
			</td>
			<td>
				2015-09-03
			</td>
			<td>
				2012-03-01
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_3_0.php" rel="external nofollow">5.3</a>
			</td>
			<td>
				2014-08-14
			</td>
			<td>
				2009-06-30
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_2_0.php" rel="external nofollow">5.2</a>
			</td>
			<td>
				2011-01-06
			</td>
			<td>
				2006-11-02
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/5_1_0.php" rel="external nofollow">5.1</a>
			</td>
			<td>
				2006-08-24
			</td>
			<td>
				2005-11-24
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://news-web.php.net/php.announce/50" rel="external nofollow">5.0</a>
			</td>
			<td>
				2005-09-05
			</td>
			<td>
				2004-07-13
			</td>
		</tr>
	</tbody>
</table>

<p>
	نسخة PHP 4.x:
</p>

<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				النسخة
			</th>
			<th>
				مدعومة حتى تاريخ
			</th>
			<th>
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<a href="https://www.php.net/releases/4_4_0.php" rel="external nofollow">4.4</a>
			</td>
			<td>
				2008-08-07
			</td>
			<td>
				2005-07-11
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/4_3_0.php" rel="external nofollow">4.3</a>
			</td>
			<td>
				2005-03-31
			</td>
			<td>
				2002-12-27
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/4_2_0.php" rel="external nofollow">4.2</a>
			</td>
			<td>
				2002-09-06
			</td>
			<td>
				2002-04-22
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/releases/4_1_0.php" rel="external nofollow">4.1</a>
			</td>
			<td>
				2002-03-12
			</td>
			<td>
				2001-12-10
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://news-web.php.net/php.announce/22" rel="external nofollow">4.0</a>
			</td>
			<td>
				2001-06-23
			</td>
			<td>
				2000-05-22
			</td>
		</tr>
	</tbody>
</table>

<p>
	النسخ القديمة:
</p>

<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				النسخة
			</th>
			<th>
				مدعومة حتى تاريخ
			</th>
			<th>
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<a href="https://www.php.net/manual/php3.php" rel="external nofollow">3.0</a>
			</td>
			<td>
				2000-10-20
			</td>
			<td>
				1998-06-06
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://www.php.net/manual/phpfi2.php" rel="external nofollow">2.0</a>
			</td>
			<td>
				 
			</td>
			<td>
				1997-11-01
			</td>
		</tr>
		<tr>
			<td>
				<a href="https://museum.php.net/php1/" rel="external nofollow">1.0</a>
			</td>
			<td>
				 
			</td>
			<td>
				1995-06-08
			</td>
		</tr>
	</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<h2>
	تثبيت بيئة PHP
</h2>

<h3>
	نظام ويندوز
</h3>

<h4>
	تنزيل وتثبيت واستخدام wamp
</h4>

<p>
	<a href="https://www.wampserver.com/en/" rel="external nofollow">WampServer</a> بيئة تطوير ويب على نظام ويندوز، يتيح لنا إنشاء تطبيقات ويب باستخدام Apache2 <a href="https://wiki.hsoub.com/PHP" rel="external">وPHP </a>وقاعدة البيانات MySQL كما أنّ PhpMyAdmin يسمح لنا بإدارة قواعد البيانات بسهولة.
</p>

<p>
	WampServer متوفر مجانًا (بموجب ترخيص GPML) بإصدارين مختلفين: 32 و64 بت، Wampserver 2.5 غير متوافق مع ويندوز XP وSP3 وويندوز سيرفر 2003، وتتوفر إصدارات أقدم منه في <a href="%E2%80%8Fhttps://sourceforge.net/projects/wampserver/files/%E2%80%8F" rel="">SourceForge</a>.
</p>

<p>
	توفر WampServer حاليًا:
</p>

<ul>
	<li>
		Apache
	</li>
	<li>
		MySQL
	</li>
	<li>
		PHP
	</li>
</ul>

<p>
	تثبيت WampServer بسيط جدًا، نزل آخر إصدار من الموقع الرسمي له <a href="https://www.wampserver.com/en/" rel="external nofollow">WampServer</a>، فقط نفّذ المثبت واختر الموقع ثم أنهِ، وبعدها يمكنك بدء تشغيل WampServer وسيبدأ في لوحة النظام (شريط المهام) باللون الأحمر بدايةً ثم يتغير للون الأخضر عندما يصبح الخادم جاهزًا، ويمكنك بعدها الذهاب إلى المتصفح وكتابة <code>localhost</code> أو <code>127.0.0.1</code> لتحصل على صفحة WAMP الرئيسية. يمكنك من الآن بدء العمل على PHP محليًا بتخزين الملفات في المسار <code>&lt;PATH_TO_WAMP&gt;/www/&lt;php_or_html_file&gt;</code> والتحقق من النتيجة على الرابط <code><a href="http://localhost/%3Cphp_or_html_file_name%3E%E2%80%8E" ipsnoembed="true" rel="external nofollow">http://localhost/<php_or_html_file_name>‎</php_or_html_file_name></a></code>.
</p>

<h4>
	تثبيت PHP واستخدامها مع IIS
</h4>

<p>
	تحتاج بدايةً أن يكون عندك IIS (‏Internet Information Service) مثبّتًا وتنفّذه على جهازك، لا يتوفر لديك افتراضيًا إنما تحتاج أن تضيف خصائصه من: لوحة التحكم -&gt; البرامج -&gt; خصائص ويندوز
</p>

<ul>
	<li>
		ثبّت نسخة PHP التي تريدها من <a href="https://windows.php.net/download/" rel="external nofollow">هذا الموقع</a> وتأكد من تنزيل إصدارات آمنة غير خيطية (NTS).
	</li>
	<li>
		استخرج الملفات في المسار <code>C:\PHP\‎</code>.
	</li>
	<li>
		شغّل IIS (‏Internet Information Service).
	</li>
	<li>
		اختر العنصر الجذر من اللوحة اليسارية.
	</li>
	<li>
		انقر مرتين على <code>Handler Mappings</code>.
	</li>
	<li>
		انقر على <code>Add Module Mapping</code> في اللوحة الجانبية اليمينية.
	</li>
	<li>
		اضبط القيم كالتالي:
	</li>
</ul>

<pre class="ipsCode">Request Path: *.php
Module: FastCgiModule
Executable: C:\PHP\php-cgi.exe
Name: PHP_FastCGI
Request Restrictions: Folder or File, All Verbs, Access: Script
</pre>

<ul>
	<li>
		ثبّت <code>vcredist_x64.exe</code> أو <code>vcredist_x86.exe</code> (حزمة Visual C++ 2012 قابلة لإعادة التوزيع) من <a href="https://www.microsoft.com/en-US/download/details.aspx?id=30679" rel="external nofollow">هذا الرابط</a>.
	</li>
	<li>
		اضبط ملف <code>C:\PHP\php.ini</code> وخاصةً <code>extension_dir ="C:\PHP\ext"‎</code>.
	</li>
	<li>
		أعد ضبط IIS، اكتب في طرفية الأوامر DOS الأمر <code>IISRESET</code>.
	</li>
</ul>

<p>
	يمكنك اختياريًا تثبيت <a href="%E2%80%8Fhttps://phpmanager.codeplex.com/" rel="">مدير PHP من أجل IIS</a> والذي يساعدك بشكلٍ كبير لضبط ملف <code>ini</code> وتتبع تسجيلات الأخطاء (لا يعمل على نظام التشغيل ويندوز 10)، وتذكر أن تضبط <code>index.php</code> على أنها إحدى صفحات IIS الافتراضية.
</p>

<p>
	إذا اتبعت دليل التثبيت فأنت جاهز الآن لاختبار PHP.
</p>

<p>
	يملك IIS مثل لينوكس هيكلية مجلدات على الخادم، جذر هذه الشجرة هو <code>C:\inetpub\wwwroot\‎</code> وهنا نقطة الدخول لكل ملفاتك العامة وسكربتات PHP.?
</p>

<p>
	استخدم الآن محررك الخاص أو المحرر Notepad الموجود في ويندوز واكتب التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_38" style=""><span class="pun">&lt;?</span><span class="pln">php
header</span><span class="pun">(</span><span class="str">'Content-Type: text/html; charset=UTF-8'</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">'&lt;html&gt;&lt;head&gt;&lt;title&gt;Hello World&lt;/title&gt;&lt;/head&gt;&lt;body&gt;Hello world!&lt;/body&gt;&lt;/html&gt;'</span><span class="pun">;</span></pre>

<p>
	احفظ هذا الملف في المسار <code>C:\inetpub\wwwroot\index.php</code> باستخدام الترميز UTF-8 (بدون BOM)، ثم افتح موقعك الجديد على العنوان التالي <code><a href="http://localhost/index.php" ipsnoembed="true" rel="external nofollow">http://localhost/index.php</a></code>.
</p>

<h4>
	تنزيل وتثبيت XAMPP
</h4>

<p>
	<strong>ما هو XAMPP؟</strong> XAMPP هو بيئة تطوير PHP الأشهر، مجاني بالكامل ومفتوح المصدر وسهل لتثبيت توزيعة Apache متضمنةً MariaDB وPHP وPerl.
</p>

<p>
	<strong>من أين يجب تنزيله؟</strong> نزّل الإصدار المناسب المستقر من <a href="https://www.apachefriends.org/download.html" rel="external nofollow">صفحة التنزيل</a>، واختره بناءً على نوع نظامك التشغيل (32 بت أو 64 بت) وإصدار PHP الذي يجب أن يدعمه.
</p>

<p>
	أو يمكنك اتباع الخطوات التالية: يتوفر XAMPP من أجل نظام ويندوز في 3 أشكال:
</p>

<ul>
	<li>
		<a href="https://www.apachefriends.org/download.html" rel="external nofollow">مثبِّت</a>: ربما تكون صياغة <code>‎.‎exe</code> أسهل طريقة لتثبيت XAMPP.
	</li>
	<li>
		<a href="%E2%80%8Fhttps://sourceforge.net/projects/xampp/files/XAMPP%20Windows/7.2.1/" rel="">ZIP</a>: (للمتخصصين: XAMPP كأرشيف عادي بصياغة <code>‎.zip</code>).
	</li>
	<li>
		<a href="%E2%80%8Fhttps://sourceforge.net/projects/xampp/files/XAMPP%20Windows/7.2.1/" rel="">7zip</a>: (للمتخصصين مع عرض حزمة أقل، XAMPP كأرشيف بصياغة <code>‎.7zip</code>).
	</li>
</ul>

<p>
	<strong>كيف أثبّته وأين يجب أن أضع ملفات PHP/html؟</strong>
</p>

<p>
	التثبيت باستخدام المثبِّت الموفَّر:
</p>

<ul>
	<li>
		نفّذ مثبِّت خادم XAMPP بالنقر مرتين على ملف <code>‎.exe</code> المنزَّل.
	</li>
</ul>

<p>
	التنزيل من ZIP:
</p>

<ul>
	<li>
		فك ضغط الأرشيف المضغوط في المجلد الذي تختاره.
	</li>
	<li>
		سيُستخلص XAMPP إلى المجلد الفرعي <code>C:\xampp</code> داخل المجلد الهدف المُختار.
	</li>
	<li>
		افتح الآن الملف <code>setup_xampp.bat</code> لتعديل إعدادات XAMPP بما يناسب نظامك.
	</li>
</ul>

<p>
	<strong>ملاحظة:</strong> إذا اخترت المجلد الجذر <code>C‎:\‎</code> كمجلد هدف عندها يجب ألا تبدأ ملف <code>setup_xampp.bat</code>.
</p>

<p>
	<strong>ما بعد التثبيت</strong> استخدم لوحة تحكم XAMPP للقيام بمهام إضافية، مثل بدء/إيقاف Apache، ‏MySQL، ‏FileZilla وMercury أو تثبيتها كخدمات.
</p>

<p>
	<strong>معالجة الملف</strong> التثبيت عملية سهلة مباشرة وعندما ينتهي التثبيت يمكنك إضافة ملفات html/php لتُستضاف على الخادم في المسار <code>XAMPP-root/htdocs/‎</code> ثم شغّل الخادم وافتح الرابط <code><a href="http://localhost/file.php" ipsnoembed="true" rel="external nofollow">http://localhost/file.php</a></code> في المتصفح لمشاهدة الصفحة.
</p>

<p>
	<strong>ملاحظة:</strong> الجذر الافتراضي للخادم XAMPP في ويندوز هو <code>C:/xampp/htdocs/‎</code>.
</p>

<p>
	اكتب إحدى الرابطين التاليين في المتصفح:
</p>

<pre class="ipsCode">http://localhost/
http://127.0.0.1/
</pre>

<p>
	يجب أن تشاهد صفحة البدء للخادم. [01.PNG]
</p>

<h3>
	أنظمة لينكس/يونكس
</h3>

<h4>
	تثبيت سطر الأوامر باستخدام APT من أجل PHP 7
</h4>

<p>
	سيثبّت هذا PHP فقط، إذا أردت عرض ملف PHP على الويب ستحتاج أيضًا تثبيت خادم ويب مثل <a href="%E2%80%8Fhttp://www.apache.org/" rel="">Apache</a> أو <a href="%E2%80%8Fhttps://www.nginx.com/" rel="">Nginx</a> أو استخدام <a href="%E2%80%8Fhttp://php.net/manual/en/features.commandline.webserver.php" rel="">خادم الويب المدمج الخاص بلغة PHP</a> (في الإصدار 5.4 وما بعده).
</p>

<p>
	إذا كنت تستخدم إصدار أبونتو أقل من 16.04 وتريد استخدام PHP 7 فيمكنك إضافة <a href="%E2%80%8Fhttps://launchpad.net/~ondrej/+archive/ubuntu/php/" rel="">مستودع Ondrej PPA</a> بكتابة الأمر:
</p>

<pre class="ipsCode">sudo add-apt-repository ppa:ondrej/php
</pre>

<p>
	تأكد من أنّ كل <a href="https://en.wikipedia.org/wiki/Software_repository" rel="external nofollow">مستودعاتك</a> محدَّثة:
</p>

<pre class="ipsCode">sudo apt-get update
</pre>

<p>
	بعد تحديث مستودعات نظامك، ثبّت PHP:
</p>

<pre class="ipsCode">sudo apt-get install php7.0
</pre>

<p>
	لنختبر التثبيت بالتحقق من نسخة PHP:
</p>

<pre class="ipsCode">php --version
</pre>

<p>
	يجب أن يكون الخرج مشابهًا للتالي:
</p>

<pre class="ipsCode">PHP 7.0.8-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.8-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
</pre>

<p>
	يمكنك الآن تشغيل PHP من سطر الأوامر.
</p>

<h4>
	التثبيت في توزيعات إنتربرايس لينكس (CentOS، ‏Scientific Linux وغير ذلك)
</h4>

<p>
	استخدم الأمر <code>dnf</code> لإدارة الحزم في أنظمة التشغيل المعتمدة على توزيعات إنتربرايس لينوكس:
</p>

<pre class="ipsCode">dnf install php
</pre>

<p>
	يثبت هذا نسخة PHP محدودة متضمنةً بعض الميزات الشائعة، وإذا احتجت وحدات إضافية ستحتاج تثبيتها بشكلٍ منفصل ويمكنك استخدام <code>dnf</code> للبحث عن هذه الحزم:
</p>

<pre class="ipsCode">dnf search php-*
</pre>

<p>
	مثال عن الخرج:
</p>

<pre class="ipsCode">================================= Name &amp; Summary Matched: php-* =================================
php-di-symfony2-bridge.noarch : PHP-DI integration with Symfony
php-fedora-autoloader-devel.noarch : php-fedora-autoloader devel
php-mock.noarch : PHP-Mock can mock built-in PHP functions
php-mock2.noarch : PHP-Mock can mock built-in PHP functions
php-pecl-propro-devel.x86_64 : php-pecl-propro developer files (header)
php-pecl-psr-devel.x86_64 : php-pecl-psr developer files (header)
php-pecl-raphf-devel.x86_64 : php-pecl-raphf developer files (header)
php-punic.noarch : PHP-Unicode CLDR
php-zstd-devel.x86_64 : php-zstd developer files (header)

php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php-cli.x86_64 : Command-line interface for PHP
php-common.x86_64 : Common files for PHP
php-dba.x86_64 : A database abstraction layer module for PHP applications
php-devel.x86_64 : Files needed for building PHP extensions
php-embedded.x86_64 : PHP library for embedding in applications
php-enchant.x86_64 : Human Language and Character Encoding Support
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php-imap.x86_64 : A module for PHP applications that use IMAP
</pre>

<p>
	لتثبيت مكتبة gd:
</p>

<pre class="ipsCode">dnf install php-gd
</pre>

<p>
	تعد توزيعات إنتربرايس لينكس متحفظة دومًا بخصوص التحديثات، ولا تُحدَّث عادةً بعد الإصدار الذي تُرسل معه. توفر عدة مستودعات خارجيةمن طرف ثالث الإصدارات الحالية من PHP:
</p>

<ul>
	<li>
		<a href="%E2%80%8Fhttps://ius.io/" rel="">IUS</a>
	</li>
	<li>
		<a href="%E2%80%8Fhttps://blog.remirepo.net/" rel="">Remi Colette</a>
	</li>
	<li>
		<a href="%E2%80%8Fhttps://webtatic.com/" rel="">Webtatic</a>
	</li>
</ul>

<p>
	يوفر المستودعان IUS وWebtatic حزمًا بديلة بأسماء مختلفة (مثل php56u أو php56w لتثبيت PHP 5.6) بينما يوفر مستودع Remi ترقيات موضعية باستخدام نفس أسماء حزم النظام.
</p>

<p>
	فيما يلي تعليمات تثبيت PHP 7.0 من مستودع Remi، هذا أبسط مثال لإلغاء تثبيت حزم النظام غير المطلوبة.
</p>

<pre class="ipsCode"># ‫تنزيل حزم RPM، استبدل 6 بالرقم 7 في حالة استخدام EL 7
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
wget http://rpms.remirepo.net/enterprise/remi-release-6.rpm

# تثبيت معلومات المستودع
rpm -Uvh remi-release-6.rpm epel-release-latest-6.noarch.rpm

# تمكين المستودع
dnf-config-manager --enable epel --enable remi --enable remi-safe --enable remi-php70

# ‫تثبيت الإصدار الجديد من PHP
# ملاحظة: إذا كانت حزمة النظام مثبّتة بالفعل سابقًا فإنّ هذا الأمر سيحدّثها
dnf install php
</pre>

<h2>
	خرج HTML من خادم الويب
</h2>

<p>
	يمكن أن تُستخدم PHP لإضافة محتوى إلى ملفات HTML. تُعالج صفحات HTML مباشرةً في متصفح الويب أما سكربتات PHP ينفذها خادم الويب ثم يرسل ملف HTML الناتج إلى المتصفح.
</p>

<p>
	تحوي صفحة HTML التالية تعليمة PHP ستضيف عبارة Hello world!‎ إلى الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7771_40" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
    </span><span class="tag">&lt;head&gt;</span><span class="pln">
        </span><span class="tag">&lt;title&gt;</span><span class="pln">PHP!</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="tag">&lt;/head&gt;</span><span class="pln">
    </span><span class="tag">&lt;body&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo </span><span class="str">"Hello world!"</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	عندما تُحفظ بتنسيق ملف برمجي <a href="https://academy.hsoub.com/programming/php/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r2040/" rel="">بلغة PHP</a> وينفذه خادم الويب فإنّه يرسل صفحة HTML التالية إلى المتصفح:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7771_42" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
    </span><span class="tag">&lt;head&gt;</span><span class="pln">
        </span><span class="tag">&lt;title&gt;</span><span class="pln">PHP!</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="tag">&lt;/head&gt;</span><span class="pln">
    </span><span class="tag">&lt;body&gt;</span><span class="pln">
        </span><span class="tag">&lt;p&gt;</span><span class="pln">Hello world!</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	<strong>PHP 5.x: الإصدار 5.4 وما بعده</strong> تتميز تعليمة <code>echo</code> بدءًا من الإصدار 5.4 ومابعده بصياغة مختصرة تتيح لك طباعة قيمة على الفور، أما قبل الإصدار PHP 5.4.0 كانت الصياغة المختصرة تعمل فقط عند تمكين الإعداد <a href="https://www.php.net/manual/en/ini.core.php#ini.short-open-tag" rel="external nofollow">short open tag</a>.
</p>

<p>
	مثلًا، إنّ الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_44" style=""><span class="tag">&lt;p&gt;</span><span class="pun">&lt;?=</span><span class="pln"> </span><span class="str">"Hello world!"</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	خرجها مطابق للخرج الناتج عن الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_46" style=""><span class="tag">&lt;p&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo </span><span class="str">"Hello world!"</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	في بيئة الإنتاج يجب أن تهرّب كل بيانات الخرج الناتجة عن سكربت PHP بشكل صفحة HTML لمنع هجمات البرمجة عبر المواقع (XSS) أو تلف النص (text corruption).
</p>

<p>
	يمكن الاطلاع أيضًا على: السلاسل النصية (strings) و<a href="https://www.php-fig.org/psr/psr-1/" rel="external nofollow">PSR-1‎‏</a>، التي تصف قواعد التنسيق بما في ذلك الاستخدام الأمثل للوسوم القصيرة <code>(&lt;‎?= ... ?‎&gt;)</code>.
</p>

<h2>
	مرحبًا بالعالم!
</h2>

<p>
	البنية الأكثر استخدامًا لطباعة الخرج في <a href="https://academy.hsoub.com/php/" rel="">لغة PHP</a> هي <code>echo</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_48" style=""><span class="pln">echo </span><span class="str">"Hello, World!\n"</span><span class="pun">;</span></pre>

<p>
	ويمكن استخدام <code>print</code> بدلًا من ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_50" style=""><span class="kwd">print</span><span class="pln"> </span><span class="str">"Hello, World!\n"</span><span class="pun">;</span></pre>

<p>
	يؤدي تنفيذ كلا التعليمتين نفس الوظيفة مع اختلافات بسيطة:
</p>

<ul>
	<li>
		ترجع <code>echo</code> قيمة من النوع void، بينما ترجع <code>print</code> عددًا صحيحًا قيمته 1.
	</li>
	<li>
		يمكن أن تأخذ <code>echo</code> عدة وسائط (لكن بدون أقواس)، بينما تأخذ <code>print</code> وسيطًا واحدًا.
	</li>
	<li>
		<code>echo</code> أسرع قليلًا من <code>print</code>.
	</li>
</ul>

<p>
	كل من <code>echo</code> و<code>print</code> هي بنى لغوية، ليست دوالًا. هذا يعني أنها لا تحتاج إلى أقواس لتضم وسائطها لكن يمكن إضافة الأقواس من أجل التناسق الجمالي مع التوابع. تتوافر العديد من الأمثلة عن استخدام <code>echo</code> و<code>print</code> في مكانٍ آخر.
</p>

<p>
	الدالة <code>printf</code> في لغة C والدوال التابعة لها متوافرة أيضًا، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_52" style=""><span class="pln">printf</span><span class="pun">(</span><span class="str">"%s\n"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Hello, World!"</span><span class="pun">);</span></pre>

<p>
	يمكن ملاحظة خرج قيمة المتغير للحصول على نظرة شاملة عن خرج المتغيرات في PHP.
</p>

<h2>
	خرج خادم الويب ليس شيفرة HTML
</h2>

<p>
	قد نحتاج عند العمل مع خادم ويب في بعض الحالات تجاوز نوع المحتوى الافتراضي الذي يرسله خادم الويب، فقد نحتاج مثلًا إلى إرسال البيانات على شكل نص عادي أو بصيغة JSON أو بصيغة XML.
</p>

<p>
	يمكن للدالة <a href="https://www.php.net/manual/en/function.header.php" rel="external nofollow">‏()header‏</a> إرسال ترويسة HTTP خام. يمكننا إضافة الحقل <code>Content-Type</code> إلى الترويسة لإعلام المتصفح بنوع المحتوى الذي نرسله.
</p>

<p>
	في الشيفرة التالية نسند القيمة <code>text/plain</code> إلى الحقل <code>Content-Type</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7771_54" style=""><span class="pln">header</span><span class="pun">(</span><span class="str">"Content-Type: text/plain"</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"Hello World"</span><span class="pun">;</span></pre>

<p>
	سينتج هذا ملفًا نصيًا عاديًا بالمحتوى التالي:
</p>

<pre class="ipsCode">Hello World
</pre>

<p>
	للحصول على محتوى <a href="https://academy.hsoub.com/programming/javascript/%D8%B5%D9%8A%D8%BA%D8%A9-json-%D9%88%D8%AA%D9%88%D8%A7%D8%A8%D8%B9%D9%87%D8%A7-r826/" rel="">‏JSON‏</a> نستخدم نوع المحتوى <code>application/json</code> بدلًا من النوع السابق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_56" style=""><span class="pln">header</span><span class="pun">(</span><span class="str">"Content-Type: application/json"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// P‏H‎P‎ إنشاء مصفوفة بيانات في</span><span class="pln">
$data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"response"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pun">];</span><span class="pln">

</span><span class="com">// نصية صحيحة JSON سيحولها إلى صيغة json_encode </span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">);</span></pre>

<p>
	هذا سينتج ملفًا من النوع <code>application/json</code> وبداخله المحتوى التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_58" style=""><span class="pun">{</span><span class="str">"response"</span><span class="pun">:</span><span class="str">"Hello World"</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّه يجب استدعاء الدالة <a href="https://www.php.net/manual/en/function.header.php" rel="external nofollow">‏()header‏</a> قبل تنفيذ أية عملية خرج، وإلا سيرسل خادم الويب الترويسات للإجابة (response headers). لذا وبحسب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_61" style=""><span class="com">// خطأ: لا يمكننا إرسال أية عملية خرج قبل إرسال الترويسات </span><span class="pln">
echo </span><span class="str">"Hello"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// يجب إرسال كل الترويسات قبل أيّ عملية خرج</span><span class="pln">
header</span><span class="pun">(</span><span class="str">"Content-Type: text/plain"</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"World"</span><span class="pun">;</span></pre>

<p>
	سينتج عن هذا التحذير التالي:
</p>

<pre class="ipsCode">Warning: Cannot modify header information - headers already sent by (output started at /dir/example.php:2) in /dir/example.php on line 3
</pre>

<p>
	عند استعمال الدالة <a href="https://www.php.net/manual/en/function.header.php" rel="external nofollow">‏()header‏</a> فإنّ خرجها يجب أن يكون أول بايت يرسل من الخادم. لهذا السبب يُعد من المهم عدم وجود أسطر فارغة أو مسافات في بداية الملف قبل وسم البداية <code>‎‎&lt;?php‎</code> الخاص بلغة PHP. وللسبب نفسه، يعدّ تجاهل وضع وسم الإغلاق <code>&lt;?‎</code>‎ الخاص بلغة PHP في نهاية الملف عادةً جيدةً (انظر<a href="https://www.php-fig.org/psr/psr-2/#2-2-files" rel="external nofollow">PSR-2‎‏</a>) وذلك للملفات التي تحتوي فقط PHP وكتل الشيفرة المكتوبة بلغة PHP.
</p>

<p>
	يجب مشاهدة قسم الخرج في المخزن المؤقت لمعرفة كيفية "جلب" المحتوى الخاص بك ووضعه في متغيّر قبل عملية إظهاره لاحقًا، مثلًا، بعد ترويسات الإخراج.
</p>

<h2>
	خادم PHP مدمج
</h2>

<p>
	يأتي الإصدار PHP 5.4 وما بعده مع خادم تطوير مدمج يمكن استخدامه لتشغيل التطبيقات بدون الحاجة لتنصيب خادم لتزويد الـ HTTP مثل nginx أو Apache. هذا الخادم المدمج مصمم ليستعمل لأغراض التطوير والاختبار.
</p>

<p>
	يمكن أن يُشغَّل باستخدام الراية <code>S–</code>:
</p>

<pre class="ipsCode">php  ‎–S &lt;host/ip&gt;:&lt;port&gt;
</pre>

<h3>
	مثال عملي
</h3>

<ul>
	<li>
		أنشئ ملف index.php يحتوي على ما يلي:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_63" style=""><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Hello World from built-in PHP server"</span><span class="pun">;</span></pre>

<ul>
	<li>
		نفّذ الأمر <code>php -S localhost:8080</code> باستخدام سطر الأوامر، بدون أن تضيف ‎http‎:‎\‎\‎. عندها يبدأ خادم الويب بالتنصت على المنفذ 8080 ويعدّ المجلد الموجود أنت فيه حاليًا المستند الجذر.
	</li>
	<li>
		افتح المتصفح وانتقل إلى <code><a href="http://localhost:8080" ipsnoembed="true" rel="external nofollow">http://localhost:8080</a></code>. ستشاهد عندها صفحتك "Hello World".
	</li>
</ul>

<h3>
	الإعدادات
</h3>

<p>
	إن أردت تغيير الصفحة الجذر الافتراضية (أي المجلد الحالي)، استخدم الراية <code>t–</code>:
</p>

<pre class="ipsCode">php -S &lt;host/ip&gt;:&lt;port&gt;  ‎–t &lt;directory&gt; 
</pre>

<p>
	مثلًا إذا كان لديك المجلد <code>public‎/‎</code> في مشروعك يمكنك تنفيذ المشروع من هذا المجلد باستخدام الأمر:
</p>

<pre class="ipsCode">php –S localhost:8080 -t public/
</pre>

<h3>
	السجلات
</h3>

<p>
	في كل مرة يُقدم فيها طلب من خادم التطوير يُكتب مدخل سجل مثل الموجود أدناه إلى سطر الأوامر.
</p>

<pre class="ipsCode">[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /
</pre>

<h2>
	واجهة سطر أوامر PHP
</h2>

<p>
	يمكن أيضًا تنفيذ شيفرة PHP مباشرةً عن طريق سطر الأوامر باستخدام CLI (واجهة سطر الأوامر). واجهة سطر الأوامر CLI بشكلٍ أساسي نفس الـ PHP من ناحية خوادم الويب، باستثناء بعض الاختلافات من حيث المدخلات والمخرجات القياسية.
</p>

<h3>
	التشغيل
</h3>

<p>
	توفر واجهة سطر الأوامر في PHP أربع طرائق لتشغيل شيفرة PHP:
</p>

<ul>
	<li>
		دخل قياسي (Standard input): نفذ الأمر <code>php</code> دون أي وسائط ولكن مع تمرير شيفرة PHP عبر أنبوب (pipe) له:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_65" style=""><span class="pln">echo </span><span class="str">'&lt;?php echo "Hello world!";'</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> php</span></pre>

<ul>
	<li>
		اسم الملف كوسيط: نفذ الأمر <code>php</code> مع وضع اسم ملف PHP المصدري كأول وسيط:
	</li>
</ul>

<pre class="ipsCode">php hello_world.php
</pre>

<ul>
	<li>
		الشيفرة كوسيط: استخدم الخيار <code>r‎‎‎‎‎‎‎‎‎‎-</code> في الأمر <code>php</code>، متبوعًا بالشيفرة لتنفيذها. وسم الفتح <code>‎&lt;?php‎‎‎</code> غير مطلوب، إذ يعد كل ما هو في الوسيط شيفرة PHP:
	</li>
</ul>

<pre class="ipsCode">php -r 'echo "Hello world!";'
</pre>

<ul>
	<li>
		الصدفة التفاعلية (interactive shell): استخدم الخيار <code>‎-a</code> في الأمر <code>php</code> للحصول على الصدفة التفاعلية ثم اكتب (أو الصق) شيفرة PHP واضغط <code>return</code>:
	</li>
</ul>

<pre class="ipsCode">$ php -a 
Interactive mode enabled
php &gt; echo "Hello world!"; 
Hello world!
</pre>

<h3>
	الخرج
</h3>

<p>
	كل الدوّال أو المتحكمات التي تعطي خرج HTML في خادم الويب PHP يمكن أن تستخدم لإعطاء خرج في مجرى الخرج القياسي stdout (واصف الملف 1)، وكل الأفعال التي تعطي خرجًا في سجلات الخطأ في خادم الويب PHP ستعطي خرجًا في مجرى الخطأ القياسي stderr (واصف الملف 2).
</p>

<ul>
	<li>
		الملف Example.php:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_67" style=""><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Stdout 1\n"</span><span class="pun">;</span><span class="pln">
    trigger_error</span><span class="pun">(</span><span class="str">"Stderr 2\n"</span><span class="pun">);</span><span class="pln">
    print_r</span><span class="pun">(</span><span class="str">"Stdout 3\n"</span><span class="pun">);</span><span class="pln">
    fwrite</span><span class="pun">(</span><span class="pln">STDERR</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Stderr 4\n"</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">RuntimeException</span><span class="pun">(</span><span class="str">"Stderr 5\n"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span><span class="pln">
Stdout 6</span></pre>

<ul>
	<li>
		سطر أوامر الصدفة:
	</li>
</ul>

<pre class="ipsCode">$ php Example.php 2&gt;stderr.log &gt;stdout.log;\
&gt; echo STDOUT; cat stdout.log; echo;\
&gt; echo STDERR; cat stderr.log\
</pre>

<p>
	تكون المخرجات في مجرى الخرج القياسي STDOUT:
</p>

<pre class="ipsCode">Stdout 1
Stdout 3
</pre>

<p>
	وتكون المخرجات في مجرى الخطأ القياسي STDERR:
</p>

<pre class="ipsCode">Stderr 4
PHP Notice: Stderr 2
in /Example.php on line 3
PHP Fatal error: Uncaught RuntimeException: Stderr 5
in /Example.php:6
Stack trace:
#0 {main}
thrown in /Example.php on line 6
</pre>

<h3>
	الدخل
</h3>

<p>
	انظر واجهة سطر الأوامر.
</p>

<h2>
	فصل التعليمات
</h2>

<p>
	تُنهى كل تعليمة بفاصلة منقوطة، تمامًا مثل جميع اللغات التي تتبع نفس نمط اللغة C، ويُنهى السطر الأخير من كتلة شيفرة PHP بوسم الإغلاق في آخر سطر.
</p>

<p>
	إذا انتهى السطر الأخير من شيفرة PHP بفاصلة منقوطة ولم يتبعه أي سطر شيفرة، فإن وسم الإغلاق اختياري، مثلًا يمكننا ألا نضيف وسم إغلاق بعد <code>; echo "No error"‎</code> في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_69" style=""><span class="pun">&lt;?</span><span class="pln">php echo </span><span class="str">"No error"</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">// لا حاجة لإضافة وسم إغلاق بما أنه لا يوجد شيفرة بعد هذه التعليمة </span></pre>

<p>
	لكن إذا وُجدت أي شيفرة بعد كتلة شيفرة الـPHP فإنّ وسم الإغلاق ليس اختياريًا.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_71" style=""><span class="pun">&lt;?</span><span class="pln">php echo </span><span class="str">"This will cause an error if you leave out the closing tag"</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
    </span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<p>
	يمكننا أيضًا أن نتجاهل الفاصلة المنقوطة للتعليمة الأخيرة في كتلة شيفرة PHP إذا احتوت على وسم الإغلاق:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_73" style=""><span class="pun">&lt;?</span><span class="pln">php echo </span><span class="str">"I hope this helps! :D"</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">"No error"</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	يوصى عمومًا باستخدام الفاصلة المنقوطة دائمًا، واستخدام وسم الإغلاق لكل كتلة شيفرة PHP باستثناء الكتلة الأخيرة إذا لم يتبعها أي شيفرة، لذا يمكن كتابة الشيفرة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_75" style=""><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"!هنا نستخدم فاصلة منقوطة"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here we use a semicolon and a closing tag because more code follows"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Some HTML code goes here</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Here we use a semicolon!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here we use a semicolon and a closing tag because more code follows"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">Some HTML code goes here</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Here we use a semicolon!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here as well!"</span><span class="pun">;</span><span class="pln">
    echo </span><span class="str">"Here we use a semicolon but leave out the closing tag"</span><span class="pun">;</span></pre>

<h2>
	وسوم PHP
</h2>

<p>
	هناك ثلاث أنواع من الوسوم للإشارة إلى كتل PHP ضمن ملف. يبحث محلل (parser) لغة PHP عن وسوم البداية ووسوم الإغلاق (إن وجدت) لتحديد الشيفرة المراد ترجمتها.
</p>

<h3>
	الوسوم القياسية
</h3>

<p>
	هذه الوسوم هي الطريقة القياسية لتضمين شيفرة PHP في ملف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_77" style=""><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Hello World"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	PHP 5.x الإصدار 5.4 وما بعده
</p>

<h3>
	وسوم الطباعة
</h3>

<p>
	هذه الوسوم متوفرة في كل إصدارات الـPHP ومفعلة دائمًا بدءًا من الإصدار PHP 5.4، إذ في الإصدارات السابقة لا يمكن تفعيل وسوم الطباعة إلا بالتزامن مع الوسوم القصيرة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_79" style=""><span class="pun">&lt;?=</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<h3>
	الوسوم القصيرة
</h3>

<p>
	يمكنك تفعيل أو تعطيل هذه الوسوم مع الخيار short<em>open</em>tag.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_81" style=""><span class="pun">&lt;?</span><span class="pln">
    echo </span><span class="str">"Hello World"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	الوسوم القصيرة:
</p>

<ul>
	<li>
		غير مسموحة في جميع <a href="https://www.php-fig.org/psr/psr-1/" rel="external nofollow">معايير كتابة الشيفرة</a> الأساسية للغة PHP.
	</li>
	<li>
		غير مرغوبة في <a href="https://www.php.net/manual/en/language.basic-syntax.phptags.php" rel="external nofollow">التوثيق الرسمي</a>.
	</li>
	<li>
		معطلة افتراضيًا في معظم الإصدارات.
	</li>
	<li>
		تتداخل مع تعليمات معالجة XML المضمنة.
	</li>
	<li>
		غير مقبولة لتسليم الشيفرة في معظم المشاريع المفتوحة المصدر.
	</li>
</ul>

<p>
	<strong>PHP 5.x الإصدار 5.6 وما بعده</strong>
</p>

<h3>
	وسوم ASP (صفحات الخادم النشط)
</h3>

<p>
	يمكن استخدام وسوم نمط لغة ASP (Active Server Pages)‎ عند تفعيل الخيار asp_tags.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_83" style=""><span class="pun">&lt;%</span><span class="pln">
    echo </span><span class="str">"Hello World"</span><span class="pun">;</span><span class="pln">
%&gt;</span></pre>

<p>
	هذه الوسوم غريبة ويجب عدم استخدامها وأُزيلت منذ الإصدار PHP 7.0.
</p>

<h2>
	موازنة النوع
</h2>

<p>
	يوجد نوعان للموازنة: الموازنة المتهاونة (loose comparison) باستخدام <code>==</code> والموازنة الصارمة (strict comparison) باستخدام <code>===</code>، تضمن الموازنة العامة أنّ نوع وقيمة كِلا طرفي العامل (operator) متساويين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_85" style=""><span class="com">// موازنة متهاونة</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"1"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">

</span><span class="com">// موازنة صارمة</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">"1"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">

</span><span class="com">// لا يمكن أن يساوي أي شيء NAN استثناء يجب ملاحظته</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">NAN </span><span class="pun">==</span><span class="pln"> NAN</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">NAN </span><span class="pun">===</span><span class="pln"> NAN</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span></pre>

<p>
	يمكنك أيضًا استخدام الموازنة القوية (strong comparison) للتأكد من عدم تطابق النوع والقيمة باستخدام <code>‎!==‎‎</code>.
</p>

<p>
	المثال النموذجي الذي يعدّ فيه العامل <code>==</code> غير كافٍ عندما تُرجع الدوال أنواعًا مختلفة، مثل الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/strpos" rel="">strpos</a> التي تُرجع <code>false</code> إذا لم تجد المحارف التي نبحث عنها في السلسلة وإلا تُرجع عددًا صحيحًا يمثّل موقعها في السلسلة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_87" style=""><span class="kwd">if</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">'text'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'searchword'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="com">// false تُرجع strpos تعمل الموازنة == كما هو متوقع لأنّ</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">'text bla'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'text'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="com">// true ‏0 هي‏==false‏ونتيجة ‏‎ ‏سترجع الدالة 0 لأنّها وجدت المطلوب في الموقع 0‏</span><span class="pln">
</span><span class="com">// وهذا ليس ما تتوقعه</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">strpos</span><span class="pun">(</span><span class="str">'text'</span><span class="pun">,</span><span class="str">'text'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="com">// لذا تعمل هنا كما تتوقع false ‏0 هي‏===false‏ونتيجة ‏‎ ‏سترجع الدالة 0‏</span></pre>

<h2>
	النوع Boolean (القيم المنطقية)
</h2>

<p>
	القيم المنطقية نوع له إحدى القيمتين <code>true</code> أو <code>false</code>، تعطي الشيفرة التالية القيمة <code>true</code> للمتغير <code>‎$foo</code> والقيمة <code>false</code> للمتغير <code>‎$bar</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_89" style=""><span class="pln">$foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
$bar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span></pre>

<p>
	بما أنّ هاتين القيمتين غير حساستين لحالة الأحرف يمكننا أن نكتب <code>TRUE</code> و<code>FALSE</code> كما يمكننا أن نكتب <code>FaLsE</code>، لكن استخدام الأحرف الصغيرة هو الصيغة الأشهر ويُنصح بها في معظم أدلة نمط الشيفرة مثل <a href="%E2%80%8Fhttps://www.php-fig.org/psr/psr-2/" rel="">PSR-2</a>.
</p>

<p>
	يمكن استخدام القيم المنطقية في تعليمات if كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_91" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
</span><span class="com">// if($foo == true) نفس نتيجة</span><span class="pln">
    echo </span><span class="str">"true"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بما أنّ PHP لغة متهاونة في تحديد النوع (weakly typed) فإذا اُستعمل المتغير <code>‎$foo</code> في موضع يتوقع فيه استعمال قيمة منطقية فستتحول قيمة ذاك المتغير إلى قيمة منطقية إما <code>true</code> أو <code>false</code>.
</p>

<p>
	القيم التالية نتيجتها <code>false</code>:
</p>

<ul>
	<li>
		القيمة الصفرية: 0 (عدد صحيح)، 0.0 (عدد عشري)، '0' (سلسلة نصية).
	</li>
	<li>
		السلسلة النصية الفارغة ' ' أو المصفوفة الفارغة [].
	</li>
	<li>
		القيمة <code>null</code> (محتوى متغير لم تُسند له قيمة، أو إذا أُسندت لمتغيرٍ ما). أي قيم أخرى نتيجتها <code>true</code>.
	</li>
</ul>

<p>
	يمكنك استخدام الموازنة القوية <code>===</code> التي توازن القيمة والنوع لتجنب الموازنة المتهاونة.
</p>

<p>
	يمكنك إضافة (bool) أو (boolean) قبل النوع لتحويله إلى قيمة منطقية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_93" style=""><span class="pln">var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="str">"1"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	أو يمكنك استدعاء الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/boolval" rel="">boolval</a>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_95" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln"> boolval</span><span class="pun">(</span><span class="str">"1"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	تحويل القيمة المنطقية إلى سلسلة نصية (string) مع ملاحظة أنّ قيمة السلسلة الفارغة هي <code>false</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_97" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(1) "1"</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(0) ""</span></pre>

<p>
	تحويل القيمة المنطقية إلى عدد صحيح (integer):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_99" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(1)</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(0)</span></pre>

<p>
	لاحظ أنّه يمكننا أن نقوم بالعملية المعاكسة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_101" style=""><span class="pln">var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(false)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span></pre>

<p>
	وأيضًا القيم غير الصفرية تُرجع <code>true</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_103" style=""><span class="pln">var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="str">"foo"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="lit">2.3e5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> array</span><span class="pun">(</span><span class="lit">12</span><span class="pun">));</span><span class="pln"> </span><span class="com">// bool(true)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> array</span><span class="pun">());</span><span class="pln"> </span><span class="com">// bool(false)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="str">"false"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span></pre>

<h2>
	النوع Float (الأعداد العشرية)
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_105" style=""><span class="pln">$float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.123</span><span class="pun">;</span></pre>

<p>
	ملاحظة: يُرجع التابع <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/gettype" rel="">gettype()‎</a> عند استخدامه لعدد عشري القيمة "double" وليس "float" وذلك لأسباب تاريخية.
</p>

<p>
	تسمح الأعداد العشرية بدقة خرج أكبر من الأعداد الصحيحة البسيطة، ويمكن استخدام الأعداد العشرية والصحيحة معًا بسبب التحويل بين أنواع المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_107" style=""><span class="pln">$sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.14</span><span class="pun">;</span><span class="pln">
echo $sum</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 3.14</span></pre>

<p>
	لا تُظهر PHP العدد العشري على أنّه عدد عشري مثل اللغات الباقية، مثلًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_109" style=""><span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
echo </span><span class="pun">((</span><span class="kwd">float</span><span class="pun">)</span><span class="pln"> $var</span><span class="pun">);</span><span class="pln"> 
</span><span class="com">// تُرجع 1 وليس 1.0</span></pre>

<p>
	<strong>تحذير: دقة الفاصلة العشرية (Floating point precision)</strong>
</p>

<p>
	من <a href="%E2%80%8Fhttps://www.php.net/manual/en/language.types.float.php" rel="">دليل PHP</a>:
</p>

<p>
	الأرقام العشرية ذات دقة محدودة (الدقة تعني عدد الأرقام بعد الفاصلة)، بالرغم من أنّ هذا يعتمد على النظام إلا أنّ PHP تعطي عادةً أقصى خطأ نسبي بسبب التقريب بترتيب 1.11e-16، قد تعطي العمليات الحسابية غير البسيطة أخطاءً أكبر ويجب الانتباه لانتشار الخطأ عند تفاقم العمليات المتعددة.
</p>

<p>
	بالإضافة إلى ذلك فإنّ الأرقام المنطقية التي يمكن تمثيلها بأعداد عشرية بالأساس 10 مثل 0.1 أو 0.7، ليس لها تمثيل بالأعداد العشرية بالأساس 2 (ثنائية) والتي تُستخدم داخليًا بغض النظر عن حجم الجزء العشري، وبالتالي لا يمكن تحويلها إلى نظائرها الثنائية الداخلية دون فقدان بسيط للدقة، مثلًا تُرجع عادةً التعليمة <code>floor((0.1+0.7)*10)‎</code> القيمة 7 بدلًا من القيمة المتوقعة 8 لأنّ التمثيل الداخلي سيكون تقريبًا 7.9999999999999991118….
</p>

<p>
	لذا لا تثق بنتائج الأعداد العشرية أبدًا حتى الرقم الأخير ولا توازن الأعداد العشرية مباشرةً في المساواة، ويمكنك استخدام دوال الحساب الدقيق التعسفي (arbitrary precision math) أو دوال مكتبة GMP، إذا كانت الدقة العالية مطلوبة.
</p>

<h2>
	النوع Strings (السلاسل النصية)
</h2>

<p>
	السلسلة النصية في PHP هي سلسلة من المحارف أحادية البايت (أي لا يوجد دعم لترميز يونيكود أصلي) ويمكن تعريفها بأربعة طرق:
</p>

<h3>
	السلاسل ذات الاقتباس المفرد (Single Quoted)
</h3>

<p>
	تعرض الأشياء تقريبًا بالكامل كما هي، دون ترجمة المتغيرات وسلاسل الهروب، الاستثناء من ذلك فقط عند عرض اقتباس حرفي، يمكنك عرض خط مائل عكسي ضمنه عن طريق الهروب بخط مائل عكسي آخر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_111" style=""><span class="pln">$my_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Nothing is parsed, except an escap\'d apostrophe or backslash. $foo\n'</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_string</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
string(68) "Nothing is parsed, except an escap'd apostrophe or backslash. $foo\n"
*/</span></pre>

<h3>
	السلاسل ذات الاقتباس المزدوج (Double Quoted)
</h3>

<p>
	ستُترجم في هذه السلاسل أسماء المتغيرات البسيطة و<a href="https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double" rel="external nofollow">سلاسل الهروب</a> على عكس سلاسل الاقتباس المفرد، يمكن استخدام القوسان المعقوصان (Curly braces) (كما في المثال الأخير) لعزل أسماء المتغير المعقدة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_113" style=""><span class="pln">$variable1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Testing!"</span><span class="pun">;</span><span class="pln">
$variable2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Testing?"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"Failure"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Success"</span><span class="pln"> </span><span class="pun">]</span><span class="pln"> </span><span class="pun">];</span><span class="pln">
$my_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Variables and escape characters are parsed:\n\n"</span><span class="pun">;</span><span class="pln">
$my_string </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"$variable1\n\n$variable2[0]\n\n"</span><span class="pun">;</span><span class="pln">
$my_string </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"There are limits: $variable2[1][0]"</span><span class="pun">;</span><span class="pln">
$my_string </span><span class="pun">.=</span><span class="pln"> </span><span class="str">"But we can get around them by wrapping the whole variable in braces:
{$variable2[1][1]}"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_string</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
string(98) "Variables and escape characters are parsed:
Testing!
Testing?
There are limits: Array[0]"
But we can get around them by wrapping the whole variable in braces: Success
*/</span></pre>

<h3>
	صيغة Heredoc
</h3>

<p>
	تُحلّل أسماء المتغيرات وسلاسل الهروب في السلاسل ذات الصيغة Heredoc بطريقة مشابهة لسلاسل الاقتباس المزدوج، ومع ذلك فإنّ الأقواس غير متاحة لأسماء المتغير المعقدة. تُحدّد بداية السلسلة بـ مُعرّف <code>&gt;&gt;&gt;</code>، وتنتهي بمُعرّف والمعرّف هو أي اسم PHP صحيح، يجب أن يظهر معرّف النهاية على سطر لوحده، ولا يُنصح بوجود مسافة بيضاء قبل أو بعد المُعرّف على الرغم من أنّه يجب إنهاؤه بفاصلة منقوطة نفس أي سطر في PHP.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_115" style=""><span class="pln">$variable1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Including text blocks is easier"</span><span class="pun">;</span><span class="pln">
$my_string </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;&lt;</span><span class="pln"> EOF
</span><span class="typ">Everything</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> parsed </span><span class="kwd">in</span><span class="pln"> the same fashion </span><span class="kwd">as</span><span class="pln"> a </span><span class="kwd">double</span><span class="pun">-</span><span class="pln">quoted </span><span class="kwd">string</span><span class="pun">,</span><span class="pln">
but there are advantages</span><span class="pun">.</span><span class="pln"> $variable1</span><span class="pun">;</span><span class="pln"> database queries </span><span class="kwd">and</span><span class="pln"> HTML output
can benefit </span><span class="kwd">from</span><span class="pln"> </span><span class="kwd">this</span><span class="pln"> formatting</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Once</span><span class="pln"> we hit a line containing nothing but the identifier</span><span class="pun">,</span><span class="pln"> the </span><span class="kwd">string</span><span class="pln"> ends</span><span class="pun">.</span><span class="pln">
EOF</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_string</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
string(268) "Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. Including text blocks is easier; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends."
*/</span></pre>

<h3>
	صيغة Nowdoc
</h3>

<p>
	تشبه سلاسل الصيغة nowdoc نسخة سلاسل الاقتباس المفرد من الصيغة heredoc بالرغم من أنّ معظم سلاسل الهروب الأساسية لا تُقيَّم، ويُحتوى معرّف بداية السلسلة باقتباس مفرد.
</p>

<p>
	<strong>PHP 5.x: الإصدار 5.3 وما بعده</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_117" style=""><span class="pln">$my_string </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;&lt;</span><span class="pln"> </span><span class="str">'EOF'</span><span class="pln">
A similar syntax to heredoc but</span><span class="pun">,</span><span class="pln"> similar to single quoted strings</span><span class="pun">,</span><span class="pln">
nothing </span><span class="kwd">is</span><span class="pln"> parsed </span><span class="pun">(</span><span class="kwd">not</span><span class="pln"> even escaped apostrophes \' </span><span class="kwd">and</span><span class="pln"> backslashes \\</span><span class="pun">.)</span><span class="pln">
EOF</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_string</span><span class="pun">);</span><span class="pln">

</span><span class="com">/*
string(116) "A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)"
*/</span></pre>

<h2>
	قابلية الاستدعاء
</h2>

<p>
	يمكن إطلاق صفة قابلية الاستدعاء على أي شيء يمكن أن يُستدعى رد نداء (callback)، الأشياء التالية يمكن أن نسميها رد نداء:
</p>

<ul>
	<li>
		الدوال مجهولة الاسم
	</li>
	<li>
		دوال PHP القياسية (وليس بنى اللغة)
	</li>
	<li>
		الأصناف الساكنة
	</li>
	<li>
		الأصناف غير الساكنة (باستخدام صيغة بديلة)
	</li>
	<li>
		الكائن المعرّف/ توابع الصنف
	</li>
	<li>
		الكائنات، مادام الكائن موجود عند الموقع 0 من المصفوفة
	</li>
</ul>

<p>
	مثال لمرجعية كائن كمصفوفة عناصر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_119" style=""><span class="pln">$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
call_user_func</span><span class="pun">([</span><span class="pln">$obj</span><span class="pun">,</span><span class="pln"> </span><span class="str">'myCallbackMethod'</span><span class="pun">]);</span></pre>

<p>
	يمكن أن تدل ردود النداء على النوع القابل للاستدعاء بدءًا من PHP 5.4:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_121" style=""><span class="pln">$callable </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'value'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> call_something</span><span class="pun">(</span><span class="pln">callable $fn</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    call_user_func</span><span class="pun">(</span><span class="pln">$fn</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

call_something</span><span class="pun">(</span><span class="pln">$callable</span><span class="pun">);</span></pre>

<h2>
	الموارد
</h2>

<p>
	<a href="https://wiki.hsoub.com/PHP/resource" rel="external">المورد</a> هو متغير خاص يحمل مرجعيةً إلى مورد خارجي مثل ملف أو مقبس (socket) أو مجرى (stream) أو صفحة أو اتصال.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_123" style=""><span class="pln">$file </span><span class="pun">=</span><span class="pln"> fopen</span><span class="pun">(</span><span class="str">'/etc/passwd'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'r'</span><span class="pun">);</span><span class="pln">

echo gettype</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">);</span><span class="pln">
</span><span class="com"># resource</span><span class="pln">

echo $file</span><span class="pun">;</span><span class="pln">
</span><span class="com"># Resource id #2</span></pre>

<p>
	يوجد أنواع وأنواع فرعية مختلفة للموارد، يمكنك الحصول على نوع المورد باستخدام الدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/get_resource_type" rel="">get<em>resource</em>type()‎</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_125" style=""><span class="pln">$file </span><span class="pun">=</span><span class="pln"> fopen</span><span class="pun">(</span><span class="str">'/etc/passwd'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'r'</span><span class="pun">);</span><span class="pln">
echo get_resource_type</span><span class="pun">(</span><span class="pln">$file</span><span class="pun">);</span><span class="pln">
</span><span class="com"># stream</span><span class="pln">

$sock </span><span class="pun">=</span><span class="pln"> fsockopen</span><span class="pun">(</span><span class="str">'www.google.com'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">);</span><span class="pln">
echo get_resource_type</span><span class="pun">(</span><span class="pln">$sock</span><span class="pun">);</span><span class="pln">
</span><span class="com"># stream</span></pre>

<p>
	يمكنك إيجاد قائمة كاملة من أنواع الموارد المدمجة <a href="https://www.php.net/manual/en/resource.php" rel="external nofollow">هنا</a>.
</p>

<h2>
	التحويل بين الأنواع
</h2>

<p>
	تُقدّر PHP بشكلٍ عام نوع البيانات الذي تنوي استخدامه بشكلٍ صحيح من السياق الذي اُستخدمت به، لكن من المفيد أحيانًا أن تفرض نوع ما يدويًا. يمكنك القيام بذلك بأن تبدأ التصريح بإضافة اسم النوع المطلوب بين قوسين:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_127" style=""><span class="pln">$bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$bool</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool(true)</span><span class="pln">

$int </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$int</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(1)</span><span class="pln">

$string </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(1) "1"</span><span class="pln">

$string </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">string</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string(0) ""</span><span class="pln">

$float </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">float</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$float</span><span class="pun">);</span><span class="pln"> </span><span class="com">// float(1)</span><span class="pln">

$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'x'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'y'</span><span class="pun">];</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">object</span><span class="pun">)</span><span class="pln"> $array</span><span class="pun">);</span><span class="pln"> </span><span class="com">// object(stdClass)#1 (1) { ["x"]=&gt; string(1) "y" }</span><span class="pln">

$object </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">();</span><span class="pln">
$object</span><span class="pun">-&gt;</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="str">'y'</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="pln">array</span><span class="pun">)</span><span class="pln"> $object</span><span class="pun">);</span><span class="pln"> </span><span class="com">// array(1) { ["x"]=&gt; string(1) "y" }</span><span class="pln">

$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"asdf"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="pln">unset</span><span class="pun">)</span><span class="pln">$string</span><span class="pun">);</span><span class="pln"> </span><span class="com">// NULL</span></pre>

<p>
	لكن يجب أن تكون حذرًا إذ لا تعمل كل عمليات التحويل بين البيانات كما تتوقع:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_129" style=""><span class="com">// (PHP_INT_MAX=2147483647) لدينا 3 تعليمات في أنظمة 32 بت حيث</span><span class="pln">
</span><span class="com">// سيحوّل تلقائيًا إلى عدد عشري PHP_INT_MAX أي عدد صحيح قيمته أكبر من</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln"> </span><span class="lit">999888777666</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// float(999888777666)</span><span class="pln">

</span><span class="com">// سيؤدي إلى الطفحان (int) التحويل القسري إلى</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="lit">999888777666</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(-838602302)</span><span class="pln">

</span><span class="com">// PHP_INT_MAX لكن إذا حولنا القيمة على أنها سلسلة نصية ستُرجع لنا قيمة</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="str">"999888777666"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(2147483647)</span><span class="pln">

var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="pun">[]);</span><span class="pln"> </span><span class="com">// bool(false) (empty array)</span><span class="pln">
var_dump</span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">false</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// bool(true) (non-empty array)</span></pre>

<h2>
	التعامل مع الأنواع
</h2>

<p>
	PHP هي لغة متهاونة في تحديد النوع، لا تطلب التصريح عن نوع المتغير عند تعريفه لأنه نوعه يُحدَّد حسب السياق الذي سيستخدم هذا المتغير فيه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_131" style=""><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// string</span><span class="pln">

$a </span><span class="pun">=</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// integer (4)</span><span class="pln">

$a </span><span class="pun">=</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// float (4.5)</span><span class="pln">

$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"2 oranges"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// integer (3)</span></pre>

<h2>
	Null
</h2>

<p>
	إذا كانت القيمة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/null" rel="">null</a> في php مسندة إلى متغير، فيعد ذاك المتغير عديم القيمة وهي تشبه نوعًا ما المؤشر إلى فراغ (null pointer) في لغة C أو القيمة NULL في SQL.
</p>

<p>
	إسناد القيمة null للمتغير:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_133" style=""><span class="com">// إسناد مباشر</span><span class="pln">
$nullvar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

</span><span class="com">// هذه الدالة لا ترجع شيئًا</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> doSomething</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// $nullvar إلى null لذا أُسنِدت </span><span class="pln">
$nullvar </span><span class="pun">=</span><span class="pln"> doSomething</span><span class="pun">();</span></pre>

<p>
	التحقق فيما إذا أُسندت القيمة null لمتغيرٍ ما:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_135" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">is_null</span><span class="pun">(</span><span class="pln">$nullvar</span><span class="pun">)){</span><span class="pln"> 
    </span><span class="com">/* null قيمة المتغير هي */</span><span class="pln"> 
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$nullvar </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
    </span><span class="com">/* null قيمة المتغير هي */</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<p>
	<strong>القيمة null مقابل المتغير غير المعرّف (undefined variable)</strong>
</p>

<p>
	إذا لم يُعرّف المتغير أولم تُسند قيمة له فعندها أي تحقق من عدم كونه null سيكون ناجحًا وسيُظهر لك الرسالة <code>Notice: Undefined variable: nullvar:‎</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_137" style=""><span class="pln">$nullvar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
unset</span><span class="pun">(</span><span class="pln">$nullvar</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$nullvar </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// صحيح لكن ستُطبع رسالة أيضًا</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">is_null</span><span class="pun">(</span><span class="pln">$nullvar</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// صحيح لكن ستُطبع رسالة أيضًا</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لذا يجب التحقق من القيم غير المعرّفة بالدالة <a href="%E2%80%8Fhttps://wiki.hsoub.com/PHP/isset" rel="">isset</a>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_139" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$nullvar</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// أو غير معرّف null المتغير قيمته</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	الأعداد الصحيحة
</h2>

<p>
	يمكن وصف الأعداد الصحيحة في PHP بالأساس 2 (ثنائي) أو بالأساس 8 (ثماني) أو بالأساس 10 (عشري) أو بالأساس 16 (ست عشري).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_141" style=""><span class="pln">$my_decimal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">;</span><span class="pln">
$my_binary </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0b101010</span><span class="pun">;</span><span class="pln">
$my_octal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">052</span><span class="pun">;</span><span class="pln">
$my_hexadecimal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x2a</span><span class="pun">;</span><span class="pln">

echo </span><span class="pun">(</span><span class="pln">$my_binary </span><span class="pun">+</span><span class="pln"> $my_octal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">  </span><span class="com">//42</span><span class="pln">
</span><span class="com">// الخرج دائمًا بالقيمة العشرية</span></pre>

<p>
	طول الأعداد الصحيحة إما 32 بت أو 64 بت ويعتمد ذلك على المنصة، يُعبّرالثابت <code>PHP_INT_SIZE</code> عن طول العدد الصحيح مقدّرًا بالبايت، ومتوفرة الثوابت <code>PHP_INT_MAX</code> و<code>PHP_INT_MIN</code> (منذ الإصدار PHP 7.0) أيضًا.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_143" style=""><span class="pln">printf</span><span class="pun">(</span><span class="str">"Integers are %d bits long"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_EOL</span><span class="pun">,</span><span class="pln"> PHP_INT_SIZE </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">);</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"They go up to %d"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> PHP_EOL</span><span class="pun">,</span><span class="pln"> PHP_INT_MAX</span><span class="pun">);</span></pre>

<p>
	تُنشأ القيم الصحيحة تلقائيًا وفقًا للحاجة من الأعداد العشرية والقيم المنطقية والسلاسل النصية. ويمكن عند الحاجة إلى التحويل بين الأنواع استخدام (int) أو (integer):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_145" style=""><span class="pln">$my_numeric_string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"123"</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_numeric_string</span><span class="pun">);</span><span class="pln">
</span><span class="com">// string(3) "123"</span><span class="pln">

$my_integer </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">$my_numeric_string</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$my_integer</span><span class="pun">);</span><span class="pln">
</span><span class="com">// int(123)</span></pre>

<p>
	سيُعالَج طفحان العدد الصحيح (Integer overflow) بالتحويل إلى float (عدد عشري):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_147" style=""><span class="pln">$too_big_integer </span><span class="pun">=</span><span class="pln"> PHP_INT_MAX </span><span class="pun">+</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$too_big_integer</span><span class="pun">);</span><span class="pln">
</span><span class="com">// float(9.2233720368548E+18)</span></pre>

<p>
	لا يوجد عامل تقسيم صحيح في PHP، لكن يمكن محاكاته باستخدام التحويل الضمني بين الأنواع الذي يقرّب دائمًا بالتخلص من الجزء العشري، أُضيفت دالة التقسيم الصحيح بدءًا PHP من الإصدار 7.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_149" style=""><span class="pln">$not_an_integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
var_dump</span><span class="pun">(</span><span class="pln">$not_an_integer</span><span class="pun">);</span><span class="pln">
</span><span class="com">// float(6.25)</span><span class="pln">

var_dump</span><span class="pun">((</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> </span><span class="pun">(</span><span class="lit">25</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">));</span><span class="pln"> 
</span><span class="com">// int(6)</span><span class="pln">

var_dump</span><span class="pun">(</span><span class="pln">intdiv</span><span class="pun">(</span><span class="lit">25</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">));</span><span class="pln"> </span><span class="com">// PHP7 كما في</span><span class="pln">
</span><span class="com">// int(6)</span></pre>

<p>
	لاحظ أنّنا نحتاج الأقواس الزائدة حول ‎ (25 / 4)‎لأنّ أولوية التحويل بين الأنواع (int) أعلى من أولوية القسمة.
</p>

<h2>
	التعليقات
</h2>

<h3>
	التعليقات المكونة من سطرٍ واحدٍ
</h3>

<p>
	تبدأ التعليقات المكونة من سطرٍ واحد بـ <code>//</code> أو <code>#</code>، سيتجاهل مترجم PHP كل ما يأتي إلى يمين هاتين العلامتين.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_151" style=""><span class="com">// هذا تعليق</span><span class="pln">
</span><span class="com"># هذا أيضًا تعليق</span><span class="pln">
echo </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// // هنا يوجد تعليق أيضًا بدءًا من العلامة</span></pre>

<h3>
	التعليقات المكونة من عدة أسطر
</h3>

<p>
	تُستخدم التعليقات المكونة من عدة أسطر للتعليق على كتل شيفرة كبيرة، تبدأ بـ <code>‎/*‎</code> وتنتهي بـ <code>‎*/‎‎</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_153" style=""><span class="com">/* هذا تعليق متعدد الأسطر
يمتد على عدة أسطر
هذا السطر أيضًا من ضمن التعليق
*/</span></pre>

<h2>
	PSR
</h2>

<p>
	إنّ <a href="%E2%80%8Fhttps://www.php-fig.org/psr/" rel="">PSR</a> ‏(PHP Standards Recommendation) سلسلة من التوصيات التي جُمعت من قِبل <a href="%E2%80%8F%E2%80%8Fhttps://www.php-fig.org/" rel="">FIG</a> ‏(Framework Interop Group).
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		الفكرة من وراء المجموعة هي أن يتحدث ممثلو المشروع عن القواسم المشتركة بين مشاريعنا ويجدوا الطرق التي يمكننا بها العمل معًا. <a href="%E2%80%8Fhttps://www.php-fig.org/faqs/%E2%80%8F" rel="">الأسئلة الشائعة في FIG</a>
	</p>
</blockquote>

<p>
	يمكن أن تكون PSR في إحدى الحالات: مقبولة أو قيد المراجعة أو مسودة أو مهملة.
</p>

<h3>
	PSR-4: المحمِّل التلقائي (Autoloader)
</h3>

<p>
	PSR4 هي توصية مقبولة تحدد معيار أصناف التحميل التلقائي عبر أسماء الملفات، ويوصى بها كبديل للتوصية السابقة (والمهملة حاليًا) <a href="%E2%80%8Fhttps://www.php-fig.org/psr/psr-0/" rel="">PSR-0</a>.
</p>

<p>
	يجب أن يطابق اسم الصنف المؤهل بالكامل المتطلب التالي:
</p>

<pre class="ipsCode">\&lt;NamespaceName&gt;(\&lt;SubNamespaceNames&gt;)*\&lt;ClassName&gt;
</pre>

<ul>
	<li>
		يجب أن يحتوي على فضاء اسم المورد (vendor) العالي المستوى (مثل Alphabet).
	</li>
	<li>
		قد يحتوي على فضاء اسم فرعي واحد أو أكثر (مثل Google\AdWord).
	</li>
	<li>
		يجب أن يحتوي على اسم الصف النهائي (مثل KeywordPlanner).
	</li>
</ul>

<p>
	وبالتالي يكون اسم الصنف النهائي <code>Alphabet\Google\AdWord\KeywordPlanner</code>، ويجب أن يُترجم اسم الصنف المؤهل بالكامل إلى مسار ملف ذو معنى لذا يوجد <code>Alphabet\Google\AdWord\KeywordPlanner</code> في الملف <code>‎[path_to_source]/Alphabet/Google/AdWord/KeywordPlanner.php</code>.
</p>

<p>
	بدءًا من الإصدار PHP 5.3.0 يمكننا تعريف <a href="https://www.php.net/manual/en/function.spl-autoload-register.php" rel="external nofollow">دالة محمِّل تلقائي مخصصة</a> لتحميل ملفات بالاعتماد على نمط المسار واسم الملف الذي تعرفه.
</p>

<pre class="ipsCode">// ‫عدّل شيفرة php لتضمين صنف بشكلٍ مشابه للتالي
spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php';});
</pre>

<p>
	استبدل الموقع <code>('classes/')</code> ولاحقة اسم الملف <code>('.class.php')</code> بالقيم التي تناسب الهيكلية الخاصة بك.
</p>

<p>
	يدعم مدير حزمة المُنشئ <a href="%E2%80%8Fhttps://getcomposer.org/doc/01-basic-usage.md#autoloading%E2%80%8F" rel="">PSR-4</a> مما يعني أنّه إذا اتبعت المعيار فإنّه يمكنك تحميل الأصناف في مشروعك بشكلٍ تلقائي باستخدام المحمّل التلقائي لمورد المُنشئ.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_155" style=""><span class="com">// ‫عدّل ملف composer.json للتضمين</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="str">"autoload"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"psr-4"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="str">"Alphabet\\"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"[path_to_source]"</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أعد توليد ملف المحمِّل التلقائي:
</p>

<pre class="ipsCode">$ composer dump-autoload
</pre>

<p>
	يمكنك بعدها أن تكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_157" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">require</span><span class="pln"> __DIR__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">'/vendor/autoload.php'</span><span class="pun">;</span><span class="pln">
$KeywordPlanner </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Alphabet</span><span class="pln">\Google\AdWord\KeywordPlanner</span><span class="pun">();</span></pre>

<h3>
	PSR-1: معيار التشفير الأساسي
</h3>

<p>
	<a href="%E2%80%8Fhttps://www.php-fig.org/psr/psr-1/" rel="">PSR-1</a> توصية مقبولة وتحدد توصية المعيار الأساسية التي يجب أن تُكتب بها شيفرة PHP.
</p>

<ul>
	<li>
		تحدد اصطلاحات التسمية للأصناف والتوابع والثوابت.
	</li>
	<li>
		تجعل تبنّي توصيات PSR-0 وPSR-4 مطلبًا.
	</li>
	<li>
		تُشير إلى وسوم PHP التي يجب أن تُستخدم <code>‎&lt;?php</code> و<code>‎‎&lt;?=‎</code> وليس <code>‎&lt;?‎</code>.
	</li>
	<li>
		تحدد نمط ترميز الملف الذي يجب أن يُستخدم (UTF8).
	</li>
	<li>
		وتنص أيضًا على أنّ الملفات يجب إما أن تصرّح عن رموز جديدة (أصناف، دوال، ثوابت…) ولا تسبب تأثيرات جانبية أو تنفّذ منطق ما مع تأثيرات جانبية ولا تعرّف رموز لكن تفعل كليهما.
	</li>
</ul>

<h2>
	أداة PHPDoc
</h2>

<h3>
	وصف متغير
</h3>

<p>
	يمكن استخدام الكلمة المفتاحية <code>‎@var</code> لوصف نوع واستخدام:?
</p>

<ul>
	<li>
		خاصيّة صنف
	</li>
	<li>
		متغير محلي أو عالمي
	</li>
	<li>
		ثابت صنف أو عالمي
	</li>
</ul>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_159" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Example</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ‫‎@var سلسلة نصية تبقى ثابتة</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> UNCHANGING </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Untouchable"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// ‫‎@var سلسلة نصية ما</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> $some_str</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// ‫‎@var المتغير ‎$stuff مصفوفة? فيها مجموعة أشياء</span><span class="pln">
    </span><span class="com">// ‫‎@var المتغير ‎$nonsense مصفوفة أيضًا</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $stuff</span><span class="pun">,</span><span class="pln"> $nonsense</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">…</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن يكون النوع إحدى أنواع PHP المضمنة أو اسم صنف معرَّف من قِبل المستخدم متضمنًا فضاءات الأسماء، ويجب أن يُضمَّن اسم المتغير لكن يمكن تجاوزه إذا طُبِّقت صيغة docblock على عنصر واحد فقط.
</p>

<h3>
	إضافة بيانات وصفية إلى الدوال
</h3>

<p>
	تساعد التوصيفات على مستوى الدالة بيئات التطوير المتكاملة (IDEs) في تحديد القيم المعادة أو الشيفرة التي يحتمل أن تكون خطيرة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_161" style=""><span class="com">/**
* إضافة رقمين إلى بعضهما
* ‎@param Int $a المعامل الأول في الإضافة
* ‎@param Int $b المعامل الثاني في الإضافة
* ‎@return Int
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> sum</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
* ‫لا تنفّذني! سأرمي استثناء دائمًا
* @throws Exception Always
*/</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> dangerousCode</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Exception</span><span class="pun">(</span><span class="str">'Ouch, that was dangerous!'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
* يجب إهمال الهياكل القديمة حتى تعرف الناس أنه لا يجب استخدامها
* @deprecated
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> oldCode</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    mysql_connect</span><span class="pun">(</span><span class="com">/* ... */</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	وصف المعاملات
</h3>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_163" style=""><span class="com">/**
*
* المعاملات
* @param int $int
* @param string $string
* @param array $array
* @param bool $bool
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> demo_param</span><span class="pun">(</span><span class="pln">$int</span><span class="pun">,</span><span class="pln"> $string</span><span class="pun">,</span><span class="pln"> $array</span><span class="pun">,</span><span class="pln"> $bool</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
* المعاملات - اختيارية / افتراضية
*
* @param int $int
* @param string $string
* @param array $array
* @param bool $bool
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> demo_param_optional</span><span class="pun">(</span><span class="pln">$int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> $string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> $array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> $bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
* المعاملات - مصفوفات
*
* @param array $mixed
* @param int[] $integers
* @param string[] $strings
* @param bool[] $bools
* @param string[]|int[] $strings_or_integers
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> demo_param_arrays</span><span class="pun">(</span><span class="pln">$mixed</span><span class="pun">,</span><span class="pln">$integers</span><span class="pun">,</span><span class="pln"> $strings</span><span class="pun">,</span><span class="pln"> $bools</span><span class="pun">,</span><span class="pln"> $strings_or_integers</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/**
* المعاملات - مركبة
* @param array $config
* &lt;pre&gt;
* $params = [
* 'hostname' =&gt; (string) DB hostname. Required.
* 'database' =&gt; (string) DB name. Required.
* 'username' =&gt; (string) DB username. Required.
* ]
* &lt;/pre&gt;
*/</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> demo_param_complex</span><span class="pun">(</span><span class="pln">$config</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	المجموعات (collections)
</h3>

<p>
	تقترح <a href="%E2%80%8Fhttps://github.com/php-fig/fig-standards/blob/211063eed7f4d9b4514b728d7b1810d9b3379dd1/proposed/phpdoc.md#collections" rel="">PSR-5</a> شكل تدوين معمّم للمجموعات.
</p>

<p>
	<strong>الصيغة المعمّمة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_165" style=""><span class="typ">Type</span><span class="pun">[]</span><span class="pln">
</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">&gt;</span><span class="pln">
</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">[,</span><span class="pln"> </span><span class="typ">Type</span><span class="pun">]...&gt;</span><span class="pln">
</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">[|</span><span class="typ">Type</span><span class="pun">]...&gt;</span></pre>

<p>
	قد تكون القيم في مجموعة إما مصفوفة أخرى أو حتى مجموعة أخرى.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_167" style=""><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">&gt;&gt;</span><span class="pln">
</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">[,</span><span class="pln"> </span><span class="typ">Type</span><span class="pun">]...&gt;&gt;</span><span class="pln">
</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">[|</span><span class="typ">Type</span><span class="pun">]...&gt;&gt;</span></pre>

<p>
	<strong>أمثلة</strong>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_169" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">/**
* @var ArrayObject&lt;string&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;int&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;stdClass&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">(),</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">()</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;string|int|stdClass|bool&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="str">'a'</span><span class="pun">,</span><span class="pln">
    </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'b'</span><span class="pun">,</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">(),</span><span class="pln">
    </span><span class="str">'c'</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">2</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;ArrayObject&lt;int&gt;&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">]),</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">])</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;int, string&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="lit">1</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">2</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'b'</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;string, int&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="pun">]);</span><span class="pln">

</span><span class="com">/**
* @var ArrayObject&lt;string, stdClass&gt; $name
*/</span><span class="pln">
$name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayObject</span><span class="pun">([</span><span class="pln">
    </span><span class="str">'a'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">(),</span><span class="pln">
    </span><span class="str">'b'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> stdClass</span><span class="pun">()</span><span class="pln">
</span><span class="pun">]);</span></pre>

<h3>
	إضافة بيانات وصفية إلى الملفات
</h3>

<p>
	تُطبَّق البيانات الوصفية من مستوى الملف على كامل شيفرة الملف ويجب أن تُكتب في أعلاه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_171" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">/**
* @author John Doe (jdoe@example.com)
* @copyright MIT
*/</span></pre>

<h3>
	وراثة البيانات الوصفية من هياكل الآباء
</h3>

<p>
	إذا ورث الصنف صنفًا آخر وكان يستخدم نفس البيانات الوصفية فيمكن أن نضيف له <code>‎@inheritDoc</code> ليستخدم نفس التوثيق، إذا ورث عدة أصناف صنفًا أساسيًا فيجب تغيير الصنف الأب فقط حتى يتأثر كل الأصناف الأبناء.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7771_173" style=""><span class="kwd">abstract</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">FooBase</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">/**
    * ‎@param Int $a المعامل الأول في الإضافة
    * ‎@param Int $b المعامل الثاني في الإضافة
    * ‎@return Int
    */</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> sum</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ConcreteFoo</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">FooBase</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">/**
    * @inheritDoc
    */</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> sum</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $a </span><span class="pun">+</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	خادم PHP المدمج
</h2>

<table>
	<tbody>
	</tbody>
	<thead>
		<tr>
			<th>
				العمود
			</th>
			<th>
				التفاصيل
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				‎-S
			</td>
			<td>
				‫تخبر php بأننا نريد خادم ويب
			</td>
		</tr>
		<tr>
			<td>
				<hostname></hostname> &lt;hostname&gt;:&lt;port&gt;
			</td>
			<td>
				اسم المضيف ورقم المنفذ الذي نريد استخدامه
			</td>
		</tr>
		<tr>
			<td>
				‎-t
			</td>
			<td>
				المجلد العام
			</td>
		</tr>
		<tr>
			<td>
				 &lt;filename&gt; <filename></filename>
			</td>
			<td>
				سكربت التوجيه
			</td>
		</tr>
	</tbody>
</table>

<h3>
	تشغيل الخادم المدمج
</h3>

<pre class="ipsCode">php -S localhost:80

PHP 7.1.7 Development Server started at Fri Jul 14 15:11:05 2017
Listening on http://localhost:80
Document root is C:\projetos\repgeral
Press Ctrl-C to quit.
</pre>

<p>
	هذه أبسط طريقة لبدء خادم PHP يستجيب للطلبات المرسلة إلى المضيف المحلي (localhost) على المنفذ 80.
</p>

<p>
	يخبر <code>‎-S</code> أننا نبدأ خادم ويب، أما <code>localhost:80</code> يشير إلى المضيف الذي يجيب على الطلبات والمنفذ، يمكنك أن تستخدم تراكيب أخرى مثل:
</p>

<pre class="ipsCode">mymachine:80 - will listen on the address mymachine and port 80;
127.0.0.1:8080 - will listen on the address 127.0.0.1 and port 8080;
</pre>

<h3>
	خادم مدمج مع مجلد محدد وسكربت موجِّه
</h3>

<pre class="ipsCode">php -S localhost:80 -t project/public router.php

PHP 7.1.7 Development Server started at Fri Jul 14 15:22:25 2017
Listening on http://localhost:80
Document root is /home/project/public
Press Ctrl-C to quit.
</pre>

<p>
	ترجمة -وبتصرف- للفصول [-installing a PHP environment on Windows - Installing on Linux/Unix Environments- Getting started with PHP - Types - Comments - PHPDoc - PSR - PHP Built in server] من كتاب <a href="https://goalkicker.com/PHPBook" rel="external nofollow">PHP Notes for Professionals book.</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%81%D9%8A-php-r1040/" rel="">المتغيرات والثوابت في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1039</guid><pubDate>Sun, 18 Oct 2020 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-php-r609/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_01/5a692a1bca00a_29(1).png.2c6317c0465ab79680611ff249d1e265.png" /></p>
<p>
	في مقال اليوم نقدم دليلًا سريعًا مدعمًا بالأمثلة العملية شرح لغة PHP التي تعد واحدة من لغات البرمجة القوية المستخدمة بشكل أساسي لتطوير الويب، فعلى الرغم من ظهور العديد من لغات البرمجة الأحدث في مجال تطوير الويب إلا أن لغة PHP لا تزال اللغة الأكثر شيوعًا واستخدامًا، وهي تتطور باستمرار لإصلاح أي عيوب أو أخطاء فيها وتعزيز أمان وأداء المواقع المبنية باستخدامها.
</p>

<h2>
	نبذة مختصرة عن لغة PHP
</h2>

<p style="text-align: center;">
	<img alt="what-is-php.png" class="ipsImage ipsImage_thumbnailed" data-fileid="135903" data-ratio="66.67" data-unique="15qtimxvz" style="width: 500px; height: auto;" width="750" src="https://academy.hsoub.com/uploads/monthly_2023_09/what-is-php.png.ca64fa431063e6cd45983e5653774953.png">
</p>

<p>
	يشير اسم PHP إلى عبارة Hypertext Pre-processor أي المعالج المسبق للنصوص الفائقة وكلمة النصوص الفائقة تعني النصوص التي تملك روابط تنقلك لنصوص أو صفحات صفحات ويب أخرى عند النقر فوقها. وهي لغة برمجة مفتوحة المصدر وشائعة الاستخدام تستخدم في إنشاء وتطوير مواقع الويب الديناميكية،  وقد طور باستخدامها أكثر من 75% من المواقع الموجودة على شبكة الإنترنت بحسب <a href="https://w3techs.com/technologies/overview/programming_language" rel="external nofollow">w3techs</a>.
</p>

<p>
	تتميز لغة PHP بسهولتها ودعمها لمجموعة متنوعة من قواعد البيانات وبروتوكولات الإنترنت وتوفيرها للعديد من <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">مكتبات وأطر العمل</a> المساعدة للمبرمجين، وما زاد من شهرتها وحافظ على مكانتها وأهميتها بين مطوري الويب اعتماد العديد من منصات إدارة المحتوى ومنصات التجارة الإلكترونية المشهورة عليها مثل ووردبريس <a href="https://academy.hsoub.com/apps/web/wordpress/" rel="">WordPress</a> ودروبال <a href="https://academy.hsoub.com/apps/web/drupal/" rel="">Drupal</a> وماجنتو <a href="https://academy.hsoub.com/apps/web/magento/" rel="">Magneto</a> وغيرها الكثير، فإذا كنت مهتمًا بمجال تطوير الويب فإن <a href="https://academy.hsoub.com/php/" rel="">تعلم لغة PHP</a> خيار مناسب وغني بالفرص.
</p>

<p>
	تعمل لغة PHP على الخادم server-side بخلاف لغات برمجة أخرى تعمل على المتصفح أو العميل client-side مثل <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D8%B5%D9%81%D8%B1-%D8%AD%D8%AA%D9%89-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-r2046/" rel="">لغة جافا سكريبت JavaScript</a> أي أنها لا تنفذ الشيفرة البرمجية في متصفح الويب، بل تشغلها مباشرة على خادم الويب وبعدها يرسل خادم الويب نتيجة التنفيذ إلى المتصفح لعرضها، وتفترض هذه المقالة أنك تمتلك معلومات أساسية عن لغة PHP وطريقة عملها في الخلفية عند زيارتك لصفحة ويب من خلال متصفح الويب الخاص بك، وبأنك تعرف مسبقًا كيف تحول جهاز حاسوبك إلى خادم محلي وكيف تعد كل الأدوات اللازمة لكتابة أوامر PHP وتنفيذها، فإذا لم تكن على دراية بهذه المعلومات الأساسية أنصحك قبل ذلك ان تقرأ مقال <a href="https://academy.hsoub.com/programming/php/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r2040/" rel="">تعرف على لغة PHP</a> ثم تتابع قراءة هذا المقال.
</p>

<p>
	<strong>ملاحظة: </strong>تعمل الأكواد الواردة في الفقرات التالية  مع إصدار PHP 5 والإصدارات اللاحقة فقد قدم الإصدار الخامس من PHP العديد من التغييرات والتحسينات المهمة على الإصدارات السابقة وأبرز هذه التغييرات <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-php-r316/" rel="">دعم البرمجة كائنية التوجه oop في PHP</a> ووفر العديد من تحسينات الأداء والأمان، وتابعت <a href="https://www.php.net/releases/" rel="external nofollow">الإصدارات اللاحقة</a> التحسين وأضافت ميزات جديدة للغة.
</p>

<h2>
	كيف تكتب أكواد PHP
</h2>

<p>
	تكتب أكواد PHP بعد وسم الفتح <code>php?&gt;</code> وقبل وسم الإغلاق ‎<code>&lt;?</code> ثم تحفظ داخل ملفات لها الامتداد ‎.php على خادم الويب، ومن الأفضل عمليًا تجاهل كتابة وسم الإغلاق إذا كان ملف php يحتوي على شفرة php فقط، لتلافي نتيجة خرج غير متوقعة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6804_24" style=""><span class="pun">&lt;?</span><span class="pln">php
echo </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	كما يمكن أن تدمج أكواد PHP مع أكواد HTML لإنشاء صفحات ويب ديناميكية بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6804_28" style=""><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln"> HTML and PHP </span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">
</span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;h1&gt;</span><span class="pln">PHP code mixed with HTML</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
    </span><span class="pun">&lt;?</span><span class="pln">php
    echo </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

<h2>
	التعليقات Comments
</h2>

<p>
	التعليقات هي أجزاء من الكود البرمجي لا تنفذ عند تشغيل البرنامج وهي تستخدم لشرح وتوثيق الكود وتوضيح عمله للمطورين الآخرين الذين يقرأون هذا الكود، أو لتوضيحها للمبرمج الذي كتبها نفسه فقد ينسى ما كتبه عند العودة لقراءة الكود بعد فترة من الزمن.
</p>

<p>
	يمكن كتابة التعليقات في لغة PHP بعدة طرق كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><span class="com">// استخدم علامة القوسين المائلين // لبدأ تعليق بسطر واحد </span><span class="pln">
</span><span class="com">// يمكن استخدام العلامة # لكن علامة // أكثر شيوعيا. </span><span class="pln">

</span><span class="com">/*
إحاطة نص بالقوس المائل متبوعا بالنجمة بداية وبالنجمة
 متبوعة بالقوس المائل نهاية يجعل من هذا النص تعليقا متعدد الأسطر
*/</span></pre>

<h2>
	طباعة الخرج في PHP
</h2>

<p>
	يمكنك استخدم تعليمة <code>echo</code> أو <code>print</code> لطباعة الخرج أو عرض البيانات المطلوبة على صفحة الويب.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_18" style=""><span class="kwd">print</span><span class="pun">(</span><span class="str">'Hello '</span><span class="pun">);</span><span class="pln"> </span><span class="com">// بدون سطر فاصل "Hello "  طباعة</span></pre>

<p>
	استخدام القوسين <code>( )</code> اختياري مع تعليمتي <code>echo</code> و <code>print</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_22" style=""><span class="pln">echo </span><span class="str">"World\n"</span><span class="pun">;</span><span class="pln">  </span><span class="com">// مع سطر فاصل "World" طباعة</span></pre>

<p>
	يجب أن تنتهي كل العبارات في لغة PHP بالفاصلة المنقوطة "<code>;</code>" وأي شيء مكتوب خارج وسوم <code>php?&gt;</code> ستتم طباعته على الشاشة بشكل تلقائي.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير تطبيقات الويب باستخدام لغة PHP
		</p>

		<p class="banner-subtitle">
			احترف تطوير النظم الخلفية وتطبيقات الويب من الألف إلى الياء دون الحاجة لخبرة برمجية مسبقة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/php-web-application-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير تطبيقات الويب باستخدام لغة PHP" src="https://academy.hsoub.com/learn/assets/images/courses/php-web-application-development.png">
	</div>
</div>

<h2 id="الأنماط-types--والمتغيرات-variables">
	الأنماط Types والمتغيرات Variables
</h2>

<p>
	تستخدم المتغيرات في PHP لتخزين وحفظ قيم البيانات، ويمكن أن تخزن هذه المتغيرات قيمًا مختلفة كالأرقام والنصوص والقيم المنطقية. يمكنك التصريحعن المتغيرات في PHP بكتابة الرمز <code>$</code> يليه مباشرة اسم المتغير، ويجب ان تبدأ أسماء المتغيرات تبدأ بحرف أو تسطيرة سفلية _ يتبعها بأي عدد من الأحرف أو الأرقام أو التسطيرات السفلية. وتكون أسماء المتغيرات حساسة لحالة الأحرف case-sensitive.
</p>

<p>
	من أهم أنماط المتغيرات في لغة PHP نذكر:
</p>

<p>
	المتغيرات المنطقية Boolean ويملك المتغير من هذا النمط القيمة true أي صحيح أو القيمة false أي خاطئ.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_27" style=""><span class="pln">$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">  </span><span class="com">// TRUE أو True</span><span class="pln">
$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// FALSE أو False</span></pre>

<p>
	الأعداد الصحيحة Integer حيث يملك المتغير من هذا النمط قيمة صحيحة موجبة أو سالبة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_29" style=""><span class="pln">$int1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">   </span><span class="com">// =&gt; 12</span><span class="pln">
$int2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">12</span><span class="pun">;</span><span class="pln">  </span><span class="com">// =&gt; -12</span><span class="pln">
$int3 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">012</span><span class="pun">;</span><span class="pln">  </span><span class="com">// =&gt; 10 (البادئة 0 تدل على عدد ثماني) </span><span class="pln">
$int4 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0x0F</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 15 (0x تدل على رقم ستة عشري)</span></pre>

<p>
	المحارف الصحيحة الثنائية Binary integer literals متاحة اعتبارًا من <a href="https://academy.hsoub.com/php/" rel="">PHP </a>5.4.0 وهي تستخدم لتمثيل الأعداد الصحيحة بالنظام الثاني
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_31" style=""><span class="pln">$int5 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0b11111111</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 255 (0b يدل على عدد ثنائي)</span></pre>

<p>
	الأرقام العائمة Floats أو (المضاعفة doubles) وهي تستخدم لتمثيل الأعداد العشرية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>$float = 1.234;
$float = 1.2e3;
$float = 7E-10;
</code></pre>

<p>
	لحذف متغير في PHP وتحرير موارد الذاكرة المحجوزة لأجله نستخدم تعليمة <code>unset</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>unset($int1);
</code></pre>

<p>
	يمكن إجراء العمليات الحسابية على المتغيرات العددية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>$sum        = 1 + 1; // 2
$difference = 2 - 1; // 1
$product    = 2 * 2; // 4
$quotient   = 2 / 1; // 2
</code></pre>

<p>
	كما يمكن إجراء العمليات الحسابية المختزلة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_33" style=""><span class="pln">$number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
$number </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> 		</span><span class="com">// بمقدار 1 $number زيادة </span><span class="pln">
echo $number</span><span class="pun">++;</span><span class="pln"> 	</span><span class="com">// (طباعة 1 (الزيادة بعد التقييم</span><span class="pln">
echo </span><span class="pun">++</span><span class="pln">$number</span><span class="pun">;</span><span class="pln"> 	</span><span class="com">// (طباعة 3 (الزيادة قبل التقييم</span><span class="pln">
$number </span><span class="pun">/=</span><span class="pln"> $float</span><span class="pun">;</span><span class="pln"> 	</span><span class="com">// $number قسمة واسناد ناتج القسمة إلى</span></pre>

<p>
	السلاسل النصية Strings وهي تستخدم لتخزين النصوص ويجب أن تكون النصوص محدودة ضمن إشارة تنصيص واحدة <code>’</code> من كل جانب كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_35" style=""><span class="pln">$sgl_quotes </span><span class="pun">=</span><span class="pln"> </span><span class="str">'$String'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; '$String'</span></pre>

<p>
	تجنب استخدام علامات التنصيص المزدوجة إلا في حالة تضمين متغيرات أخرى
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_37" style=""><span class="pln">$dbl_quotes </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is a $sgl_quotes."</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 'This is a $String.'</span></pre>

<p>
	تحدد المحارف الخاصة حصريًا باقتباسات مزدوجة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_39" style=""><span class="pln">$escaped   </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This contains a \t tab character."</span><span class="pun">;</span><span class="pln">
$unescaped </span><span class="pun">=</span><span class="pln"> </span><span class="str">'This just contains a slash and a t: \t'</span><span class="pun">;</span></pre>

<p>
	قم بإحاطة المتغيرات بالقوسين المائلين عند الحاجة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_41" style=""><span class="pln">$apples </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I have {$number} apples to eat."</span><span class="pun">;</span><span class="pln">
$oranges </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I have ${number} oranges to eat."</span><span class="pun">;</span><span class="pln">
$money </span><span class="pun">=</span><span class="pln"> </span><span class="str">"I have $${number} in the bank."</span><span class="pun">;</span></pre>

<p>
	منذ الإصدار الخامس يمكن استخدام <code>nowdocs</code> في حالة عدة أسطر غير مجمعة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_43" style=""><span class="pln">$nowdoc </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&lt;&lt;</span><span class="str">'END'</span><span class="pln">
</span><span class="typ">Multi</span><span class="pln"> line
</span><span class="kwd">string</span><span class="pln">
</span><span class="kwd">END</span><span class="pun">;</span></pre>

<p>
	ستقوم <code>heredocs</code> بتجميع النصوص
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>$heredoc = &lt;&lt;&lt;END
Multi line
$sgl_quotes
END;
</code></pre>

<p>
	يتم وصل النصوص أو دمجها باستخدام النقطة "<code>.</code>"
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_45" style=""><span class="pln">echo </span><span class="str">'This string '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'is concatenated'</span><span class="pun">;</span></pre>

<p>
	يمكن تمرير النصوص كبارامتر لـ <code>echo</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_47" style=""><span class="pln">echo </span><span class="str">'Multiple'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Parameters'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Valid'</span><span class="pun">;</span><span class="com">// 'MultipleParametersValid' يعيد </span></pre>

<h2 id="الثوابت">
	الثوابت في PHP
</h2>

<p>
	يعرّف الثابت باستخدام <code>()define</code> ولا يمكن تغيير قيمته خلال فترة التشغيل. ويجب أن تبدأ أسماء الثوابت الصحيحة بحرف أو تسطيرة سفلية, متبوعة بأية حروف أو أرقام أو تسطيرات سفلية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_49" style=""><span class="pln">define</span><span class="pun">(</span><span class="str">"FOO"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"something"</span><span class="pun">);</span></pre>

<p>
	الوصول إلى المتغير الثابت متاح دون الحاجة الى استخدام الرمز <code>$</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_51" style=""><span class="pln">echo FOO</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'something' يعيد </span><span class="pln">

echo </span><span class="str">'This outputs '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> FOO</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'This outputs something' يعيد </span></pre>

<h2 id="المصفوفات-arrays">
	المصفوفات Arrays
</h2>

<p>
	المصفوفات في PHP هي<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel=""> هياكل بيانات</a> تسمح بتخزين مجموعة من القيم ضمن متغير واحد، وكل المصفوفات في PHP هي مصفوفات مترابطة (تسمى hashmaps في بعض اللغات البرمجية) وتعمل في جميع إصدارات php
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_53" style=""><span class="pln">$associative </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'One'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Three'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span></pre>

<p>
	تم إدخال تركيب قواعدي syntax جديد في PHP 5.4
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_55" style=""><span class="pln">$associative </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'One'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Two'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Three'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
echo $associative</span><span class="pun">[</span><span class="str">'One'</span><span class="pun">];</span><span class="pln"> </span><span class="com">// 1  تطبع </span></pre>

<p>
	إضافة عنصر للمصفوفة المترابطة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_57" style=""><span class="pln">$associative</span><span class="pun">[</span><span class="str">'Four'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span></pre>

<p>
	القوائم المحرفية يسند لها مفاتيح صحيحة حكمًا
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_59" style=""><span class="pln">$array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'One'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Two'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Three'</span><span class="pun">];</span><span class="pln">
echo $array</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln"> </span><span class="com">// =&gt; "One"</span></pre>

<p>
	إضافة عنصر إلى نهاية المصفوفة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_61" style=""><span class="pln">$array</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Four'</span><span class="pun">;</span></pre>

<p>
	أو
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_63" style=""><span class="pln">array_push</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Five'</span><span class="pun">);</span></pre>

<p>
	حذف عنصر من مصفوفة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_65" style=""><span class="pln">unset</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]);</span></pre>

<h2 id="الخرج-output">
	المزيد حول تعلميات الطباعة في PHP
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_67" style=""><span class="pln">echo</span><span class="pun">(</span><span class="str">'Hello World!'</span><span class="pun">);</span></pre>

<p>
	تقوم التعليمة السابقة بطباعة !Hello World على شاشة الاظهار القياسية stdout، وstdout هي صفحة الوب إذا كنت تستخدم متصفحًا
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_69" style=""><span class="kwd">print</span><span class="pun">(</span><span class="str">'Hello World!'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// echo مشابه لـ</span><span class="pln">

</span><span class="com">// هي أيضًا  من تركيبات اللغة لذلك يمكنك إلغاء الأقواس echo و print</span><span class="pln">
echo </span><span class="str">'Hello World!'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Hello World!'</span><span class="pun">;</span><span class="pln">

$paragraph </span><span class="pun">=</span><span class="pln"> </span><span class="str">'paragraph'</span><span class="pun">;</span><span class="pln">

echo </span><span class="lit">100</span><span class="pun">;</span><span class="pln"> </span><span class="com">// اطبع المتغيرات العددية مباشرة</span><span class="pln">

echo $paragraph</span><span class="pun">;</span><span class="pln"> </span><span class="com">// أو المتغيرات</span></pre>

<p>
	إذا تم إعداد الوسوم القصيرة المفتوحة أو كانت نسخة PHP الخاصة بك 5.4.0 أو أحدث يمكنك استخدام قواعد بناء الجمل القصيرة لـ <code>echo</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_71" style=""><span class="tag">&lt;p&gt;</span><span class="pun">&lt;?=</span><span class="pln"> $paragraph </span><span class="pun">?&gt;</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_73" style=""><span class="pln">$x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
$y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
$x </span><span class="pun">=</span><span class="pln"> $y</span><span class="pun">;</span></pre>

<p>
	المتغير <code>x$</code> يحتوي نفس قيمة المتغير <code>y$</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_75" style=""><span class="pln">$z </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$y</span><span class="pun">;</span></pre>

<p>
	المتغير <code>z$</code> يحتوي إسناد إلى قيمة <code>y$</code>، وأي تغيير في قيمة <code>z$</code>سيغير قيمة <code>y$</code> وبالعكس المتغير <code>x$</code> تبقى قيمته بدون تغيير كقيمة <code>y$</code> الأصلية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_77" style=""><span class="pln">echo $x</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2</span><span class="pln">
echo $z</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2</span><span class="pln">
$y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
echo $x</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2</span><span class="pln">
echo $z</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 0</span></pre>

<p>
	تخرج التفريغات Dumps نوع وقيمة المتحول إلى شاشة العرض القياسية stdout
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_79" style=""><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">$z</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int(0) يطبع</span></pre>

<p>
	تطبع  التعليمة Print المتغيرات إلى شاشة الإظهار القياسية stdout بصيغة مقروءة للإنسان
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_81" style=""><span class="pln">print_r</span><span class="pun">(</span><span class="pln">$array</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Array ( [0] =&gt; One [1] =&gt; Two [2] =&gt; Three ) يطبع </span></pre>

<h2>
	العمليات المنطقية
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_83" style=""><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">;</span><span class="pln">
$c </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">;</span><span class="pln">
$d </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">;</span></pre>

<p>
	يقوم <code>assert</code> بإصدار تنبيه إذا كانت معطياته غير صحيحة وهذه المقارنة ستكون دومًا صحيحة حتى إذا كانت الأنواع مختلفة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_85" style=""><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$a </span><span class="pun">==</span><span class="pln"> $b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// equality المساواة </span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$c </span><span class="pun">!=</span><span class="pln"> $a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// inequality عدم المساواة </span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$c </span><span class="pun">&lt;&gt;</span><span class="pln"> $a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// alternative inequality عدم المساواة بشكل بديل </span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&lt;</span><span class="pln"> $c</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$c </span><span class="pun">&gt;</span><span class="pln"> $b</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$a </span><span class="pun">&lt;=</span><span class="pln"> $b</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$c </span><span class="pun">&gt;=</span><span class="pln"> $d</span><span class="pun">);</span></pre>

<p>
	التالي سيكون صحيحًا فقط في حال كانت القيم متساوية ومن نفس النوع
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_87" style=""><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$c </span><span class="pun">===</span><span class="pln"> $d</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="pln">$a </span><span class="pun">!==</span><span class="pln"> $d</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">assert</span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">);</span></pre>

<p>
	المشغل `Spaceship` &lt;=&gt; (منذ PHP 7) يعيد 0 إذا كانت القيم على طرفيه متساوية، ويعيد 1 إذا كانت القيمة على اليسار أكبر، ويعيد -1 إذا كانت القيمة على اليمين أكبر
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_89" style=""><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln">
echo $a </span><span class="pun">&lt;=&gt;</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// النتيجة 0 كونهما متساويين</span><span class="pln">
echo $a </span><span class="pun">&lt;=&gt;</span><span class="pln"> $b</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $a &lt; $b النتيجة -1 كون </span><span class="pln">
echo $b </span><span class="pun">&lt;=&gt;</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// $b &gt; $aالنتيجة 1 كون </span></pre>

<p>
	يمكن تحويل المتغيرات إلى أنواع مختلفة بحسب استخدامها
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_91" style=""><span class="pln">$integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
echo $integer </span><span class="pun">+</span><span class="pln"> $integer</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2</span><span class="pln">

$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">;</span><span class="pln">

echo $string </span><span class="pun">+</span><span class="pln"> $string</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2 (تم تحويل النصوص الى أعداد صحيحة)</span><span class="pln">

$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'one'</span><span class="pun">;</span><span class="pln">
echo $string </span><span class="pun">+</span><span class="pln"> $string</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 0</span></pre>

<p>
	النتيجة 0 لأن المشغل + لا يستطيع موائمة النص `one` الى رقم.
</p>

<p>
	موائمة الأنواع Type casting يمكن استخدامها للتعامل مع متغير من نوع معين كنوع آخر.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_95" style=""><span class="pln">$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">boolean</span><span class="pun">)</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; true</span><span class="pln">
$zero </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
$boolean </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">boolean</span><span class="pun">)</span><span class="pln"> $zero</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; false</span></pre>

<p>
	يوجد أيضًا توابع مخصصة لموائمة أغلب الأنواع
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_97" style=""><span class="pln">$integer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
$string </span><span class="pun">=</span><span class="pln"> strval</span><span class="pun">(</span><span class="pln">$integer</span><span class="pun">);</span></pre>

<p>
	<code>null</code> هي قيمة خالية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_99" style=""><span class="pln">$var </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> </span></pre>

<h2 id="control-structures---بنى-التحكم">
	بنى التحكم Control Structures
</h2>

<p>
	تمكنك بنى التحكم في لغة PHP من التحكم في تنفيذ الكود البرمجي بناءً على شروط معينة أو تكرار تنفيذ جزء من الكود عدة مرات ومن أشهر بنى التحكم   المستخدمة في لغة PHP العبارات الشرطية if وعبارات الحلقات مثل for و while وعبارات switch.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_101" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'I get printed'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'I don\'t'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'I get printed'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">false</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Does not get printed'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Does'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	المشغل الثلاثي ternary
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_103" style=""><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">false</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">'Does not get printed'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'Does'</span><span class="pun">);</span></pre>

<p>
	بدأ استخدام المشغل الثلاثي المختصر من PHP 5.3 وهو مكافئ لـ <code>"$x ? $x : 'Does'""</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_105" style=""><span class="pln">$x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">$x </span><span class="pun">?:</span><span class="pln"> </span><span class="str">'Does'</span><span class="pun">);</span></pre>

<p>
	بدأ مشغّل دمج القيم الفارغة null coalesce operator من php 7
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_107" style=""><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
$b </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Does print'</span><span class="pun">;</span><span class="pln">
echo $a </span><span class="pun">??</span><span class="pln"> </span><span class="str">'a is not set'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'a is not set' تطبع</span><span class="pln">
echo $b </span><span class="pun">??</span><span class="pln"> </span><span class="str">'b is not set'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'Does print' تطبع</span></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_109" style=""><span class="pln">$x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x </span><span class="pun">===</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Does not print'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$x </span><span class="pun">==</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Does not print'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Does print'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	القواعد البديلة لبناء الجمل مفيدة لبناء النماذج
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_113" style=""><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
This is displayed if the test is truthy.
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">else</span><span class="pun">:</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
This is displayed otherwise.
</span><span class="pun">&lt;?</span><span class="pln">php endif</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	استخدم التعليمة  <code>switch</code> لتوفير كتابة جزء من العمليات المنطقية كما يلي
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_115" style=""><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pln"> </span><span class="str">'Switch does type coercion'</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 'two' و'three' وإلا سينتقل الى الحالة break يجب تضمين </span><span class="pln">

    </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'two'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="str">'three'</span><span class="pun">:</span><span class="pln"> </span><span class="com">// 'two' أو 'three' تساوي $variable قم بعمل شيء ما اذا كانت قيمة </span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> 

    </span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> </span><span class="com">// قم بعمل الاجراء الافتراضي</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الحلقات <code>while</code>، <code>do…while</code>، <code>for</code> هي حلقات مألوفة غالبًا وتستخدم لتكرار تنفيذ مجموعة من التعليمات البرمجية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_117" style=""><code>
<span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="com">// "01234" اطبع</span></code></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_119" style=""><code>
<span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $i</span><span class="pun">++;</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "01234" اطبع</span></code></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_121" style=""><code>
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $x</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $x</span><span class="pun">;</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="com">// "0123456789" اطبع</span></code></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_123" style=""><code>
<span class="pln">$wheels </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'bicycle'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">'car'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">];</span></code></pre>

<p>
	يمكن أن تعمل حلقات <code>foreach</code>على المصفوفة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_125" style=""><code>
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$wheels </span><span class="kwd">as</span><span class="pln"> $wheel_count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $wheel_count</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="com">// "24"اطبع</span></code></pre>

<p>
	ويمكنك لحلقة <code>foreach</code> المرور  إما عبر المفاتيح أو القيم الخاصة بالمصفوفة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_127" style=""><code>
<span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$wheels </span><span class="kwd">as</span><span class="pln"> $vehicle </span><span class="pun">=&gt;</span><span class="pln"> $wheel_count</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"A $vehicle has $wheel_count wheels"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_129" style=""><code>
<span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">===</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> </span><span class="com">// while اخرج من حلقة</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    echo $i</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="com">// "012" اطبع</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">===</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"> </span><span class="com">// تجاوز هذا التكرار من الحلقة </span><span class="pln">

    </span><span class="pun">}</span><span class="pln">
    echo $i</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="com">// "0124" اطبع</span></code></pre>

<h2 id="التوابع---functions">
	الدوال  Functions
</h2>

<p>
	الدوال في البرمجة هي مجموعات من الأوامر التي لها اسم محدد وتستخدم لأداء مهمة معينة وهي تساعد في تنظيم واختصار التعليمات البرمجية. ونعرّف الدالة PHP باستخدام الكلمة المفتاحية <code>function</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_131" style=""><code>
<span class="kwd">function</span><span class="pln"> my_function </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'Hello'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo my_function</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; "Hello"</span></code></pre>

<p>
	الاسم المقبول للدالة يجب أن يبدأ بحرف أو تسطيرة سفلية متبوعة بأي عدد من الأحرف ،الأرقام، أو التسطيرات السفلية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_137" style=""><code>
<span class="kwd">function</span><span class="pln"> add </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">,</span><span class="pln"> $y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// اختيارية وقيمتها الإفتراضية تساوي 1 $y </span><span class="pln">
    $result </span><span class="pun">=</span><span class="pln"> $x </span><span class="pun">+</span><span class="pln"> $y</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $result</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo add</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; 5</span><span class="pln">
echo add</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; 6</span></code></pre>

<p>
	لا يمكن الوصول للمتغير <code>result$ </code>من خارج الدالة واستخدام الأمر  <code>;print $result</code> هنا سيعطي خطأ<br>
	منذ النسخة PHP 5.3 أصبح من الممكن تعريف دوال مجهولة  anonymous functions أي دوال لا تملك اسمًا وتخزن قيمها في متغيرات كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_139" style=""><code>
<span class="pln">$inc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

echo $inc</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; 3</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> foo </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">,</span><span class="pln"> $y</span><span class="pun">,</span><span class="pln"> $z</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"$x - $y - $z"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يمكن للدوال أن تعيد دوالًا أخرى
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_141" style=""><code>
<span class="kwd">function</span><span class="pln"> bar </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">,</span><span class="pln"> $y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// استخدم use  لإحضار المتغيرات الخارجية</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$z</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$x</span><span class="pun">,</span><span class="pln"> $y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        foo</span><span class="pun">(</span><span class="pln">$x</span><span class="pun">,</span><span class="pln"> $y</span><span class="pun">,</span><span class="pln"> $z</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$bar </span><span class="pun">=</span><span class="pln"> bar</span><span class="pun">(</span><span class="str">'A'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'B'</span><span class="pun">);</span><span class="pln">
$bar</span><span class="pun">(</span><span class="str">'C'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// "A - B - C" يطبع</span></code></pre>

<p>
	يمكنك استدعاء الدوال المسماة named functions باستخدام النصوص
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>$function_name = 'add';
echo $function_name(1, 2); // =&gt; 3
</code></code></pre>

<p>
	وهو هام من أجل تحديد أي دالة يتوجب تشغيلها برمجيًا، أو استخدم الدالة التالية 
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_146" style=""><code>
<span class="pln">call_user_func </span><span class="pun">(</span><span class="pln">callable $callback </span><span class="pun">[,</span><span class="pln"> $parameter </span><span class="pun">[,</span><span class="pln"> </span><span class="pun">…</span><span class="pln"> </span><span class="pun">]]);</span></code></pre>

<p>
	يمكنك الحصول على كل البارمترات الممررّة للدالة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>function parameters() {
    $numargs = func_num_args();
    if ($numargs &gt; 0) {
        echo func_get_arg(0) . ' | ';
    }
    $args_array = func_get_args();
    foreach ($args_array as $key =&gt; $arg) {
        echo $key . ' - ' . $arg . ' | ';
    }
}

parameters('Hello', 'World'); // Hello | 0 - Hello | 1 - World |
</code></code></pre>

<p>
	يمكنك الحصول على عدد متغير من المعطيات ابتداء من PHP 5.6
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>function variable($word, ...$list) {
    echo $word . " || ";
    foreach ($list as $item) {
        echo $item . ' | ';
    }
}

variable("Separate", "Hello", "World"); // Separate || Hello | World |
</code></code></pre>

<h2 id="التضمين-includes">
	التضمين في PHP باستخدام include و require
</h2>

<p>
	يفيد التضمين في PHP لتضمين محتوى ملف في ملف آخر ويمكن القيام بتضمين ملف في آخر باستخدام <code>include</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>include 'my-file.php';
</code></code></pre>

<p>
	وبهذا تكون الشفرة ضمن الملف my-file.php متاحة ضمن مجال الرؤية، إذا لم يكن بالإمكان تضمين الملف (على سبيل المثال إذا كان الملف غير موجود ) يظهر تنبيه.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>include_once 'my-file.php'; 
</code></code></pre>

<p>
	إذا كانت شفرة الملف <code>my-file.php</code> متضمنة في مكان أخر ، لن يتم تضمينها ثانية. وهذا يمنع الاخطاء التي تحدث بسبب تكرار التصريح عن الصفوف
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>require 'my-file.php';
require_once 'my-file.php';
</code></code></pre>

<p>
	تقوم الدالة <code>()require</code> بنفس عمل <code>()include</code> إلا أنها ستتسبب بخطأ فادح إذا لم يتمكن من تضمين الملف.
</p>

<p>
	محتويات ملف <code>my-include.php</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_148" style=""><code>
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">return</span><span class="pln"> </span><span class="str">'Anything you like.'</span><span class="pun">;</span></code></pre>

<p>
	يمكن  الدوال <code>Includes</code>، <code>requires</code> أيضًا أن تعيد قيمة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>$value = include 'my-include.php';
</code></code></pre>

<p>
	تضمن الملفات بالاعتماد على المسار المعطى، وإذا لم يحدد المسار يتم اعتماد مسار توجيه الاعداد <code>include_path </code>فإذا لم يتم إيجاد الملف يتم البحث في مسار استدعاء السكريبت ومسار العمل الحالي قبل الاعلان عن الاخفاق
</p>

<h2 id="classes-الصفوف">
	الأصناف Classes في PHP
</h2>

<p>
	الأصناف classes في البرمجة هي أنماط بيانات خاصة تستخدم كقوالب لإنشاء الكائنات objects وتعرف الأصناف في PHP باستخدام العبارة <code>class</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_150" style=""><code>
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> MY_CONST      </span><span class="pun">=</span><span class="pln"> </span><span class="str">'value'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ثابت</span><span class="pln">

    </span><span class="kwd">static</span><span class="pln"> $staticVar   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'static'</span><span class="pun">;</span></code></pre>

<p>
	المتغيرات الثابتة <code>Static</code> ومجال رؤيتها
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_152" style=""><code>
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $publicStaticVar </span><span class="pun">=</span><span class="pln"> </span><span class="str">'publicStatic'</span><span class="pun">;</span></code></pre>

<p>
	يمكن الوصول إليها خلال الصنف فقط
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_154" style=""><code>
<span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> $privateStaticVar </span><span class="pun">=</span><span class="pln"> </span><span class="str">'privateStatic'</span><span class="pun">;</span></code></pre>

<p>
	يمكن الوصول اليها من خلال الصنف والأصناف المشتقة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>protected static $protectedStaticVar = 'protectedStatic';
</code></code></pre>

<p>
	يجب تحديد مجال الرؤية للخصائص Properties
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>public $property    = 'public';
public $instanceProp;
protected $prot = 'protected';
</code></code></pre>

<p>
	يمكن الوصول إليها من الصنف والأصناف الفرعية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_156" style=""><code>
<span class="kwd">private</span><span class="pln"> $priv   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'private'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// يمكن الوصول إليها من الصنف فقط</span></code></pre>

<p>
	قم بإنشاء الباني باستخدام <code>__construct</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_158" style=""><code>
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __construct</span><span class="pun">(</span><span class="pln">$instanceProp</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
	</span><span class="com">// $this قم بالوصول إلى متغيرات الحالة باستخدام</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">instanceProp </span><span class="pun">=</span><span class="pln"> $instanceProp</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span></code></pre>

<p>
	تعرًف  الطرق methods كدوال داخل الصنف
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>public function myMethod()
    {
        print 'MyClass';
    }
</code></code></pre>

<p>
	تجعل الكلمة المفتاحية <code>final</code> الدالة غير قابلة للتحميل الزائد unoverridable
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>final function youCannotOverrideMe()
{
}
</code></code></pre>

<h2>
	الطرق السحرية Magic Methods
</h2>

<p>
	الطرق السحرية في PHP هي طرق أو وظائف خاصة يبدأ اسمها بشرطة سفلية مزدوجة تسمح لك بإضافة وظائف إلى الأصناف دون الحاجة لتعريف هذه الدوال بشكل صريح.
</p>

<p>
	على سبيل المثال الدالة toString__ هي دالة سحرية تستدعى تلقائيًا عند استخدام عمليات أو وظائف معينة تتطلب تحويل الكائن إلى سلسلة نصية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>public function __toString()
{
     return $property;
}
</code></code></pre>

<p>
	ومن الدوال السجرية لدينا دالة الهدم <code>()destruct__</code> وهي عكس دالة البناء<code>()construct__</code> وتستدعى عندما لا تعود هنالك حاجة لأن يكون العنصر مشارًا إليه كمرجع
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>public function __destruct()
{
    print "Destroying";
}
</code></code></pre>

<h2>
	الكلمة المفتاحية static في PHP
</h2>

<p>
	تستخدم الكلمة المفتاحية static في PHP لتعريف خصائص الصنف والطرق على أنها ثابتة وهذا يجعلها قابله للوصول بدون الحاجة إلى إنشاء كائن من الصنف. الخاصية المعرّفة بأنها ثابتة لا يمكن الوصول إليها من العنصر المشتق من الصنف (لكن يمكن ذلك في الطرق الثابتة)
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>public static function myStaticMethod()
{
    print 'I am static';
}
</code></code></pre>

<p>
	ثوابت الصنف Class constants يمكن الوصول إليها دائمًا بشكل ثابت
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo MyClass::MY_CONST;    //  'value' الخرج;
echo MyClass::$staticVar;  // 'static' الخرج;
MyClass::myStaticMethod(); // 'I am static' الخرج;
</code></code></pre>

<p>
	اشتقاق حالات الأصناف <code>instance</code> باستخدام <code>new</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>$my_class = new MyClass('An instance property');
</code></code></pre>

<p>
	استخدام القوسين اختياري إذا كنت لا تريد تمرير أيّة معطيات
</p>

<p>
	يمكننك الوصول إلى أعضاء الصنف class members باستخدام &lt;-
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo $my_class-&gt;property;     // =&gt; "public"
echo $my_class-&gt;instanceProp; // =&gt; "An instance property"
$my_class-&gt;myMethod();        // =&gt; "MyClass"
</code></code></pre>

<p>
	قم بتوسيع الصنف باستخدام <code>extends</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_172" style=""><code>
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyOtherClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> printProtectedProperty</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo $this</span><span class="pun">-&gt;</span><span class="pln">prot</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
	
	</span><span class="com">// التحميل الزائد للطرق Override</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> myMethod</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        parent</span><span class="pun">::</span><span class="pln">myMethod</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">print</span><span class="pln"> </span><span class="str">' &gt; MyOtherClass'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$my_other_class </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyOtherClass</span><span class="pun">(</span><span class="str">'Instance prop'</span><span class="pun">);</span><span class="pln">
$my_other_class</span><span class="pun">-&gt;</span><span class="pln">printProtectedProperty</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; "protected" يطبع</span><span class="pln">
$my_other_class</span><span class="pun">-&gt;</span><span class="pln">myMethod</span><span class="pun">();</span><span class="pln"> </span><span class="com">// "MyClass &gt; MyOtherClass" يطبع</span><span class="pln">

</span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">YouCannotExtendMe</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يمكنك استخدام  الطرق السحرية magic methods لإنشاء دوال الجلب أو الإرجاع getters وداول الاسناد setters
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_179" style=""><code>
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyMapClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $property</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __get</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">$key</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __set</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">$key </span><span class="pun">=</span><span class="pln"> $value</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyMapClass</span><span class="pun">();</span><span class="pln">
echo $x</span><span class="pun">-&gt;</span><span class="kwd">property</span><span class="pun">;</span><span class="pln"> </span><span class="com">// __get() سوف تستخدم طريقة </span><span class="pln">
$x</span><span class="pun">-&gt;</span><span class="kwd">property</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Something'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// __set() سوف تستخدم طريقة </span></code></pre>

<p>
	يمكن أن تكون الأصناف تجريدية (باستخدام الكلمة المفتاحية abstract) أو واجهات تنفيذ (باستخدام الكلمة المفتاحية implements).
</p>

<h2>
	الواجهات Interfaces في لغة PHP
</h2>

<p>
	الواجهات في PHP هي طريقة مجردة لتعريف الكائنات، ويصرح عن الواجهة بالكلمة المفتاحية interface.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>interface InterfaceOne
{
    public function doSomething();
}

interface InterfaceTwo
{
    public function doSomethingElse();
}
</code></code></pre>

<p>
	يمكن أن توسّع الواجهات
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>interface InterfaceThree extends InterfaceTwo
{
    public function doAnotherContract();
}

abstract class MyAbstractClass implements InterfaceOne
{
    public $x = 'doSomething';
}

class MyConcreteClass extends MyAbstractClass implements InterfaceTwo
{
    public function doSomething()
    {
        echo $x;
    }

    public function doSomethingElse()
    {
        echo 'doSomethingElse';
    }
}
</code></code></pre>

<p>
	يمكن أن يكون للأصناف أكثر من واجهة واحدة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>class SomeOtherClass implements InterfaceOne, InterfaceTwo
{
    public function doSomething()
    {
        echo 'doSomething';
    }

    public function doSomethingElse()
    {
        echo 'doSomethingElse';
    }
}
</code></code></pre>

<h2 id="traits-السمات">
	السمات Traits
</h2>

<p>
	trait هي ميزة تستخدم للسماح بإعادة استخدام مجموعة من الوظائف داخل الأصناف ويمكنك اعتبارها بمثابة طريقة لتضمين سلوك مشترك بين الأصناف وهي ميزة متوفره بدءًا من النسخة PHP 5.4.0 ويصرّح عنها باستخدام <code>trait</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>trait MyTrait
{
    public function myTraitMethod()
    {
        print 'I have MyTrait';
    }
}

class MyTraitfulClass
{
    use MyTrait;
}

$cls = new MyTraitfulClass();
$cls-&gt;myTraitMethod(); // Prints "I have MyTrait"
</code></code></pre>

<p>
	 
</p>

<h2>
	فضاءات الأسماء Namespaces في PHP
</h2>

<p>
	تستخدم فضاءات الأسماء في PHP لتنظيم الشيفرة وتجنب تعارض أسماء الأصناف والوظائف والمتغيرات فهي تجمع العناصر ضمن في مجموعات أو مساحات لها نفس الاسم لتميزها عن غيرها وللقيام بذلك نكتب <code>namespace </code>كأول عبارة في الملف.
</p>

<p>
	دعونا نتظاهر بأن هذا ليس هو الحال
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_181" style=""><code>
<span class="pun">&lt;?</span><span class="pln">php</span></code></pre>

<p>
	افتراضيًا, توجد الأصناف في <code>namespace</code> عام, ويمكن أن تستدعى صراحة بـ <code>backslash</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>$cls = new \MyClass();
</code></code></pre>

<p>
	ضبط <code>namespace</code> لملف
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>namespace My\Namespace;

class MyClass
{
}
</code></code></pre>

<p>
	من ملف آخر
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>$cls = new My\Namespace\MyClass;
</code></code></pre>

<p>
	أو من داخل <code>namespace</code> آخر
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>namespace My\Other\Namespace;

use My\Namespace\MyClass;

$cls = new MyClass();
</code></code></pre>

<p>
	أو يمكنك استبدال <code>namespace</code> باسم مستعار
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>namespace My\Other\Namespace;

use My\Namespace as SomeOtherNamespace;

$cls = new SomeOtherNamespace\MyClass();
</code></code></pre>

<h2 id="late-static-bindingالربط-الستاتيكي-المتأخر">
	الربط الساكن المتأخر Late Static Binding
</h2>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_187" style=""><code>
<span class="kwd">class</span><span class="pln"> </span><span class="typ">ParentClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> who</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"I'm a "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> __CLASS__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
</span><span class="com">// على الصف الذي عُرّف التابع ضمنه self تؤشر </span><span class="pln">

        </span><span class="kwd">self</span><span class="pun">::</span><span class="pln">who</span><span class="pun">();</span><span class="pln">
</span><span class="com">// على الصف الذي استدعي التابع منه static تؤشر </span><span class="pln">
        </span><span class="kwd">static</span><span class="pun">::</span><span class="pln">who</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ParentClass</span><span class="pun">::</span><span class="pln">test</span><span class="pun">();</span><span class="pln">
</span><span class="com">/*
ParentClass أنا 
ParentClass أنا 
*/</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ChildClass</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">ParentClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> who</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"But I'm "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> __CLASS__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ChildClass</span><span class="pun">::</span><span class="pln">test</span><span class="pun">();</span><span class="pln">
</span><span class="com">/*
ParentClass أنا
ChildClass ولكن أنا 
*/</span></code></pre>

<h2 id="magic-constants-الثوابت-السحرية">
	الثوابت السحرية Magic constants
</h2>

<p>
	الثوابت السحرية هي ثوابت معرفة مسبقًا في PHP يبدأ اسمها وينتهي بشرطتين سفليتين ولها استخداماات مختلفة، على سبيل المثال للحصول على اسم الصنف الحالي نستخدم الثابت السحري __CLASS__ داخل تصريح الصنف كما  يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current class name is " . __CLASS__;
</code></code></pre>

<p>
	وللحصول على مسار الدليل الكامل لملف نستخدم __DIR__
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current directory is " . __DIR__;
</code></code></pre>

<p>
	الاستخدام النموذجي
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>require __DIR__ . '/vendor/autoload.php';
</code></code></pre>

<p>
	الحصول على المسار الكامل للملف
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current file path is " . __FILE__;
</code></code></pre>

<p>
	الحصول على اسم الدالة الحالية
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current function name is " . __FUNCTION__;
</code></code></pre>

<p>
	الحصول على رقم السطر الحالي
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current line number is " . __LINE__;
</code></code></pre>

<p>
	الحصول على اسم الطريقة الحالية. يرجع قيمة فقط عندما يستخدم داخل تصريح سمة أو كائن
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current method is " . __METHOD__;
</code></code></pre>

<p>
	الحصول على اسم <code>namespace</code> الحالي
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current namespace is " . __NAMESPACE__;
</code></code></pre>

<p>
	الحصول على اسم السمة الحالية. ترجع قيمة فقط عندما تستخدم داخل التصريح عن السمة أو الكائن.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>echo "Current trait is " . __TRAIT__;
</code></code></pre>

<h2 id="error-handling-معالجة-الأخطاء">
	معالجة الأخطاء Error Handling في PHP
</h2>

<p>
	يمكن أن تتم معالجة أخطاء بسيطة باستخدام كتلة <code>try catch</code>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>try {
    // افعل شيء ما 
} catch (Exception $e) {
    // معالجة استثناء
}
</code></code></pre>

<p>
	عند استخدام كتلة <code>try catch</code> في بيئة <code>namespace</code> استخدم التالي
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1010_16" style=""><code>
<code>try {
    // افعل شيء ما 
} catch (\Exception $e) {
    // معالجة استثناء
}
</code></code></pre>

<p>
	استثناءات مخصّصة
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" style=""><code>
<span class="kwd">class</span><span class="pln"> </span><span class="typ">MyException</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    $condition </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$condition</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyException</span><span class="pun">(</span><span class="str">'Something just happened'</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MyException</span><span class="pln"> $e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// معالجة استثنائية</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://learnxinyminutes.com/docs/php/" rel="external nofollow">Learn PHP in Y Minutes</a>
</p>
]]></description><guid isPermaLink="false">609</guid><pubDate>Mon, 29 Jan 2018 18:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x641;&#x651;&#x630; &#x634;&#x64A;&#x641;&#x631;&#x629; PHP &#x641;&#x64A; &#x627;&#x644;&#x62E;&#x644;&#x641;&#x64A;&#x629;&#x61F;</title><link>https://academy.hsoub.com/programming/php/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D9%81%D9%91%D8%B0-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-php-%D9%81%D9%8A-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A9%D8%9F-r568/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_12/5a239d0dabf0e_03(1).png.d4e664d62a85bd8552fea50efbb402fe.png" /></p>
<p id="كيف-تنفذ-شيفرة-php-في-الخلفية">
	قد تحتاج في بعض الأحيان إلى تشغيل شيفرة معيّنة دون انتظار المستخدم للقيام بذلك، يمكنك - والحال هذه - أن تنفّذ الشيفرة في الخلفية وأن تخفيها عن المستخدم، وبهذا تزيد من سرعة وفعّالية موقعك الإلكتروني.
</p>

<p>
	تعتمد هذه الطريقة على ما يسمى بشيفرات الصدفة Shell script في نظام Linux، حيث يتم تشغيل العمليات في الخلفية، ويمكنك إضافة مهمّة (كأن يكون أمرًا أو شيفرة) في الخلفية وذلك بإضافة الرمز <code>&amp;</code> إلى نهاية سطر الأوامر، والذي سيؤدي إلى وضع الأمر في الخلفية وتهيئة الطرفية لاستقبال أوامر أخرى. يصطلح على الأمر الذي يتم في الخلفية بالشغل Job. جدير بالذكر أنّه يمكن كتابة أوامر أخرى في الوقت الذي يتم فيه تشغيل الأمر في الخلفية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><span class="pun">{</span><span class="pln">command</span><span class="pun">}</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">

</span><span class="com">// مثال:</span><span class="pln">
ls </span><span class="pun">-</span><span class="pln">l </span><span class="pun">&amp;</span><span class="pln"> </span><span class="kwd">exec</span><span class="pln"> php index</span><span class="pun">.</span><span class="pln">php </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">/dev/</span><span class="kwd">null</span><span class="pln"> </span><span class="lit">2</span><span class="pun">&gt;&amp;</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> echo $</span><span class="pun">!</span></pre>

<p>
	يمكن التحقق من العمليات التي يتم إجراءها في الوقت الحاضر في الخلفية على Linux بواسطة الأوامر التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs lasso"><span class="pln">ps </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">l</span></span><span class="pln"> </span><span class="pun">(يسرد</span><span class="pln"> </span><span class="pun">هذا</span><span class="pln"> </span><span class="pun">الأمر</span><span class="pln"> </span><span class="pun">جميع</span><span class="pln"> </span><span class="pun">العمليات)</span><span class="pln">
ps </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ef</span></span><span class="pln"> </span><span class="pun">(يسرد</span><span class="pln"> </span><span class="pun">هذا</span><span class="pln"> </span><span class="pun">الأمر</span><span class="pln"> </span><span class="pun">جميع</span><span class="pln"> </span><span class="pun">العمليات</span><span class="pln"> </span><span class="pun">مع</span><span class="pln"> </span><span class="pun">تفاصيل</span><span class="pln"> </span><span class="pun">كاملة)</span></code></pre>

<p>
	ولتنفيذ الأمر من خلال <a href="https://academy.hsoub.com/php/" rel="">شيفرة php</a> في الخلفية يمكن استخدام الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs javascript"><span class="pln">nohup </span><span class="kwd">exec</span><span class="pln"> arg1 arg2 </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-regexp"><span class="str">/dev/</span></span><span class="hljs-literal"><span class="kwd">null</span></span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// مثال:</span></span><span class="pln">
nohup </span><span class="kwd">exec</span><span class="pln"> php process</span><span class="pun">.</span><span class="pln">php hello world </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-regexp"><span class="str">/dev/</span></span><span class="hljs-literal"><span class="kwd">null</span></span><span class="pln"> </span><span class="pun">&amp;</span></code></pre>

<h2 id="ما-هو-nohup">
	ما هو nohup؟
</h2>

<p>
	في معظم الأحيان تقوم بتسجيل الدخول إلى الخادوم البعيد من خلال <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></abbr></code>، ويؤدي الخروج من الخادوم إلى إلغاء جميع شيفرات الصدفة والأوامر التي يتم تنفيذها في تلك اللحظة. ولكن تحتاج بعض الأشغال والأوامر وقتًا طويلًا للتنفيذ لذا يستحسن أن تنفّذ الشغل في الخلفية، ولكن إن سجلت الخروج من النظام، فإن الصدفة ستقوم بإيقاف جميع الأشغال الجارية.
</p>

<p>
	هنا يأتي دور nohup. تتيح هذه الأداة تنفيذ الأوامر والعمليات وشيفرات الصدفة وضمان استمرار عملها في الخلفية حتى بعد تسجيل الخروج من الصدفة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs livecodeserver"><span class="pln">nohup </span><span class="hljs-command"><span class="hljs-keyword"><span class="pln">command</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">syntax</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-title"><span class="pln">nohup</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">command</span><span class="pun">-</span><span class="pln">name</span></span><span class="pln"> </span><span class="pun">&amp;</span></span></code></pre>

<h2 id="ما-هو-exec">
	ما هو exec؟
</h2>

<p>
	يستخدم هذا الأمر لتنفيذ العمليات في Linux، ويمكن من خلاله تنفيذ أمر واحد أو أكثر في نفس الوقت.
</p>

<h2 id="كيف-تستخدم-هذه-المكتبة-في-شيفرتك">
	كيف تستخدم هذه المكتبة في شيفرتك؟
</h2>

<p>
	<strong>الخطوة الأولى</strong>: أنشئ ملفّين الأول باسم <code>index.php</code> والثاني <code>process.php</code>.
</p>

<p>
	<strong>الخطوة الثانية:</strong> استورد الملف <code>PHPBackgroundProcesser.php</code> إلى ملف <code>index.php</code>
</p>

<p>
	<strong>الخطوة الثالثة:</strong> أنشئ نسخة <code>instance</code> من الصنف <code>BackgroundProcess</code>.
</p>

<p>
	يمكنك الآن اتباع إحدى الطرق التالية:
</p>

<p>
	الطريقة الأولى:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs php"><span class="hljs-variable"><span class="pln">$proc</span></span><span class="pun">=</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">(</span><span class="hljs-string"><span class="str">'exec php &lt;BASE_PATH&gt;/process.php hello world'</span></span><span class="pun">);</span></code></pre>

<p>
	الطريقة الثانية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs lasso"><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">=</span></span><span class="hljs-literal"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">();</span><span class="pln">
</span><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">setCmd</span><span class="pun">(</span><span class="hljs-string"><span class="str">'exec php &lt;BASE_PATH&gt;/process.php hello world'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">start</span><span class="pun">();</span></code></pre>

<p>
	الطريقة الثالثة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs lasso"><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">=</span></span><span class="hljs-literal"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">();</span><span class="pln">
</span><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">setCmd</span><span class="pun">(</span><span class="hljs-string"><span class="str">'exec php &lt;BASE_PATH&gt;/process.php hello world'</span></span><span class="pun">)</span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">start</span><span class="pun">();</span></code></pre>

<p>
	يمكنك كذلك تنفيذ عنوان PHP URL في الخلفية دون الحاجة إلى تحديد ملف بصيغة <code>.php</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs xml"><span class="pln">$process</span><span class="pun">=</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">(</span><span class="str">"curl -s -o </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">Base</span></span><span class="str"> </span><span class="hljs-attribute"><span class="str">Path</span></span><span class="str">&gt;</span></span><span class="str">/log/log_storewav.log </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">PHP</span></span><span class="str"> </span><span class="hljs-attribute"><span class="str">URL</span></span><span class="str"> </span><span class="hljs-attribute"><span class="str">to</span></span><span class="str"> </span><span class="hljs-attribute"><span class="str">execute</span></span><span class="str">&gt;</span></span><span class="str"> -d param_key=</span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">Param_value</span></span><span class="str">&gt;</span></span><span class="str">"</span><span class="pun">);</span></code></pre>

<p>
	يمكن معرفة العمليات التي يتم تنفيذها بواسطة الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs lasso"><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">=</span></span><span class="hljs-literal"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">();</span><span class="pln">
print_r</span><span class="pun">(</span><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">showAllPocess</span><span class="pun">());</span></code></pre>

<p>
	أما إيقاف العمليات فيكون عن طريق الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6816_7" style=""><code class="hljs lasso"><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">=</span></span><span class="hljs-literal"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">BackgroundProcess</span><span class="pun">();</span><span class="pln">
</span><span class="hljs-variable"><span class="pln">$proc</span></span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">setProcessId</span><span class="pun">(</span><span class="hljs-number"><span class="lit">101</span></span><span class="pun">)</span><span class="hljs-subst"><span class="pun">-&gt;</span></span><span class="pln">stop</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">//set the process id.</span></span></code></pre>

<p>
	ترجمة - وبتصرّف - للمقال <a href="https://coderexample.com/how-to-run-a-php-script-in-background/" rel="external nofollow">How to run a php script in background</a> لصاحبه Sanjay Panda.
</p>
]]></description><guid isPermaLink="false">568</guid><pubDate>Sun, 03 Dec 2017 06:43:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; UJS &#x627;&#x644;&#x62A;&#x627;&#x628;&#x639;&#x629; &#x644;&#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Rails &#x641;&#x64A; &#x625;&#x637;&#x627;&#x631; &#x639;&#x645;&#x644; Laravel &#x623;&#x648; &#x63A;&#x64A;&#x631;&#x647;</title><link>https://academy.hsoub.com/programming/php/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-ujs-%D8%A7%D9%84%D8%AA%D8%A7%D8%A8%D8%B9%D8%A9-%D9%84%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-rails-%D9%81%D9%8A-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-laravel-%D8%A3%D9%88-%D8%BA%D9%8A%D8%B1%D9%87-r565/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/26-2.png.a4469ff77c84b7d7444a1aa07ec5cfc8.png" /></p>

<p>
	تقدّمت منذ فترة بطلب إلى مطوّري إطار عمل Laravel لإضافة مكتبة JavaScript مشابهة لتلك الموجودة في إطار العمل Ruby on Rails. إذ تقدّم المكتبة المتوفرة في إطار Rails مجموعة من الخصائص المفيدة التي يمكن إضافتها إلى شيفرة HTML للحصول على المزيد من الوظائف التي تسهّل على المطوّر أداء الكثير من المهامّ الشائعة. أجري نقاش حول هذا الموضوع وتمخّض النقاش عن الاقتراح التالي: إما أن يصار إلى إنشاء حزمة Composer من طرف ثالث، أو أن المكتبة التابعة لإطار العمل Rails صالحة للاستخدام في <a href="https://academy.hsoub.com/programming/php/laravel/" rel="">Laravel</a>.
</p>

<p>
	وفقًا للمقترح السابق قرّرت استخدام مكتبة UJS التابعة لـ Rails في أحد مشاريعي ورحت أتفحّص الطرق التي يمكن من خلالها استخدام نفس الخصائص في الإصدار الرابع من Laravel. ولسوء الحظ لا يمتلك Laravel نفس التوابع المساعدة الموجودة في Rails والمسؤولة عن أداء وظائف معيّنة، ولكن لا زال بالإمكان تفعيل هذه الوظائف في المكان الذي ترغب فيه باستخدام الخواص الملائمة، ومن المؤكّد أن هذه الوظائف ستعمل حسب المطلوب في أي إطار عمل آخر.
</p>

<h2 id="البداية">
	البداية
</h2>

<p>
	بعد أن تربط مكتبتي <a href="https://academy.hsoub.com/programming/javascript/jquery/" rel="">jQuery</a> و Rails UJS مع ملف HTML ستحتاج إلى إجراء بعض التعديلات السريعة.
</p>

<p>
	سنحتاج أوّلًا إلى إعداد مكتبة UJS للعمل مع رمز CSRF على فرض أنّك تستخدم هذه الرموز في تطبيقاتك (أنصحك باستخدامها)، لذا سنضع وسمي <code>&lt;meta&gt;</code> في بداية المستند:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"csrf-param"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"_token"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"csrf-token"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"{{ csrf_token() }}"</span><span class="tag">&gt;</span></pre>

<p>
	يخبر الوسم الأول مكتبة UJS بالاسم الذي يجب استخدامه لرمز CSRF عند إنشاء الطلب، أما الوسم الثاني فيخبر المكتبة بوسم CSRF الذي يجب استخدامه. يستخدم Laravel افتراضيًا <code>token_</code> كاسم للمعامل (ألق نظرة على ملف <code>filters.php</code> للمزيد من المعلومات)، أما التابع <code>()csrf_token</code> فيضيف رمز الحماية إلى الطلب.
</p>

<h3 id="خاصية-data-method">
	خاصية data-method
</h3>

<p>
	هذه الخاصية مفيدة جدًّا عند استخدام للروابط، إذ تخطف مكتبة UJS النقرة على الرابط وتنشئ طلبًا باستخدام فعل Http الذي نقدّمه إلى الخاصية.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs livecodeserver"><span class="tag">&lt;</span><span class="hljs-operator"><span class="tag">a</span></span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="hljs-string"><span class="atv">"posts/1"</span></span><span class="pln"> </span><span class="atn">data-method</span><span class="pun">=</span><span class="hljs-string"><span class="atv">"delete"</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="atn">rel</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"nofollow"</span></span><span class="tag">&gt;</span><span class="pln">Delete this </span><span class="hljs-built_in"><span class="pln">post</span></span><span class="tag">&lt;/</span><span class="hljs-operator"><span class="tag">a</span></span><span class="tag">&gt;</span></code></pre>

<p>
	عند النقر على الرابط، يتم إنشاء طلب من نوع <code>DELETE</code> بدلًا من الطلب الاعتيادي <code>GET</code> والذي ينشأ من مثل هذه الروابط، وبهذا يمكنك إجراء أحداث بنمط RESTful في تطبيقك دون الحاجة إلى الاستمارات.
</p>

<p>
	إن كنت ترغب في إنشاء روابط مشابهة لهذا الرابط في Laravel فإليك المثال التالي والذي نستخدم فيه دالة <code>link</code> المساعدة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs handlebars"><span class="hljs-expression"><span class="pun">{{</span><span class="pln"> </span><span class="hljs-variable"><span class="pln">link</span></span><span class="pln">_</span><span class="hljs-variable"><span class="pln">to</span></span><span class="pln">_</span><span class="hljs-variable"><span class="pln">route</span></span><span class="pun">(</span><span class="str">'</span><span class="hljs-variable"><span class="str">posts.destroy</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'</span><span class="hljs-variable"><span class="str">Delete</span></span><span class="str"> </span><span class="hljs-variable"><span class="str">this</span></span><span class="str"> </span><span class="hljs-variable"><span class="str">post</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> $</span><span class="hljs-variable"><span class="pln">post</span><span class="pun">-</span></span><span class="pun">&gt;</span><span class="hljs-variable"><span class="pln">id</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">'</span><span class="hljs-variable"><span class="str">data-method</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'</span><span class="hljs-variable"><span class="str">delete</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'</span><span class="hljs-variable"><span class="str">rel</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'</span><span class="hljs-variable"><span class="str">nofollow</span></span><span class="str">'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">}}</span></span></code></pre>

<p>
	جدير بالذكر أنّه يجب إضافة الخاصية <code>rel="nofollow"</code> عند استخدام هذه الدالة المساعدة لضمان عدم فهرسة محركات البحث لهذا الرابط.
</p>

<h3 id="خاصية-data-confirm">
	خاصية <code>data-confirm</code>
</h3>

<p>
	هذه الخاصية مفيدة للتحقّق من الموافقة على إجراء الحدث قبل الاستمرار، وتتم عملية التحقّق هذه بواسطة مربع التنبيه الذي يظهر بواسطة الدالة <code>confirm()</code> في JavaScript، ويمكن استبدال مربّع التنبيه هذا بآخر ذي شكل أجمل حسب الرغبة. تعمل هذه الخاصية بصورة جيّدة مع المثال السابق، فإن كان الرابط أو الزرّ يؤدّي إلى حذف شيء ما فيستحسن حينئذٍ التحقّق من الرغبة في القيام بذلك قبل إجراء عملية الحذف.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs livecodeserver"><span class="tag">&lt;</span><span class="hljs-operator"><span class="tag">a</span></span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="hljs-string"><span class="atv">"posts/1"</span></span><span class="pln"> </span><span class="atn">data-method</span><span class="pun">=</span><span class="hljs-string"><span class="atv">"delete"</span></span><span class="pln"> </span><span class="atn">data-confirm</span><span class="pun">=</span><span class="hljs-string"><span class="atv">"Are you sure you want to delete this post?"</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="atn">rel</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"nofollow"</span></span><span class="tag">&gt;</span><span class="pln">Delete this </span><span class="hljs-built_in"><span class="pln">post</span></span><span class="tag">&lt;/</span><span class="hljs-operator"><span class="tag">a</span></span><span class="tag">&gt;</span></code></pre>

<p>
	إن ألغى المستخدم صندوق التأكيد هذا لن يتم تنفيذ الحدث، والعكس بالعكس. جدير بالذكر أنّك لست ملزمًا باستخدام هذه الطريقة مع خاصية <code>data-method</code> بل يمكن استخدامها مع أي حدث ترغب في التحقق منه قبل إجراءه.
</p>

<h3 id="خاصية-data-disable">
	خاصية data-disable
</h3>

<p>
	قد ترغب أحيانًا في تعطيل زرّ معين بعد النقر عليه مباشرة لإتاحة الفرصة لاكتمال الطلب وفي حال فشل الطلب تعيد تفعيل الزرّ مرة أخرى. تتيح لك مكتبة UJS القيام بهذا الأمر بواسطة خاصّية <code>data-disable</code>.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs ocaml"><span class="tag">&lt;input</span><span class="pln"> </span><span class="hljs-class"><span class="hljs-keyword"><span class="atn">type</span></span><span class="pun">=</span></span><span class="hljs-string"><span class="atv">"submit"</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="atn">value</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"Save post"</span></span><span class="pln"> </span><span class="atn">data-disable</span><span class="tag">&gt;</span></code></pre>

<p>
	هكذا سيتم تعطيل الزر بعد النقر عليه وستمنع المستخدم من النقر المستمر على الزر وإنشاء 10 سجلات جديدة في قاعدة البيانات. بالنسبة لمستخدمي Laravel يمكن الاستفادة من هذه الخاصّية باستخدام منشئ الاستمارات form builder.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs css"><span class="hljs-rules"><span class="pun">{</span><span class="hljs-rule"><span class="pun">{</span><span class="pln"> </span><span class="hljs-attribute"><span class="typ">Form</span></span><span class="pun">:</span><span class="hljs-value"><span class="pun">:</span><span class="hljs-function"><span class="pln">submit</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Save post'</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'data-disable'</span></span><span class="pun">])</span></span><span class="pln"> </span></span></span></span><span class="pun">}}</span></code></pre>

<h3 id="خاصية-data-disable-with">
	خاصّية data-disable-with
</h3>

<p>
	يمكن التوسع في المثال السابق وذلك بتقديم بعض المعلومات المفيدة للمستخدم، فعند تعطيل الزرّ يظهر نصّ يخبر المستخدم بأنّ الطلب في طور الإنشاء في الخلفية.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs ocaml"><span class="tag">&lt;input</span><span class="pln"> </span><span class="hljs-class"><span class="hljs-keyword"><span class="atn">type</span></span><span class="pun">=</span></span><span class="hljs-string"><span class="atv">"submit"</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="atn">value</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"Save post"</span></span><span class="pln"> </span><span class="atn">data-disable-</span><span class="hljs-keyword"><span class="atn">with</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"Saving this post..."</span></span><span class="tag">&gt;</span></code></pre>

<p>
	والآن عندما يكون الزرّ معطلًا، يتم استبدال النص بعبارة تدلّ على أن النقر على الزرّ قد أدى إلى حدوث شيء ما في الخلفية.
</p>

<h3 id="خاصية-data-remote">
	خاصّية data-remote
</h3>

<p>
	عند إضافة الخاصّية <code>data-remote</code> إلى الاستمارة، تقوم مكتبة UJS بإرسال الاستمارة كطلب Ajax. وستأخذ المكتبة كل شيء بالحسبان (طريقة الإرسال، التحقق من الموافقة على الإجراء… الخ) قبل إرسال الاستمارة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">form</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">action</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"posts"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">method</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"post"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">data-remote</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-comment"><span class="com">&lt;!-- Form goes here. --&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">form</span></span><span class="tag">&gt;</span></span></code></pre>

<p>
	ويمكن التعامل مع الاستجابة الواردة بعد نجاح الطلب بكل سهولة، فإن استجاب المتصفّح بواسطة JavaScript فستنفّذ الاستجابة فور اكتمال الطلب. على سبيل المثال، قد تختار إعادة توجيه المستخدم بعد تنفيذ طلب للحذف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs handlebars"><span class="xml"><span class="pln">window</span><span class="pun">.</span><span class="pln">location</span><span class="pun">.</span><span class="pln">href </span><span class="pun">=</span><span class="pln"> </span><span class="str">'</span></span><span class="hljs-expression"><span class="str">{{ </span><span class="hljs-variable"><span class="str">route</span></span><span class="str">('</span><span class="hljs-variable"><span class="pln">posts</span><span class="pun">.</span><span class="pln">index</span></span><span class="str">') }}</span></span><span class="xml"><span class="str">'</span><span class="pun">;</span></span></code></pre>

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

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs handlebars"><span class="xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">a</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">href</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"</span></span></span></span><span class="hljs-expression"><span class="atv">{{ </span><span class="hljs-variable"><span class="atv">route</span></span><span class="atv">('</span><span class="hljs-variable"><span class="atv">posts.destroy</span></span><span class="atv">', $</span><span class="hljs-variable"><span class="atv">post-</span></span><span class="atv">&gt;</span><span class="hljs-variable"><span class="pln">id</span></span><span class="pln">) }}</span></span><span class="xml"><span class="hljs-tag"><span class="hljs-value"><span class="pln">"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pln">data-method</span></span><span class="pln">=</span><span class="hljs-value"><span class="pln">"destroy"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pln">data-confirm</span></span><span class="pln">=</span><span class="hljs-value"><span class="pln">"Delete this post?"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pln">rel</span></span><span class="pln">=</span><span class="hljs-value"><span class="pln">"nofollow"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pln">data-remote</span></span><span class="pln">&gt;</span></span><span class="pln">Delete this post</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">a</span></span><span class="tag">&gt;</span></span></span></code></pre>

<p>
	يمكن استخدام الشيفرة التالية لإخفاء المقالة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs handlebars"><span class="xml"><span class="pln">$</span><span class="pun">(</span><span class="str">'#post-</span></span><span class="hljs-expression"><span class="str">{{ $</span><span class="hljs-variable"><span class="str">post-</span></span><span class="str">&gt;</span><span class="hljs-variable"><span class="str">id</span></span><span class="str"> }}</span></span><span class="xml"><span class="str">'</span><span class="pun">).</span><span class="pln">fadeOut</span><span class="pun">();</span></span></code></pre>

<p>
	وهكذا، تُحذف المقالة من قاعدة البيانات والعرض في آن معًا.
</p>

<h3 id="خاصية-data-type">
	خاصّية <code>data-type</code>:
</h3>

<p>
	إن استخدمت الخاصّية السابقة <code>data-remote</code> يمكنك كذلك استخدام خاصية <code>data-type</code> لتحديد هيئة البيانات التي يتم إرسالها إلى الخادوم. فعلى سبيل المثال يمكن إرسال الاستمارة على هيئة Json:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_206_7" style="">
<code class="hljs rust"><span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">data-</span><span class="hljs-keyword"><span class="atn">type</span></span><span class="pun">=</span><span class="hljs-string"><span class="atv">"json"</span></span><span class="tag">&gt;</span></code></pre>

<h2 id="الأحداث-البعيدة">
	الأحداث البعيدة
</h2>

<p>
	عند استخدام خاصّية <code>data-remote</code> يمكن الوصول إلى الأحداث المختلفة في طلب Ajax لتأدية بعض المهامّ الإضافية. إذ تطلق مكتبة UJS عددًا من الأحداث المساعدة خلال دورة حياة الطلب والتي من شأنها أن تساعد في بناء تطبيقات أكثر تعقيدًا.
</p>

<ul>
<li>
		<p>
			<code>ajax:before</code> ينطلق هذا الحدث قبل حدوث أي شيء، وإيقاف هذا الحدث يؤدي إلى إلغاء الطلب.
		</p>
	</li>
	<li>
		<p>
			<code>ajax:beforeSend</code>: ينطلق هذا الحدث قبل إرسال طلب Ajax مباشرة، وإيقاف الحدث يؤدي إلى إلغاء الطلب.
		</p>
	</li>
	<li>
		<p>
			<code>ajax:send</code>: ينطلق عند إرسال طلب Ajax.
		</p>
	</li>
	<li>
		<p>
			<code>ajax:success</code>: ينطلق بعد اكتمال الطلب بنجاح.
		</p>
	</li>
	<li>
		<code>ajax:error</code>: ينطلق بعد فشل إرسال الطلب.
	</li>
	<li>
		<p>
			<code>ajax:aborted:required</code>: ينطلق في حال وجود حقول إلزامية فارغة في الاستمارة، وفي حال إيقاف الحدث يتم إرسال الاستمارة.
		</p>
	</li>
	<li>
		<p>
			<code>ajax:aborted:file</code>: ينطلق في حال وجود حقول ملفات غير فارغة في الاستمارة، ويتم تجاهل الطلب في حال توقّف الحدث.
		</p>
	</li>
</ul>
<p>
	آمل أن يكون هذا الموضوع مفيدًا لكل من يرغب في استخدام مكتبة UJS التابعة لإطار العمل Ruby on Rails مع إطارات العمل الأخرى مثل Laravel، إذ أرى أن هذه المكتبة مفيدة ولا يجوز أن تكون حكرًا على مستخدمي إطار Rails.
</p>

<p>
	ترجمة - وبتصرّف - للمقال <a href="https://www.neontsunami.com/posts/using-rails-ujs-in-laravel-4" rel="external nofollow">Using Rails UJS in Laravel 4 (or any other framework)</a> لصاحبه Dwight Conrad Watson.
</p>
]]></description><guid isPermaLink="false">565</guid><pubDate>Sun, 26 Nov 2017 11:07:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x642;&#x635;&#x64A;&#x631;&#x629; &#x641;&#x64A; Composer</title><link>https://academy.hsoub.com/programming/php/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%82%D8%B5%D9%8A%D8%B1%D8%A9-%D9%81%D9%8A-composer-r559/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/12-2.png.aa879433c29ecd9fad8b013b2b21af7b.png" /></p>

<p>
	Composer هو أداة لإدارة الاعتماديات في لغة PHP، تخيل أنّك تعمل على مشروع يتضمن العديد من الاعتماديات التابعة لمشاريع أو مكتبات أخرى. سيدير Composer بالطرق التالية:
</p>

<ol>
<li>
		تحميل مكتبة الاعتمادية من مستودعاتها إلى مشروعك بصورة تلقائية.
	</li>
	<li>
		يمكنك وبكلّ سهولة تحديث مكتبتك عند ظهور إصدار جديد منها.
	</li>
	<li>
		عند تحميل مكتبة الاعتمادية يتحقّق composer من المتطلبات الدنيا للخادوم.
	</li>
	<li>
		سينشئ Composer ملف <code>autoloader.php</code> لجميع المكتبات المحمّلة وسيحمّل الاعتمادية كاملةً في المشروع الذي تعمل عليه.
	</li>
</ol>
<h2 id="ماذا-سيحصل-إن-لم-تستخدم-composer">
	ماذا سيحصل إن لم تستخدم Composer؟
</h2>

<ol>
<li>
		ستضطرّ إلى تحميل مكتبة الاعتمادية يدويًّا.
	</li>
	<li>
		يجب عليك التحقّق من الإصدارات الجديدة للمكتبات دوريًّا، وتحميل الملفات إلى المشروع يدويًّا.
	</li>
	<li>
		يجب عليك تحميل جميع المكتبات إلى مشروعك باستخدام دالتي <code>require</code> أو <code>include</code>.
	</li>
</ol>
<p>
	إليك المثال التالي لتوضيح ما سبق:
</p>

<p>
	لديك مشروع تعمل عليه باستخدام إطار عمل Cakephp أو Laravel، وترغب في إضافة خاصية إرسال الرسائل إلكترونية إلى المشروع وتحتاج إلى اتصال من نوع SMTP. ستقوم حينها بتحميل إحدى المكتبات المتخصّصة في هذا المجال مثل Phpmailer أو Swiftmailer.
</p>

<p>
	إن استخدمت composer للحصول على هذا المكتبات، فسيكون بميسورك تحميل المكتبة المطلوبة مباشرة إلى مجلد vendor ضمن المشروع. وإن حصلت هذه المكتبة على تحديث جديد، يكفي أن تنفّذ أمرًا واحدًا في سطر الأوامر، ولن تكون بحاجة إلى التحقّق ممّا إذا كان التحديث متوافقًا مع الإصدار 5.4 أو 5.3 من php.
</p>

<p>
	سيتّضح الأمر أكثر فأكثر من خلال الأمثلة التالية.
</p>

<h2 id="كيف-يتم-تثبيت-composer-في-النظام">
	كيف يتم تثبيت Composer في النظام
</h2>

<p>
	قبل تثبيت composer يجب التحقّق من أنّك تعمل على الإصدار 5.4 وما بعده من لغة PHP.
</p>

<p>
	إن كنت من مستخدمي نظام ويندوز فيمكنك تحميل الملف التنفيذي الخاص بتثبيت Composer وذلك من الرابط: <a href="https://getcomposer.org/" rel="external nofollow">https://getcomposer.org/</a>، وتنصيب Composer في نفس المجلد الذي قمت بتثبيت php.exe فيه. (C:\wamp\bin\php\php5.5.12 مثلاً).
</p>

<p>
	أما مستخدمو نظامي Linux و Mac فيمكنهم فتح الطرفية وكتابة الأمر التالي فيها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs lasso"><span class="pln">curl </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">sS</span></span><span class="pln"> https</span><span class="pun">:</span><span class="hljs-comment"><span class="com">//getcomposer.org/installer | php</span></span></code></pre>

<p>
	سيقوم هذا الأمر بتحميل ملف <code>composer.phar</code> (phar تعني php archive) بواسطة الأداة curl، وللوصول إلى composer من أي مكان في حاسوبك يجب عليك نقل هذا الملف إلى المجلد <code>/usr/bin/composer</code>، وذلك بتنفيذ الأمر التالي في الطرفية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<span class="pln">sudo mv composer</span><span class="pun">.</span><span class="pln">phar </span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">composer</span></pre>

<p>
	للتحقق من وجود Composer يكفي الدخول إلى سطر الأوامر في ويندوز أو الطرفية في Linux و Mac وكتابة كلمة <code>composer</code> والضغط على زر الإدخال Enter. إن كان Composer مثبّتًا في جهازك ستظهر شاشة الترحيب التالية إضافة إلى جميع ا لأوامر المستخدمة في composer.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25481" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-001.png.77802252828e7b713b4520f090218d52.png" rel=""><img alt="pic-001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25481" data-unique="yqdszqea4" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-001.thumb.png.2126a2ac38bd0c9560b9412bafa71046.png"></a>
</p>

<h2 id="تطبيق-عملي-لاستخدام-مكتبة-composer">
	تطبيق عملي لاستخدام مكتبة Composer
</h2>

<p>
	سيبحث Composer عن الملف <code>composer.json</code> حيث سندرج جميع الاعتماديات التي نحتاج إليها في المشروع.
</p>

<p>
	لننشئ مجلّدًا جديدًا بواسطة الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs perl"><span class="hljs-keyword"><span class="pln">mkdir</span></span><span class="pln"> composer_example</span></code></pre>

<p>
	ادخل إلى المجلد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">cd</span></span><span class="pln"> composer_example</span></code></pre>

<p>
	أنشئ ملف <code>composer.json</code> هنا، وأضف إليه ما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs json"><span class="pun">{</span><span class="pln">
    </span><span class="str">"</span><span class="hljs-attribute"><span class="str">require</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="pun">{</span><span class="pln">
          </span><span class="str">"</span><span class="hljs-attribute"><span class="str">jdorn/sql-formatter</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"1.3.*@dev"</span></span><span class="pln">
    </span></span><span class="pun">}</span><span class="pln">
</span></span><span class="pun">}</span></code></pre>

<p>
	هنا <code>jdorn</code> هو اسم صاحب الحزمة <code>sql-formatter</code> التي نرغب في تثبيتها ضمن المشروع.
</p>

<p>
	ولكن قد تتسائل من أين سيأتي Composer بهذه الحزمة. في الواقع هناك موقع إلكتروني آخر هو <a href="https://packagist.org/" rel="external nofollow">Packagist</a> يتضمّن جميع المكتبات الشائعة ويمكن تصفّحها من خلال الموقع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25482" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-002.png.266c5ca6254a14e7c03b76e42e709107.png" rel=""><img alt="pic-002.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25482" data-unique="awrawukn7" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-002.thumb.png.c0c2eda3b5a17ef9410c25b63169dbf0.png"></a>
</p>

<p>
	مكتبة <code>sql-formatter</code> عبارة عن صنف php صغير الحجم يعمل على تنسيق عبارات SQL حيث يضبط الإزاحات في بداية العبارة تلقائيًا كما يدعم تلوين الكلمات المفتاحية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25483" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-003.png.a63f56ff2aec76263ba9b8b67152a707.png" rel=""><img alt="pic-003.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25483" data-unique="ahxzcoxl0" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-003.thumb.png.be19a232365da8ec610d1be105210f3c.png"></a>
</p>

<p>
	بعد أن أعددنا ملف <code>composer.json</code> يمكننا تحميل وتنصيب الملفات المطلوبة في مجلد المشروع بواسطة الأمر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs cmake"><span class="pln">composer </span><span class="hljs-keyword"><span class="pln">install</span></span></code></pre>

<p>
	سيتم تحميل جميع الملفات المطلوبة ومن ضمنها ملفات <code>autoload</code> إلى المجلد <code>composer_example/vendor</code>.
</p>

<p>
	والآن أنشئ ملفًّا باسم <code>index.php</code> في المجلد <code>composer_example</code> واجلب فيه الملف <code>autoload.php</code> باستخدام الدالة <code>require</code> وبذلك سيتمّ تحميل جميع الاعتماديات في هذا الملف. إليك المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs xml"><span class="php"><span class="hljs-preprocessor"><span class="pun">&lt;?</span><span class="pln">php</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">require</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"vendor/autoload.php"</span></span><span class="pun">;</span><span class="pln">

</span><span class="hljs-variable"><span class="pln">$query</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"SELECT count(*),`Column1`,`Testing`, `Testing Three` FROM `Table1`
    WHERE Column1 = 'testing' AND ( (`Column2` = `Column3` OR Column4 &gt;= NOW()) )
    GROUP BY Column1 ORDER BY Column3 DESC LIMIT 5,10"</span></span><span class="pun">;</span><span class="pln">

</span><span class="hljs-keyword"><span class="pln">echo</span></span><span class="pln"> </span><span class="typ">SqlFormatter</span><span class="pun">::</span><span class="pln">format</span><span class="pun">(</span><span class="hljs-variable"><span class="pln">$query</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-preprocessor"><span class="pun">?&gt;</span></span></span>
</code></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25484" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-004.png.4e58f9c9bb8959e667b45b45b1598c5a.png" rel=""><img alt="pic-004.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25484" data-unique="uyrtjr9lr" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-004.thumb.png.b6c07dcf796740a1f832fd2c0a7d91d3.png"></a>
</p>

<p>
	لاحظ مدى سهولة وسرعة التعامل مع الاعتماديات بواسطة Composer.
</p>

<h2 id="لننشئ-مشروعا-آخر">
	لننشئ مشروعًا آخر
</h2>

<p>
	لنفترض أننا نرغب في إضافة إطار عمل Codeigniter بواسطة Composer. لن نستخدم هذه المرّة الأمر <code>composer install</code> بل سنستخدم الأمر <code>composer create-project</code> لإنشاء مشروع جديد.
</p>

<p>
	توجّه إلى موقع Packagist وابحث عن مكتبة Codeigniter، ثم حمّل نسخة من إطار العمل إلى مجلد المشروع الذي تعمل عليه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs sql"><span class="pln">composer </span><span class="hljs-operator"><span class="hljs-keyword"><span class="pln">create</span></span><span class="pun">-</span><span class="pln">project codeigniter</span><span class="pun">/</span><span class="pln">framework </span><span class="pun">مجلد</span><span class="pln"> </span><span class="pun">المشروع</span></span></code></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25485" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-005.png.827881a23ebc3179614e228ea4aac32b.png" rel=""><img alt="pic-005.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25485" data-unique="tcv4otoa9" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-005.thumb.png.68745347982f3e704d8be8df6eb4bbe3.png"></a>
</p>

<p>
	بعد اكتمال العملية ستجد ملف <code>composer.json</code> في مجلد المشروع، ويمكن إضافة المزيد من الاعتماديات إلى مشروعك بواسطة هذا الملف. لنفترض أنّك ترغب في استخدام حزمة <code>sql-formatter</code> في مشروعك هذا. توجّه إلى ملف <code>composer.json</code> وعدّله ليصبح بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs json"><span class="pun">{</span><span class="pln">
    </span><span class="str">"</span><span class="hljs-attribute"><span class="str">description</span></span><span class="str">"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"A way to install CodeIgniter via composer"</span></span></span><span class="pun">,</span><span class="pln">
    </span><span class="str">"</span><span class="hljs-attribute"><span class="str">name</span></span><span class="str">"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"rogeriopradoj/codeigniter"</span></span></span><span class="pun">,</span><span class="pln">
    </span><span class="str">"</span><span class="hljs-attribute"><span class="str">license</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"OSL-3.0"</span></span></span><span class="pun">,</span><span class="pln">
    </span><span class="str">"</span><span class="hljs-attribute"><span class="str">require</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="pun">{</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">php</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"&gt;=5.2.4"</span></span></span><span class="pun">,</span><span class="pln">
        </span><span class="str">"</span><span class="hljs-attribute"><span class="str">jdorn/sql-formatter</span></span><span class="str">"</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"1.3.*@dev"</span></span><span class="pln">
    </span></span><span class="pun">}</span><span class="pln">
</span></span><span class="pun">}</span></code></pre>

<p>
	ثمّ حدّث الاعتماديات بواسطة الأمر:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2094_8" style="">
<code class="hljs sql"><span class="pln">composer </span><span class="hljs-operator"><span class="hljs-keyword"><span class="pln">update</span></span></span></code></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25486" href="https://academy.hsoub.com/uploads/monthly_2017_11/pic-006.png.5ddc70718830408000eaee3373a5c650.png" rel=""><img alt="pic-006.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25486" data-unique="1gaj9tnvu" src="https://academy.hsoub.com/uploads/monthly_2017_11/pic-006.thumb.png.d3faf6fff25a0c3bc14a89a8af7f7833.png"></a>
</p>

<p>
	والآن إن كنت ترغب في رفع هذا المشروع إلى Github أو مشاركته مع أحد الأصدقاء، لن تكون بحاجة إلى إرسال مجلد vendor، بل يكفي أن ترسل الملف <code>composer.json</code> وسيكون بميسور صديقك تحميل جميع الاعتماديات المطلوبة والمستخدمة في المشروع.
</p>

<p>
	عليك بتجربة composer، إذ تستخدمه معظم أطر عمل php المعروفة مثل Laravel، Symfony 2 و Yii إضافة إلى بعض حزم php الرائعة التابعة لـ <a href="https://thephpleague.com/" rel="external nofollow">Phpleague</a>. فماذا تنتظر إذًا؟
</p>

<p>
	ترجمة - وبتصرّف - للمقال <a href="https://coderexample.com/composer-easy-tutorial/" rel="external nofollow">Composer easy tutorial – php dependency management tool</a> لصاحبه Arkaprava Majumder.
</p>
]]></description><guid isPermaLink="false">559</guid><pubDate>Sun, 12 Nov 2017 17:00:00 +0000</pubDate></item></channel></rss>
