<?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/4/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: PHP</description><language>ar</language><item><title>&#x643;&#x634;&#x641; &#x627;&#x644;&#x633;&#x62A;&#x627;&#x631; &#x639;&#x646; &#x623;&#x633;&#x631;&#x627;&#x631; &#x627;&#x644;&#x645;&#x644;&#x641; composer.lock</title><link>https://academy.hsoub.com/programming/php/%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D8%B3%D8%AA%D8%A7%D8%B1-%D8%B9%D9%86-%D8%A3%D8%B3%D8%B1%D8%A7%D8%B1-%D8%A7%D9%84%D9%85%D9%84%D9%81-composerlock-r536/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59c3f8e151b3a_main(3).jpg.57d84ae46728262cc08636b83650c8c0.jpg" /></p>

<p>
	يسألني الناس أينما ذهبت - في المؤتمرات، المحاضرات، لدى وكالات تطوير المواقع وغيرها - عن ملف <code>composer.lock</code>. يبدو وكأن الأمر يتعلّق بلغز يزرع الشكوك حول المعمورة! أقدّم لك هذا المقال لتوضيح ماهية هذا الملف وفكّ اللغز الذي يمثّله.
</p>

<p>
	يعدّ <a href="https://academy.hsoub.com/programming/php/%D9%85%D8%A7-%D9%87%D9%88-composer-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D9%83%D9%84-%D9%85%D8%B7%D9%88%D8%B1-php-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r10/" rel="">Composer</a> أداة تدير الإصدارات الخاصة بمكتبات <a href="https://academy.hsoub.com/programming/php/" rel="">PHP</a> التي يستخدمها المطوّرون في مشاريعهم البرمجية. سأفترض - لأغراض هذا المقال - أنه سبق لك استخدام Composer في مشاريع سابقة.
</p>

<p>
	فلنفترض أن لدينا مشروع PHP جديدا ندير اعتماديّاته Dependencies عن طريق Composer. نبدأ بملف <code>composer.json</code> الذي يُستخدَم لإعداد لائحة بالاعتماديّات التي نريد تثبيتها. يبدو الملف على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8872_9" style="">
<span class="pun">{</span><span class="pln">
    </span><span class="str">"require"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"assassins/ezio"</span><span class="pun">:</span><span class="pln">   </span><span class="str">"1.1.0"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"assassins/edward"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"1.1.2"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"templars/shay"</span><span class="pun">:</span><span class="pln">    </span><span class="str">"1.1.*"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عرّفنا بوضوح الإصدارات التي نحتاجها بالنسبة للحزمتين الأولى والثانية؛ إلا أن الأمر مختلف قليلا يالنسبة للحزمة الثالثة <code>templars/shay</code> التي حدّدنا لها بطريقة أكثر مرونة فلم نعرّف إصدار الترقيع Patch version؛ وبالتالي سيكون أي ترقيع للإصدار <code>1.1</code> مناسبا للمشروع.
</p>

<p>
	تنبغي ملاحظة أن هذه الأسماء المذكورة في الشفرة أعلاه هي أسماء مفترضة لحزم وليست حزما حقيقية يمكن تثبيتها.
</p>

<p>
	يمكن القول إن ملف <code>composer.json</code> هو دليل “تقريبي” للإصدارات التي نريد تثبيتها؛ فاستخدام ماسك المكان <code>*</code> يجعل إصدارات عدّة متوافرة لاستخدامها. بمعنى آخر، يحدّد الملف هامشا مقبولا لهرميّة الاعتماديّات في التطبيق.
</p>

<p>
	لا يوجد لدينا لحدّ الساعة، أي في بداية المشروع، ملفّ <code>composer.lock</code>؛ إلا أنه سيظهر بعد تنفيذنا للأمر <code>composer install</code>. نجد مباشرة بعد تنفيذ الأمر <code>composer install</code> ملفّا غريبا باسم <code>composer.lock</code> في المجلّد الجذر للمشروع. إن ألقيت نظرة على ما بداخله فستجد أنه كبير نوعا ما.
</p>

<p>
	حان الوقت الآن لكشف اللّغز. في الواقع؛ الملف <code>composer.json</code> هو دليل تقريبي - كما قلنا - لإصدارات الاعتماديّات التي يتوجّب على Composer تثبيتها، بينما الملف <code>composer.lock</code> هو تسجيل دقيق بالإصدارات التي ثُبِّتت عند تنفيذ الأمر <code>composer install</code>. أي أنه يسجّل ما ثبّته Composer من مكتبات لمشروعك. في ما يلي مثال بسيط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8872_11" style="">
<span class="str">"source"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"git"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"https://github.com/templars/shay.git"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"reference"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"98c313c831e5d99bb393ba1844df91bab2bb5b8b"</span><span class="pln">
</span><span class="pun">},</span></pre>

<p>
	هل ترى سلسلة المحارف الطويلةَ تلك؟ هذا هو المعرّف الدقيق <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B3%D9%8A%D8%B1-%D8%B9%D9%85%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r267/#%D8%A7%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D9%85-%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%88%D8%AD%D9%81%D8%B8-%D8%A7%D9%84%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A%D9%87:5bc8635476404749f76287ef866562d6" rel="">لإيداع Commit</a> الإصدار المثبّت عندما اتّبع Composer تعليمات <code>composer.json</code>. يحتفظ الملف <code>composer.lock</code> كذلك بجميع إصدارات الاعتماديّات التي تتطلّبها اعتماديّات المشروع؛ والمكتبات التي تقوم عليها اعتماديّات اعتمديّات المشروع.. وهكذا دواليك. يعني هذا أن الملف <code>composer.lock</code> يحوي التسلسل الهرمي الكامل لاعتماديّات التطبيق.
</p>

<ul>
<li>
		في ماذا يفيد وجود التسلسل الهرمي لاعتماديّات المشروع في الملف <code>composer.lock</code>؟
	</li>
</ul>
<p>
	حسنا؛ يمكن أن تجرّب حذف المجلّد الذي توجد به اعتماديّات المشروع، مثلا <code>vendor</code> في <a href="https://academy.hsoub.com/programming/php/laravel/" rel="">Laravel</a>؛ ثم تنفيذ الأمر <code>composer install</code> من جديد. سيجد Composer هذه المرة أن لديك ملفّ <code>composer.lock</code> وبدلا من البحث عن إصدارات متوافقة مع تعليمات الملف <code>composer.json</code>فسيلجأ إلى الإصدارات الدقيقة المذكورة في الملف <code>composer.lock</code> ويثبّتها. يعني هذا أننا سنحصُل على نفس المكتبات التي حذفناها بحذف مجلّد الاعتماديّات.
</p>

<ul>
<li>
		سؤال آخر.. هل يجب تضمين الملف <code>composer.lock</code> في مستودع Git؟
	</li>
</ul>
<p>
	يجب أن تكون الإجابة الآن واضحة. إن أردت تسجيل الإصدارات الدقيقة للاعتماديّات التي استخدمتها في المشروع فالإجابة هي نعم؛ وهذا هو الواقع في أغلب المشاريع.
</p>

<p>
	إن كنت تعمل ضمن فريق مطوّرين فإن جعل الملف <code>composer.lock</code> في المستودع يضمن أن الجميع يستخدم نفس الإصدارات؛ الأمر الذي يمكن أن يكون مفيدا في تنقيح Debugging الأخطاء التي تظهر لدى مطوّر واحد فقط من الفريق.
</p>

<p>
	إن كنت توزّع تطبيقك عبر Git فإن تضمين الملف <code>composer.lock</code> في المستودع سيضمن أن إصدارات الاعتماديّات التي استخدمتها في التطوير وأجريت عليها الاختبارات هي نفسها المستخدمة في بيئة الإنتاج.
</p>

<ul>
<li>
		لماذا من المهم استخدام نفس إصدارات الاعتماديّات؟
	</li>
</ul>
<p>
	فلنفترض أن Git يتجاهل وجود الملف <code>composer.lock</code>. تنفّذ الأمر <code>composer install</code>، يبحث Composer عن آخر ترقيع للإصدار <code>1.1</code> من الحزمة <code>templars/shay</code> فيجد الإصدار <code>1.1.4</code> ويثبّته.
</p>

<p>
	تعمل على المشروع باستخدام الإصدار <code>1.1.4</code>، وفي هذه الأثناء يقدّم فريق الحزمة <code>templars/shay</code> الإصدار <code>1.1.5</code> الذي - لسوء الحظ - يتضمّن علة برمجيّة Bug حرجة. عندما تنشُر مشروعك على بيئة الإنتاج يثبّت Composer - بالاعتماد على تعليمات الملف <code>composer.json</code> - الإصدار <code>1.1.5</code> من الحزمة الذي يحوي علّة تمنع تطبيقك من العمل على النحو الذي تريده.
</p>

<p>
	يمكنك استنتاج أنه لو كان الملف <code>composer.json</code> في المستودع لأدّى تنفيذ الأمر <code>composer install</code> في بيئة الإنتاج إلى تثبيت الإصدار <code>1.1.4</code> من الحزمة <code>templars/shay</code> الذي سبق لك اختبار التطبيق معه.
</p>

<p>
	باختصار:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			يضمن الملف <code>composer.lock</code> أن إصدارات الاعتماديّات التي ستُثبَّت حسب مستوى يصل في دقّته الإيداعات الفرديّة للحزم.
		</p>
	</div>
</blockquote>

<ul>
<li>
		في الأخير.. متى يتغيّر الملف <code>composer.lock</code> ولأي سبب؟
	</li>
</ul>
<p>
	أرى طوال الوقت مطورين ينفّذون الأمر <code>composer update</code> كلّما حدّثوا الملف <code>composer.json</code>، للحصول على الحزم الجديدة التي أضافوها إلى الملف. في الواقع هذا الأمر خاطئ! يجب أن تستخدم الأمر <code>composer install</code> بدلا من ذلك، إذ أنه يثبّت الحزم الجديدة دون تحديث إصدارات الحزم الأخرى؛ هذه الطريقة آمن كثيرا.
</p>

<p>
	في ما يلي لائحة بإجراءات تتسبّب في تحديث الملف <code>composer.lock</code>:
</p>

<ul>
<li>
		<p>
			تنفيذ الأمر <code>composer install</code> للمرة الأولى. يُنشَأ الملف <code>composer.lock</code> لتسجيل الإصدارات الدقيقة للاعتماديّات المثبّتة.
		</p>
	</li>
	<li>
		<p>
			تنفيذ الأمر <code>composer install</code> بعد إضافة حزم جديدة. يُضاف الإصدار الدقيق للحزمة إلى الملف <code>composer.lock</code>.
		</p>
	</li>
	<li>
		<p>
			تنفيذ الأمر <code>composer update</code>. تُحدَّث إصدارات جميع الحزم إلى الترقيع الأخير بما يتوافق مع تعليمات الملف <code>composer.json</code>، وهو ما ينتُج عنه تحديث الإصدارات الدقيقة في الملف <code>composer.lock</code>.
		</p>
	</li>
	<li>
		<p>
			تنفيذ الأمر <code>composer update package/name</code> لتحديث الحزمة المذكورة إلى آخر ترقيع، بما يتوافق مع تعليمات الملف <code>composer.json</code>، وبالتالي يُحدَّث الملف <code>composer.lock</code> ليعكس التغيير الحاصل في إصدار الحزمة.
		</p>
	</li>
</ul>
<p>
	يعني ما سبق أن <code>composer install</code> أمر “آمن”، ولن ينتُج عنه سوى إضافة حزم جديدة إلى الملف <code>composer.lock</code> (وليس تحديث حزم موجودة مسبقا). في حين أن الأمر <code>composer update</code> أمر “خطِر”، إذ أنه يتسبّب في تغيير مباشر على الإصدارات الدقيقة الموجودة في الملف <code>composer.lock</code> .
</p>

<p>
	أرجو أن يكون الملف اللغز <code>composer.lock</code> قد اتّضح لك بعد قراءة هذا المقال. إن كنت تعلّمت شيئا أو اثنين من هذا المقال فأرجو أن تشاركه مع أصدقائك حتى يعرفوا هم أيضا سر الملف العظيم.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://daylerees.com/the-composer-lock-file/" rel="external nofollow">PHP: The Composer Lock File</a> لصاحبه Dayle Rees.
</p>

<p>
	حقوق خلفية الصورة البارزة محفوظة لـ <a href="http://www.freepik.com/free-vector/digital-technology-background-with-line-mesh_1107206.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">536</guid><pubDate>Fri, 22 Sep 2017 06:19:10 +0000</pubDate></item><item><title>&#x627;&#x62E;&#x62A;&#x628;&#x627;&#x631; &#x628;&#x631;&#x627;&#x645;&#x62C; PHP &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Codeception</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-php-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-codeception-r470/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_04/mmmm.png.e904cde7c86e959acae5d8833259642d.png" /></p>

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

<ul>
<li>
		يستخدم فريقك أسلوب «<a href="https://en.wikipedia.org/wiki/Test-driven_development" rel="external nofollow">التطوير الموجّه بالاختبارات</a>» (TDD) أو «<a href="https://en.wikipedia.org/wiki/Behavior-driven_development" rel="external nofollow">التطوير الموجّه بالسلوك</a>» (BDD).
	</li>
	<li>
		تُجرى عدِّة عمليات إيداع في مستودع Git التابع لمشروعك يوميًا.
	</li>
	<li>
		أنت مطوِّرٌ محترف، وتعمل على مشروع جاد.
	</li>
</ul>
<p>
	يمكنك أن تعذر نفسك بقولك أنَّ هنالك فريق كامل مخصص للاختبارات، وهم مجموعةٌ من الأشخاص الذين يجرون اختبارات ويكتبونها عند الحاجة. لكن لك أن تتخيل كم سيستغرق حلّ العلّة من الوقت بعد أن تضيف وظائف جديدة إلى مشروعك.
</p>

<h2>
	ما المشاكل التي تحلها الاختبارات؟
</h2>

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

<p>
	لكن كن على يقين أنَّ شيفرتك ستتغير فيما بعد (إما بتصحيح العلل، أو إضافة ميزات جديدة، حتى تصبح شيفرتك خاليةً من الأخطاء الموصوفة في حالة الاختبار). يمكن -إضافةً إلى ما سبق- استعمال حالات الاختبار المكتوبة بشكلٍ جيد في التوثيق لأنك سترى من خلالها ما هو السلوك المتوقع للبرنامج في حالات معيّنة. خلاصة القول أنَّ كتابة الاختبارات هي استثمارٌ مهمٌ تستفيد منه في المستقبل.
</p>

<p>
	إذًا، ما هي الاختبارات التي يمكننا استعمالها في مشروعنا؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22678" href="https://academy.hsoub.com/uploads/monthly_2017_04/1.jpg.ef697a62eb2cb5f5888f3913e22c3a4e.jpg" rel=""><img alt="1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="22678" data-unique="vlhrhwh0i" src="https://academy.hsoub.com/uploads/monthly_2017_04/1.thumb.jpg.3dabafc5e98d411423f3e224e63c60c3.jpg"></a>
</p>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				لا تكفي اختبارات الوحدات (unit tests) الأساسية بمفردها، فيجب استعمال اختبارات لتكامل الأجزاء مع بعضها (integration tests) والاختبارات الوظيفية (function tests) واختبارات القبول (acceptance tests).
			</p>
		</div>
	</blockquote>

	<p>
		 
	</p>
</blockquote>

<ul>
<li>
		اختبارات الوحدات (unit tests): هي اختباراتٌ منخفضة المستوى (low-level) التي تتحقق من سلامة أجزاء صغيرة من شيفرتك، والتي تكون عادةً الدوال الموجودة في الأصناف (classes) الموجودة في مشروعك والمعزولة عن بعضها.
	</li>
	<li>
		اختبارات التكامل (integration tests): تتحقق اختبارات التكامل من سلامة أداء جزءٍ من برنامجك والذي قد يحتوي على عدِّة أصناف أو دوال، إلا أنها تؤدي جميعًا غرضًا وحيدًا ألا وهو توفير ميزة معيّنة. يجب أن تتحقق هذه الاختبارات من كيفية تفاعل الأصناف مع بعضها.
	</li>
	<li>
		الاختبارات الوظيفية (function tests): اختبار استجابة التطبيق لمختلف الطلبيات، كالتغيرات الحاصلة في قاعدة البيانات ...إلخ.
	</li>
	<li>
		اختبارات القبول (acceptance tests): الغرض من هذه الاختبارات في أغلبية الحالات هو معرفة إن كان التطبيق يلبّي جميع متطلبات العميل.
	</li>
</ul>
<p>
	للتوضيح، لنحاول شرح هذه العملية بتمثيلها على شيءٍ ملموس مثل المباني. تتألف بعض أنواع المباني من لبنات صغيرة تُشكِّل جدرانًا، ويجب أن تتحقق اشتراطاتٌ معيّنةٌ فيها، إذ يجب أن تستطيع أن تقاوم الحِمل المُطبَّق عليها، ويجب أن تكون لها أبعاد وحجم معيّن وهلم جرًا… تلك الأمور تسمى «اختبارات الوحدات» (unit tests). أما الفكرة من اختبارات الاندماج هي معرفة متانة وقوة الارتباط بين اللّبنات، وكيف تُشكِّل مع بعضها عنصرًا من عناصر المبنى (مثل الجدران). أما الاختبارات الوظيفية فيمكن ربطها بالاختبارات التي تُجرى على جدارٍ من جدران المبنى، مثل اختبار جودة العزل الحراري، ومعرفة إن كان بالإمكان مرور أشعة الشمس من النوافذ الموجودة في هذا الجدار. وأخيرًا، تتضمن اختبارات القبول إجراء فحص لكامل المبنى: كفتح الباب، والدخول إلى الغرفة، وإغلاق الباب، وتشغيل الضوء، والصعود إلى الطابق الثاني والنظر إلى الحديقة عبر النافذة…
</p>

<h2>
	تعرّف على Codeception
</h2>

<p>
	التقسيم السابق مشروطٌ بعدِّة عوامل، ويصعب مقاومة النزعة إلى خلط عدِّة أنواع من الاختبارات. يستعمل الكثير من المبرمجين اختبارات الوحدات ويدّعون أنها كافية؛ وكنتُ منهم، إلا أنني وجدتُ أنَّ استخدام عدِّة أنظمة لمختلف أنواع الاختبارات هو أمرٌ مرهقٌ ويستهلك وقتًا طويلًا. لذا قررتُ منذ فترة أن أعثر على شيءٍ أكثر فائدةً من مكتبة <a href="https://phpunit.de/" rel="external nofollow">PHPUnit</a>؛ أردتُ أن يتطور استخدامي لاختبارات الشيفرات، إلا أنني لم أرغب بقراءة وتعلم الكثير من صفحات التوثيق وأن أبحث عن الحلول الالتفافية للمشاكل التي تواجهني. ومن ثم اكتشفت وجود Codeception. كنتُ بادئ الأمر متشككًا ومرتابًا منه، وهذه طبيعتنا عندما نرى شيئًا جديدًا (الحق يقال: هذا المشروع موجودٌ منذ خمس سنوات، لذا لا يمكننا اعتباره «جديدًا»)، لكن بعد تجربته لعدة أيام، خَلِصتُ إلى أنَّ Codeception هو نظامٌ مفيدٌ جدًا.
</p>

<p>
	قد تتساءل كيف تستطيع تثبيت Codeception؟ الأمر أبسط مما تتخيل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<span class="pln">$ composer </span><span class="kwd">require</span><span class="pln"> </span><span class="str">"codeception/codeception"</span><span class="pln">
$ php vendor</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">codecept bootstrap</span></pre>

<p>
	بعد التثبيت ستجد مجلدًا جديدًا باسم <code>test</code> في مشروعك، وستجد داخله مجلداتٍ فرعيةً باسم <code>acceptance</code> و <code>functional</code> و <code>unit</code>، يبدو أننا نستطيع البدء بكتابة اختباراتنا، إذًا ما هي الخطوة القادمة؟ لنحاول الآن إضافة اختبار قبول لمثالٍ بسيط:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate:cept acceptance HelloWorld
</code></pre>

<p>
	يمكننا الآن فتح ملف اختبار القبول ذي المسار <code>tests/acceptance/HelloWorldCept.php</code> ونضع فيه المحتوى الآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
$I = new AcceptanceTester($scenario);
$I-&gt;wantTo('perform actions and see result');
</code></pre>

<p>
	المتغير الافتراضي المسمى <code>‎$I</code> ليس مجرد حرف، وإنما هو ضمير متحدث يُشير إلى «الشخص» الذي يجري الاختبار: الذي يفتح صفحة تطبيقك أو أحد أصنافه ويفعل شيئًا ما ويريك النتيجة النهائية لأفعاله. إذ سترى ماذا فعل وما هو الخطأ الذي حدث. هذا هو سبب تسمية ذاك الكائن بالاسم <code>‎$I</code> ولماذا تدعى الدوال الموجودة فيه <code>wantTo()‎</code> و <code>see()‎</code> و <code>amOnPage()‎</code>. لنفكر كشخصٍ يريد إجراء اختبارات للتحقق من عمل إحدى الصفحات. أوّل ما يخطر ببالنا هو فتح الصفحة والبحث عن عبارة معينة فيها، مما يعني أنَّ الصفحة متوافرة للزوار. يسهل كثيرًا فعل ذلك:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
$I-&gt;amOnPage('/');
$I-&gt;see('Welcome');
</code></pre>

<p>
	ثم نستعمل الأمر الآتي لتشغيل اختبارات Codeception:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept run
</code></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22679" href="https://academy.hsoub.com/uploads/monthly_2017_04/2.jpg.628f9a9de52c291fd06ab2decbba1783.jpg" rel=""><img alt="2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="22679" data-unique="ocq4nl38w" src="https://academy.hsoub.com/uploads/monthly_2017_04/2.thumb.jpg.a3c226fee0f15602edb2507c608ba62d.jpg"></a>
</p>

<blockquote>
	<blockquote class="ipsQuote" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				حدث خطأٌ ما! هذه هي الفكرة الأساسية للاختبارات. عليك أن تنظر إلى الرسالة، وتعرف ما هو الخطأ، وتحاول إصلاحه.
			</p>
		</div>
	</blockquote>

	<p>
		لدينا اختبارٌ وحيدٌ وقد وَجَدَ خطأً:
	</p>
</blockquote>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
Acceptance Tests (1)
Perform actions and see result (HelloWorldCept)                                                             Error

----------
1) Failed to perform actions and see result in HelloWorldCept (tests/acceptance/HelloWorldCept .php)
[GuzzleHttp\Exception\ConnectException] cURL error 6: Could not resolve host: localhost (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) 
</code></pre>

<p>
	خلاصة الرسالة السابقة هي أنَّ الموقع في localhost غير متوافر. انظر إلى أوّل سطر من ملف الاختبار:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
1. $I-&gt;amOnPage("/")
</code></pre>

<p>
	لنفتح ملف <code>tests/acceptance.suite.yml</code> ونعدّل قيمة <code>url: <a href="http://localhost/%E2%80%8E" ipsnoembed="true" rel="external nofollow">http://localhost/‎</a></code> إلى رابطٍ آخر تتوافر عليه الصفحة. يتوافر على جهازي المحلي خادومٌ يحتوي على الصفحة التي نريد اختبارها <code>url: <a href="https://local.codeception-article.com/%E2%80%8E" ipsnoembed="true" rel="external nofollow">https://local.codeception-article.com/‎</a></code>. شغِّل الاختبار مرةً أخرى، ويجب أن تظهر عندك النتيجة الآتية:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
Acceptance Tests (1) ---------------------------------------------------------------------------------------
Perform actions and   result (HelloWorldCept)                                                             Ok
</code></pre>

<p>
	تهانينا! لقد نجح اختبارنا. تتوافر العديد من الدوال للاختبار بجانب الدالة <code>amOnPage()‎</code>، لكنني عرضتُها لسهولة استعمالها. يمكن تقسيم دوال الاختبار الموجودة في Codeception إلى المجموعات الآتية:
</p>

<ul>
<li>
		دوال التفاعل مع الصفحة: <code>fillField()‎</code> و <code>selectOption()‎</code> و <code>submitForm()‎</code> و <code>click()‎</code>.
	</li>
	<li>
		دوال التحقق من وجود أشياء معيّنة في الصفحة: <code>see()‎</code> و <code>dontSee()‎</code> و <code>seeElement()‎</code> و <code>seeInCurrentUrl()‎</code> و <code>seeCheckboxIsChecked()‎</code> و <code>seeInField()‎</code> و <code>seeLink()‎</code>. يمكنك إضافة لاحقة (suffix) إلى الدوال السابقة عندما تحتاج استعمالها دون أن توقف الاختبار إن لم يُعثَر على العنصر الذي تختبر وجوده.
	</li>
	<li>
		دوال التعامل مع الكعكات (cookies): <code>setCookie()‎</code> و <code>grabCookie()‎</code> و <code>seeCookie()‎</code>.
	</li>
	<li>
		التعليقات وشرح حالة الاختبار: <code>amGoingTo()‎</code> و <code>wantTo()‎</code> و <code>expect()‎</code>، استخدم هذه الدوال لكي تشرح ما الذي يفعله الاختبار، مما يذكرك بالهدف منه.
	</li>
</ul>
<p>
	فلو أردنا مثلًا أن نختبر صفحةً لاستعادة كلمة المرور عبر البريد الإلكتروني، فسنكتب ملفًا شبيهًا بالملف الآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
$I = new AcceptanceTester($scenario);
$I-&gt;wantTo('Test forgotten password functionality');
$I-&gt;amOnPage('/forgotten')
$I-&gt;see('Enter email');
$I-&gt;fillField('email', 'incorrect@email.com');
$I-&gt;click('Continue');
$I-&gt;expect('Reset password link not sent for incorrect email');
$I-&gt;see('Email is incorrect, try again');
$I-&gt;amGoingTo('Fill correct email and get link');
$I-&gt;see('Enter email');
$I-&gt;fillField('email', 'correct@email.com');
$I-&gt;click('Continue');
$I-&gt;expect('Reset password link sent for correct email');
$I-&gt;see('Please check your email for next instructions');
</code></pre>

<p>
	يبدو أنَّ الملف السابق يكفي لاختبار الصفحة، لكن ماذا لو كانت هنالك بعض الأقسام في الصفحة التي تُحمَّل عبر Ajax؟ كيف نستطيع أن نختبر تلك الصفحة؟ أجيبك أنَّ Codeception يستعمل مكتبة PhpBrowser المبنية على Symfony BrowserKit و Guzzle. أي لا تقلق، فالأمر سهلٌ وبسيط، ولن تحتاج إلا إلى استعمال curl لحل هذه المشكلة.
</p>

<p>
	يمكنك أيضًا استخدام Selenium واختبار الصفحات عبر المتصفحات الحقيقية. وصحيحٌ أنَّ ذلك أبطأ، إلا أنك ستتمكن من اختبار سكربتات JavaScript أيضًا.
</p>

<p>
	لكن أولًا عليك تثبيت إضافة Selenium، وتعديل ملف <code>acceptance.suite.yml</code> وإعادة بناء الصنف AcceptanceTester، ويمكنك بعد ذلك استخدام الدوال <code>wait()‎</code> و <code>waitForElement()‎</code>؛ وستتمكن أيضًا من الحفاظ على وقتك ومواردك باستخدام الدالتين <code>saveSessionSnapshot()‎</code> و <code>loadSessionSnapshot()‎</code> اللتين تسمحان لك بحفظ حالة الجلسة الراهنة، وإجراء اختبارات جديدة على جلسات محفوظة مسبقًا، وقد تستفيد من هذا في بعض الحالات مثل اختبار عملية الاستيثاق من المستخدم.
</p>

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

<h2>
	الاختبار الوظيفي
</h2>

<p>
	لننتقل الآن إلى إجراء اختبارات وظيفية على تطبيقنا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate:cept functional HelloWorld
</code></pre>

<p>
	ومحتوى الملف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
$I = new FunctionalTester($scenario);
$I-&gt;amOnPage('/');
$I-&gt;see('Welcome');
</code></pre>

<p>
	انتظر قليلًا، ماذا يحدث!
</p>

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

<p>
	وصحيحٌ أنَّه لا يتوافر دعمٌ لجميع إطارات العمل، لكن قائمة الإطارات المدعومة كبيرة (Symfony، و Silex، و Phalcon، و Yii، و Zend Framework، و Lumen، و Laravel) ويجب أن تكون كافيةً لأغلبية الحالات ولمعظم المطورين. رجاءً راجع توثيق Codeception للحصول على قائمة بجميع الدوال المتوافرة وكيفية تفعيلها في ملف <code>functional.suite.yml</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22676" href="https://academy.hsoub.com/uploads/monthly_2017_04/3.jpg.38200b0290a6f1b2fb8e935aa1147740.jpg" rel=""><img alt="3.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="22676" data-unique="8rphh4dsm" src="https://academy.hsoub.com/uploads/monthly_2017_04/3.thumb.jpg.21d78dac4bd263fc98ca66062913fe93.jpg"></a>
</p>

<blockquote>
	<p>
		 
	</p>
</blockquote>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			يدعم Codeception أغلبية إطارات العمل الرئيسية: مثل Symfony، و Silex، و Phalcon، و Yii، و Zend Framework، و Lumen، و Laravel
		</p>
	</div>
</blockquote>

<p>
	قبل أن ننتقل إلى اختبارات الوحدات، فدعني أنحرف قليلًا عن الموضوع وأحدثك قليلًا عن شيءٍ ربما لاحظتَه عند إنشاء الاختبارات:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate: cept acceptance HelloWorld
</code></pre>

<p>
	لاحظ الكلمة <code>cept</code>، واعلم أنَّ ما سبق ليس الطريقة الوحيدة لإنشاء الاختبارات، فهنالك أيضًا «اختبارات <code>cest</code>»، والفرق بينهما هو أنَّك تستطيع هيكلة عدِّة حالات وسيناروهات في نفس الصنف:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate:cest acceptance HelloWorld
&lt;?php
class HelloWorldCest
{
    public function _before(AcceptanceTester $I)
    {
         $I-&gt;amOnPage('/forgotten')
    }

    public function _after(AcceptanceTester $I)
    {
    }

    // tests
    public function testEmailField(AcceptanceTester $I)
    {
	$I-&gt;see('Enter email');

    }
    public function testIncorrectEmail(AcceptanceTester $I)
    {
	$I-&gt;fillField('email', 'incorrect@email.com');
	$I-&gt;click('Continue');
	$I-&gt;see('Email is incorrect, try again');
    }
    public function testCorrectEmail(AcceptanceTester $I)
    {
	$I-&gt;fillField('email', 'correct@email.com');
	$I-&gt;click('Continue');
	$I-&gt;see('Please check your email for next instructions');
    }
}
</code></pre>

<p>
	ستُشغَّل الدالتان <code>‎_before()‎</code> و <code>‎_after()‎</code> قبل وبعد كل اختبار. وستُمرَّر نسخةٌ من الصنف <code>AcceptanceTester</code> إلى كل اختبار، لذا يمكنك استخدامه بنفس الآلية المتبعة في اختبارات cest.
</p>

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

<h2>
	اختبارات الوحدات
</h2>

<p>
	أخيرًا: اختبارات الوحدات. بُني Codeception على PHPUnit، أي أنَّك تستطيع استخدام الاختبارات المكتوبة لمكتبة PHPUnit، وذلك باستخدام الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate:phpunit unit HelloWorld
</code></pre>

<p>
	أو يمكنك ببساطة أن «ترث» (inherit) الاختبارات في <code>‎\PHPUnit_Framework_TestCase</code>. لكن إن أردتَ شيئًا إضافيًا، فيمكنك تجربة اختبارات الوحدات التي يوفرها Codeception:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
$ php vendor/bin/codecept generate:test unit HelloWorld
&lt;?php

class HelloWorldTest extends \Codeception\TestCase\Test
{
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testUserSave()
    {
	$user = User::find(1);
	$user-&gt;setEmail('correct@email.com');
	$user-&gt;save();
	$user = User::find(1);
	$this-&gt;assertEquals('correct@email.com', $user-&gt;getEmail());
    }
}
</code></pre>

<p>
	لا شيء يختلف عمّا عهدتَه من قبل، فالدالتان <code>‎_before()‎</code> و <code>‎_after()‎</code> هما بديلتا <code>setUp()‎</code> و <code>tearDown()‎</code>، وستعملان قبل وبعد كل اختبار. الميزة الأساسية لهذا الاختبار هي القدرة على توسعة عملية الاختبار بتضمين وحدات (modules) التي يمكن تفعيلها في ملف <code>unit.suite.yml</code>:
</p>

<ul>
<li>
		الوصول إلى memcache وقواعد البيانات لتتبع التغيرات (قواعد MySQL و SQLite و PostgreSQL و MongoDB مدعومة).
	</li>
	<li>
		اختبار تطبيقات REST/SOAP.
	</li>
	<li>
		Queues
	</li>
</ul>
<p>
	كل وحدة (module) لها ميزاتها، لذا من الأفضل أن تنظر إلى التوثيق وتجمع المعلومات الضرورية عنها قبل الانتقال إلى كتابة اختبارات تستعملها. يمكنك أيضًا استعمال حزمة Codeception/Specify (والتي يجب إضافتها إلى ملف <code>composer.json</code>) وتكتب وصفًا كالآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php 
class HelloWorldTest extends \Codeception\TestCase\Test
{
    use \Codeception\Specify;
    private $user;
    protected function _before()
   {
	$this-&gt;user = User::find(1);
   }
    public function testUserEmailSave()
    {
	$this-&gt;specify("email can be stored", function() {
            	$this-&gt;user-&gt;setEmail('correct@email.com');
		$this-&gt;user-&gt;save();
		$user = User::find(1);
            	$this-&gt;assertEquals('correct@email.com', $user-&gt;getEmail());
        	});
    }
}
</code></pre>

<p>
	شيفرة PHP الموجودة ضمن الدوال المغلقة (closure functions) السابقة معزولةٌ، لذا لن تؤثر التعديلات داخلها على بقية شيفراتك. ستساعد عبارات الشرح بجعل الغاية من الاختبار واضحةً وتسهيل التعرف على الاختبارات التي فشلت. إضافةً إلى ما سبق، يمكنك استعمال الحزمة <code>Codeception\Verify</code> لكتابة اختبارات بشيفرة شبيهة بأسلوب BDD:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
public function testUserEmailSave()
{
	verify($map-&gt;getEmail())-&gt;equals('correct@email.com');
}
</code></pre>

<p>
	ويمكنك بالطبع استعمال stub:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5567_7">
<code>
&lt;?php
public function testUserEmailSave()
{
        $user = Stub::make('User', ['getEmail' =&gt; 'correct@email.com']);
        $this-&gt;assertEquals('correct@email.com', $user-&gt;getEmail());
}
</code></pre>

<h2>
	الخلاصة: يساعد Codeception على توفير الوقت والجهد
</h2>

<p>
	ما الذي تتوقع الحصول عليه من Codeception؟ من هم الأشخاص المناسبون لاستعماله؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="22677" href="https://academy.hsoub.com/uploads/monthly_2017_04/4.jpg.dd20f89b8e4608cf3ac2fee085c3f1b0.jpg" rel=""><img alt="4.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="22677" data-unique="7yhu58kgt" src="https://academy.hsoub.com/uploads/monthly_2017_04/4.thumb.jpg.b22bd4c597f3dfc140b86faecbff8870.jpg"></a>
</p>

<blockquote>
	<p>
		 
	</p>
</blockquote>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			يمكن للمطورين من جميع المستويات استخدام Codeception من المبتدئين حتى المحترفين، والموجودين بفرق برمجية بمختلف الأعداد.
		</p>
	</div>
</blockquote>

<p>
	برأيي الشخصي، Codeception مناسب لجميع أنواع الفرق: الكبيرة والصغيرة، والمبتدئين والمحترفين، والذين يستعملون أطر عمل والذين يكتبون برمجياتهم من الصفر، أي أنَّ Codeception صالحٌ لكل زمان ومكان (تقريبًا).
</p>

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

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

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.toptal.com/php/php-testing-with-codeception" rel="external nofollow">Jumpstart Your PHP Testing with Codeception</a> لصاحبه Vasily Koval
</p>
]]></description><guid isPermaLink="false">470</guid><pubDate>Sat, 22 Apr 2017 21:00:32 +0000</pubDate></item><item><title>&#x645;&#x645;&#x627;&#x631;&#x633;&#x627;&#x62A; &#x648;&#x645;&#x639;&#x627;&#x64A;&#x64A;&#x631; &#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x644;&#x643;&#x62A;&#x627;&#x628;&#x629; &#x634;&#x64A;&#x641;&#x631;&#x629; PHP &#x645;&#x639;&#x627;&#x635;&#x631;&#x629; &#x642;&#x62F; &#x644;&#x627; &#x62A;&#x639;&#x644;&#x645;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/php/%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%88%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1-%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-php-%D9%85%D8%B9%D8%A7%D8%B5%D8%B1%D8%A9-%D9%82%D8%AF-%D9%84%D8%A7-%D8%AA%D8%B9%D9%84%D9%85%D9%87%D8%A7-r343/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/php-fig-psr-new-standards.png.e9eabaf311885b0610920bee0f47301f.png" /></p>

<div id="wmd-preview-section-24">
	<p id="php-في-العصر-الحديث">
		هل أنت من محاربي PHP القدامى وتريد معرفة ما الذي استجد منذ عدِّة سنوات؟ أم أنت منتقلٌ حديثًا إلى PHP من لغةٍ أخرى وتود معرفة الأمور المثيرة في PHP، ها قد وصلت إلى المكان الصحيح. لننفض الغبار عن معلوماتك، وتهيّأ أن تتعلم ميزاتٍ أضيفت حديثًا إلى PHP.
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="17722" data-unique="rl2q3qd9p" src="https://academy.hsoub.com/uploads/monthly_2016_06/php-fig-psr-new-standards.png.13c926e6c45faf35793d91c58a803c2d.png" alt="php-fig-psr-new-standards.png"></p>
</div>

<div id="wmd-preview-section-25">
	<h2 id="معايير-php-fig">
		معايير PHP-FIG
	</h2>

	<p>
		أعداد مشاريع ومكتبات وأطر عمل PHP الموجودة حاليًا مهولة، إذ هنالك العديد من أطر عمل PHP المتوفرة للاستعمال، لكن من الصعب استعمالها معًا، فماذا لو استطاع أحد أطر العمل الاستفادة من مكتبة ما خارجية، بدلًا من كتابتها يدويًا، أو الاستفادة من مكتبة من إطار Laravel مثلًا؟ لهذا الغرض أُنشِئت <span style="font-family:courier new,courier,monospace;">PHP-FIG</span> (اختصار للعبارة Framework Interoperability Group) في مؤتمر php|tek في 2009ـ التي وضعت عدِّة معايير يُرمَز لها بالاختصار PSR (أي PHP Standards Recommendations) سنورد ذكرها هنا باختصار.
	</p>
</div>

<div id="wmd-preview-section-26">
	<h3 id="psr-1-معيار-كتابة-الشيفرات">
		PSR-1: معيار كتابة الشيفرات
	</h3>

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

	<ul>
<li>
			يجب استعمال وسوم ‎<span style="font-family:courier new,courier,monospace;">&lt;?php ?&gt;</span>‎ الاعتيادية، ووسم <span style="font-family:courier new,courier,monospace;">echo</span> المختصر ‎<span style="font-family:courier new,courier,monospace;">&lt;?= ?&gt;‎</span> فقط. 
		</li>
		<li>
			يجب أن يكون ترميز ملفات الشيفرات UTF-8 دون BOM. 
		</li>
		<li>
			يجب على الملف أن يُنشِئ بنى برمجية جديدة مثل الأصناف (classes) والدوال …إلخ. دون أن يُحدِث أي "تأثير جانبي"، أو يجب أن ينفِّذ الخطوات المنطقية التي تؤدي إلى "تأثيرات جانبية" ولكن لا يُسمَح أن يقوم بكلا الأمرين. 
		</li>
	</ul>
<p style="margin-right: 40px;">
		نستطيع تعريف "التأثيرات الجانبية" بالأمور غير المتعلقة بتعريف الأصناف أو الدوال، وهي تشمل: توليد المخرجات، أو تضمين الملفات (عبر <span style="font-family:courier new,courier,monospace;">include</span> أو <span style="font-family:courier new,courier,monospace;">require</span>)، أو الاتصال إلى الخدمات الخارجية، أو تعديل ضبط <span style="font-family:courier new,courier,monospace;">ini</span>، أو تعديل المتغيرات العامة أو الكتابة إلى ملفات، وهلم جرًا. 
	</p>

	<ul>
<li>
			يجب أن تكون مجالات الأسماء (namespaces) وأسماء الأصناف متوافقة مع معيار PSR-4 (سنأتي على ذكره بعد قليل)، وهذا يعني أن كل ملف سيحتوي على صنف وحيد باسمه، وفي مجال أسماء من مرحلة (level) واحدة على الأقل. 
		</li>
		<li>
			يجب أن تكون أسماء الأصناف على الشكل <span style="font-family:courier new,courier,monospace;">StudlyCaps</span> (أي الحرف الأول من كل كلمة كبير). 
		</li>
		<li>
			يجب أن تكون الثوابت المُعرَّفة في الأصناف بأحرف كبيرة وتفصل الشرطة السفلية بين الكلمات. 
		</li>
		<li>
			يجب أن تكون أسماء الدوال على الشكل <span style="font-family:courier new,courier,monospace;">camelCase</span> (أي الحرف الأول من كل كلمة كبير، عدا أول كلمة).
		</li>
	</ul>
</div>

<div id="wmd-preview-section-27">
	<h3 id="psr-2-معيار-تنسيق-الشيفرات">
		PSR-2: معيار تنسيق الشيفرات
	</h3>

	<p>
		يساعد هذا المعيار في تسهيل التعامل مع الملفات التي كتبها مبرمجون آخرون عبر تحديد قواعد مشتركة لكيفية تنسيق شيفرات PHP. 
	</p>

	<ul>
<li>
			يعتمد هذا المعيار على المعيار PSR-1، أي على المبرمج تطبيق قواعد PSR-1 أولًا. 
		</li>
		<li>
			يجب أن تُستعمل أربعة فراغات (مسافات) لمحاذاة الشيفرات، وليست مسافات الجدولة (tabs)، ولا يجوز أن تدمج بين الطريقتين، وذلك لتفادي حدوث مشاكل في ملفات الفروقات (diff) وغيرها. 
		</li>
		<li>
			ليس هنالك حدٌ أقصى لعدد المحارف في السطر، لكن يستحسن أن يكون بطول 80 محرف أو أقل، ويمكن إضافة أسطر فارغة لتحسين مقروئية النص. ولا يجوز وضع أكثر من تعبير برمجي في السطر الواحد. 
		</li>
		<li>
			يجب أن تكون الكلمات المفتاحية (keywords) في PHP بأحرفٍ صغيرة، وكذلك الأمر للثوابت <span style="font-family:courier new,courier,monospace;">true</span> و <span style="font-family:courier new,courier,monospace;">false</span> و <span style="font-family:courier new,courier,monospace;">null</span>. 
		</li>
		<li>
			يجب وجود سطر فارغ وحيد بعد تعريف مجال الأسماء (namespace)، وكذلك الأمر بعد <span style="font-family:courier new,courier,monospace;">use</span>. 
		</li>
		<li>
			يجب أن يكون قوس البداية لصنف أو دالة في سطرٍ منفصل، وكذلك قوس النهاية؛ ولا يجوز وضع فراغ بين اسم الدالة وقوس المعاملات، ويجب وضع فراغ وحيد بعد الفاصلة "," في حال وجود أكثر من معامل. 
		</li>
		<li>
			يجب تعيين مُحدِّد وصول مثل <span style="font-family:courier new,courier,monospace;">public</span> أو <span style="font-family:courier new,courier,monospace;">private</span> أو <span style="font-family:courier new,courier,monospace;">protected</span>، وعدم استخدام <span style="font-family:courier new,courier,monospace;">var</span>. 
		</li>
		<li>
			يجب وضع فراغ وحيد بعد الكلمة المحجوزة لبنى التحكم (مثل <span style="font-family:courier new,courier,monospace;">if</span> و <span style="font-family:courier new,courier,monospace;">for</span> وغيرهما). 
		</li>
	</ul>
<h3>
		PSR-3: معيار السجلات 
	</h3>

	<p>
		يُعرِّف هذا المعيار واجهةً (interface) للتسجيل (logging). 
	</p>

	<h3>
		PSR-4: معيار التحميل التلقائي 
	</h3>

	<p>
		شرحنا التحميل التلقائي في درس <a href="https://academy.hsoub.com/programming/php/%D8%AA%D9%88%D8%B2%D9%8A%D8%B9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-php-%D8%B9%D9%84%D9%89-%D8%B9%D8%AF%D8%A9-%D9%85%D9%84%D9%81%D8%A7%D8%AA-r332/" rel="">توزيع شيفرات PHP على عدة ملفات</a>، يمكنك العودة إليه لمزيدٍ من المعلومات.
	</p>
</div>

<div id="wmd-preview-section-28">
	<h2 id="الحزم-البرمجية">
		الحزم البرمجية
	</h2>

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

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

	<p>
		هل عرفت فائدة أدوات إدارة الحزم؟ ما رأيك أن تكمل قراءة مقال <a href="https://academy.hsoub.com/programming/php/%D9%85%D8%A7-%D9%87%D9%88-composer-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D9%83%D9%84-%D9%85%D8%B7%D9%88%D8%B1-php-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r10/" rel="">ما هو Composer ولماذا يجب على كل مطور PHP استخدامه</a> وتتعرف على composer وتتعلم طريقة استخدامه.
	</p>
</div>

<div id="wmd-preview-section-29">
	<h2 id="كلمات-المرور">
		كلمات المرور
	</h2>

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

	<h3>
		لا يجدر بك معرفة كلمات مرور مستخدميك 
	</h3>

	<p>
		هذا يعني أنَّك ستخزِّن كلمة المرور على شكل نص بسيط في مكانٍ ما في قاعدة بياناتك، افترض مثلًا أنَّ موقعك قد تعرض للاختراق، واستطاع المُخترَق الوصول إلى قاعدة بيانات موقعك واستطاع رؤية جميع كلمات مرور مستخدميك! أنت تعرض سلامة حسابات مستخدميك الأخرى (وسمعة موقعك) للخطر. 
	</p>

	<h3>
		لا ترسل كلمات المرور الجديدة عبر البريد الإلكتروني 
	</h3>

	<p>
		هذا خطأٌ كبيرٌ لأنه يعني أنَّ الموقع يعلم كلمة مرور المستخدم، ولقد أرسلها عبر خدمة البريد (قد لا يكون الاتصال مشفرًا!)؛ وإنما عليك إرسال رابط سيسمح للمستخدم بكتابة كلمة مرور جديدة. 
	</p>

	<h3>
		لا تشفر (encrypt) كلمات المرور 
	</h3>

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

	<h3>
		لا تستخدم MD5 
	</h3>

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

	<p>
		لكن يَسهُل كثيرًا توليد جداول بالقيم الأصلية والقيم المحوَّلة تسمى "جداول rainbow"، وسيتم البحث عن القيم المحولة إلى أن يُعثَر على تطابق (ينطبق المثل على SHA-1). 
	</p>

	<p>
		أتت PHP 5.5 بدوال بسيطة لتحويل كلمات المرور بأمان وهي<span style="font-family:courier new,courier,monospace;"> password_hash()‎</span> و <span style="font-family:courier new,courier,monospace;">password_verify()‎</span>. تُستعمل الدالة الأولى لتحويل كلمة المرور إلى عبارة غير قابلة للعكس التي تستطيع تخزينها بأمان في قاعدة بياناتك. 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_9">
<span class="pln">$hash </span><span class="pun">=</span><span class="pln"> password_hash</span><span class="pun">(</span><span class="pln">$password</span><span class="pun">,</span><span class="pln"> PASSWORD_DEFAULT</span><span class="pun">);</span></pre>

	<p>
		هذا كل ما في الأمر: أول وسيط هو كلمة المرور التي تريد تحويلها، والوسيط الثاني هو الخوارزمية التي تريد استخدامها للتحويل. 
	</p>

	<p>
		الخوارزمية الافتراضية هي bcrypt، ويجب أن تُخزِّن القيم الناتجة في حقل أكبر من 60 محرف في قاعدة البيانات (ربما تستعمل 255). يمكنك أيضًا تمرير <span style="font-family:courier new,courier,monospace;">PASSWORD_BCRYPT</span> كوسيط في حال أردت أن يكون الناتج بطول 60 محرف دومًا.
	</p>

	<p>
		أما دالة<span style="font-family:courier new,courier,monospace;"> password_verify()‎</span> فهي تقارن كلمة المرور التي أدخلها المستخدم (الوسيط الأول) بكلمة المرور المحوَّلة والمخزنة في قاعدة البيانات (الوسيط الثاني). 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_12">
<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">password_verify</span><span class="pun">(</span><span class="pln">$password</span><span class="pun">,</span><span class="pln"> $hash</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>

	<h2>
		الأخطاء في PHP
	</h2>
</div>

<div id="wmd-preview-section-30">
	<p>
		أكثر ما يواجهه المبرمج في حياته هو الأخطاء! نحاول -نحن معشر المبرمجين- أن نتلافى حدوث الأخطاء، لكن ذلك ليس ممكنًا في الحياة العملية.
	</p>

	<p>
		علينا أن نعي أنَّ هنالك تصنيفين: الأول هو الأخطاء (errors) التي رأيتها سابقًا خلال هذه السلسلة، التي تُظهِرها الدوال المُضمَّنة في اللغة؛ والثاني هو الاستثناءات (exceptions) التي تظهر في البرامج التي تعتمد على البرمجة غرضية التوجه. 
	</p>

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

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8950_18">
<span class="pln">$ php -a
php &gt; echo $foo;
Notice: Undefined variable: foo in php shell code on line 1</span></pre>

	<p>
		أما في اللغات الأخرى التي تعتمد اعتمادًا كاملًا على الاستثناء -مثل بايثون- فستختلف النتيجة: 
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8950_14">
<span class="pln">$ python

print foo 
Traceback (most recent call last): 
	File “”, line 1, in 
NameError: name ‘foo’ is not defined</span></pre>

	<h3>
		التبليغ عن الأخطاء في PHP
	</h3>

	<p>
		هنالك مستويات مختلفة من التبليغ عن الأخطاء في PHP، أشهر ثلاثة مستويات هي الأخطاء (errors) والتنبيهات (notices) والتحذيرات (warning). 
	</p>
</div>

<div id="wmd-preview-section-31">
	<p>
		الأخطاء (errors) هي المشاكل التي تظهر في وقت التشغيل (run-time) التي يكون سببها مشاكل في الشيفرة وستسبب توقف التنفيذ. أما التنبيهات فهي رسائل إرشادية التي قد تسبب مشاكل أثناء تنفيذ السكربت، لكن التنفيذ لن يتوقف. أما التحذيرات فهي شبيهة بالأخطاء لكنها لن توقف عمل السكربت. 
	</p>

	<p>
		تستطيع تغيير السلوك الافتراضي للتبليغ عن الأخطاء عبر الدالة<span style="font-family:courier new,courier,monospace;"> error_reporting()‎</span> التي تستطيع تستطيع ضبط مستوى التبليغ عن الأخطاء أثناء التنفيذ بتمرير ثابت من الثوابت المُعرَّفة مسبقًا لمستويات الأخطاء (<span style="font-family:courier new,courier,monospace;">E_ERROR</span>للأخطاء، <span style="font-family:courier new,courier,monospace;">E_NOTICE </span>للتنبيهات، <span style="font-family:courier new,courier,monospace;">E_WARNING</span> للتحذيرات). فلو كنت تريد مشاهدة الأخطاء والتحذيرات لكنك لا تريد التنبيهات، فيمكنك ضبط ذلك كالآتي: 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_20">
<span class="pun">&lt;?</span><span class="pln">php
error_reporting</span><span class="pun">(</span><span class="pln">E_ERROR </span><span class="pun">|</span><span class="pln"> E_WARNING</span><span class="pun">);</span></pre>

	<p>
		تستطيع أن تخبر PHP أن تتجاهل الأخطاء في عبارة برمجية معيّنة باستخدام معامل التحكم بالأخطاء @. يمكنك وضع هذا المعامل قبل تعبير برمجي، وسيتم تجاهل أيّة أخطاء يُسبِّبها هذا التعبير.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_22">
<span class="pun">&lt;?</span><span class="pln">php
echo </span><span class="lit">@$foo</span><span class="pun">[</span><span class="str">'bar'</span><span class="pun">];</span></pre>

	<p>
		المثال السابق سيطبع قيمة <span style="font-family:courier new,courier,monospace;">‎$foo['bar']‎</span> إن كانت موجودةً، لكنه لن يطبع شيئًا إن لم يكن المتغير ‎<span style="font-family:courier new,courier,monospace;">$foo</span> أو المفتاح <span style="font-family:courier new,courier,monospace;">'bar' </span>موجودًا؛ فدون وجود معامل التحكم بالأخطاء، كان سيظهر أحد التنبيهين:<strong> PHP Notice: Undefined variable: foo </strong>أو<strong> PHP Notice: Undefined index: bar</strong>.
	</p>

	<p>
		بالطبع يمكنك استخدام العبارة الآتية لتنجب وضع معامل تجاهل الأخطاء:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_24">
<span class="pun">&lt;?</span><span class="pln">php
echo isset</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="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="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span></pre>

	<h3>
		الاستثناءات
	</h3>
</div>

<div id="wmd-preview-section-32">
	<p>
		تمثِّل الاستثناءات جزءًا مهمًا من العديد من لغات البرمجة مثل ruby أو java، فأي شيء يحدث بشكل خاطئ في تلك اللغات -مثل فشل طلبية HTTP أو فشل الاتصال بقاعدة البيانات- فسيُرمَى (throw) استثناء يعني أنَّ هنالك خطأٌ ما. 
	</p>

	<p>
		لكن PHP نفسها متساهلة جدًا بهذا الأمر، فلو فشل استدعاء الدالة <span style="font-family:courier new,courier,monospace;">file_get_contents()‎</span> فستحصل على <span style="font-family:courier new,courier,monospace;">FALSE</span> وربما رسالة تحذيرية (أي من المستوى <span style="font-family:courier new,courier,monospace;">E_WARNING</span>)؛ أما أطر العمل الحديثة، فتستعمل الاستثناءات. 
	</p>

	<p>
		تبنى آلية معالجة الأخطاء في PHP على وضع التعبيرات البرمجية في كتلة <span style="font-family:courier new,courier,monospace;">try</span> التي تريد مراقبتها من أجل الأخطاء، فلو حدث استثناءٌ ما داخل كتلة <span style="font-family:courier new,courier,monospace;">try</span> (تحدث الاستثناءات عند "رميها" [throw]) فسيُلتَقَط باستخدام <span style="font-family:courier new,courier,monospace;">catch</span> التي تلي كتلة <span style="font-family:courier new,courier,monospace;">try</span> التي رمت الاستثناء. 
	</p>

	<p>
		أنا متأكدٌ أنَّك تتساءل عن معنى ما سبق. ما رأيك أن نأخذ مثالًا توضيحيًا يساعد على الفهم: 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_16">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  $num </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">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$num </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">20</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">"Exception here!"</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"> </span><span class="str">"bar"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> $exception</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">"Exception!\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		دخل مُفسِّر PHP إلى كتلة <span style="font-family:courier new,courier,monospace;">try</span> وبدأ تنفيذ الشيفرة، وعند وصوله إلى السطر <span style="font-family:courier new,courier,monospace;">throw new Exception</span> توقف عن تنفيذ كتلة <span style="font-family:courier new,courier,monospace;">try</span> وانتقل إلى كتلة <span style="font-family:courier new,courier,monospace;">catch</span>؛ لاحظ أنَّه عندما "يغادر" مُفسِّر PHP كتلة <span style="font-family:courier new,courier,monospace;">try</span> فلن يعود إليها مطلقًا، أي أنَّ السطر ‎<span style="font-family:courier new,courier,monospace;">$foo = "bar"</span>‎ لن يُنفَّذ.
	</p>

	<p>
		قد ترى أنَّ كتلة <span style="font-family:courier new,courier,monospace;">catch</span> معقدة في بادئ الأمر، لكنني سأريك مثلًا يعتمد على أنَّ مفسر PHP سينتقل إلى كتلة <span style="font-family:courier new,courier,monospace;">catch</span> المناسبة، لكن علي أولًا شرح التعبير <span style="font-family:courier new,courier,monospace;">(catch(Exception $exception</span>.
	</p>

	<p>
		نُحدِّد في كتلة <span style="font-family:courier new,courier,monospace;">catch</span> أنَّ الصنف هو <span style="font-family:courier new,courier,monospace;">Exception</span> لأنَّ على PHP أن تُحدِّد أي كتلة من كتل <span style="font-family:courier new,courier,monospace;">catch</span> يجب تنفيذها بالبحث عن الصنف الموافق للصنف الذي رُميَ. أو بالأحرى، تُجري PHP عملية <span style="font-family:courier new,courier,monospace;">instanceof</span> (هل تذكرها من <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="">درس البرمجة كائنية التوجه</a>؟) وهذا يعني أنَّ على الاستثناء الذي رُميَ أن يكون من الصنف المُحدَّد أو من صنف مشتق منه (أعلم تمامًا العلم أنَّ ما سبق يبدو معقدًا، لكنه أبسط بكثير مما تظن).
	</p>

	<p>
		لاحظ أنَّ جميع الاستثناءات مشتقة من الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> الذي يوفِّر وظائف أساسية، وأغلبية الدوال الموجودة في الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> هي <span style="font-family:courier new,courier,monospace;">final</span> أي لا يمكن إعادة كتابتها في الأصناف المشتقة. يمكنك مثلًا استدعاء الدالة <span style="font-family:courier new,courier,monospace;">‎$exception-&gt;getMessage()</span>‎ لمعرفة رسالة الخطأ ("Exception here!‎" في المثال السابق)، أو يمكنك استدعاء <span style="font-family:courier new,courier,monospace;">getFile()</span>‎ لمعرفة الملف الذي رمى الاستثناء.
	</p>

	<p>
		هذا المثال يوضِّح الشرح السابق:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_27">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptFoo</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="pun">}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptBar</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">ExceptFoo</span><span class="pln"> </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">
	$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="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExceptFoo</span><span class="pun">(</span><span class="str">"Baaaaad PHP!"</span><span class="pun">);</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">
</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">ExceptFoo</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">"Caught ExceptFoo\n"</span><span class="pun">;</span><span class="pln">
  echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">ExceptBar</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">"Caught ExceptBar\n"</span><span class="pun">;</span><span class="pln">
  echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">Exception</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">"Caught Exception\n"</span><span class="pun">;</span><span class="pln">
  echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		ناتج السكربت السابق:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8950_29">
<span class="pln">Caught ExceptFoo
Message: Baaaaad PHP!</span></pre>

	<p>
		هذا منطقي لأننا رمينا استثناء من الصنف <span style="font-family:courier new,courier,monospace;">ExceptionFoo</span>، ولهذا ستنتقل PHP إلى كتلة <span style="font-family:courier new,courier,monospace;">catch</span>. جرب الآن هذه الشيفرة:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_31">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptFoo</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="pun">}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptBar</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">ExceptFoo</span><span class="pln"> </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">
	$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="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExceptBar</span><span class="pun">(</span><span class="str">"Baaaaad PHP!"</span><span class="pun">);</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">
</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">ExceptFoo</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught ExceptFoo\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">ExceptBar</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught ExceptBar\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">Exception</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught Exception\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		لماذا ناتج الشيفرة السابقة مماثلة لما قبلها؟ لأنَّ PHP تنتقل إلى أول كتلة <span style="font-family:courier new,courier,monospace;">catch</span> مُطابِقة لصنف الاستثناء أو أيّة أصناف أب له؛ ولما كان <span style="font-family:courier new,courier,monospace;">ExceptionBar</span> مشتقٌ من <span style="font-family:courier new,courier,monospace;">ExceptionFoo</span>، وكانت كتلة catch التابع للصنف <span style="font-family:courier new,courier,monospace;">ExceptionFoo</span> تأتي قبل <span style="font-family:courier new,courier,monospace;">ExceptionBar</span>، فستنفَّذ كتلة <span style="font-family:courier new,courier,monospace;">ExceptionFoo</span>.
	</p>

	<p>
		يمكنك إعادة كتابة الشيفرة كالآتي لتفادي هذه الإشكالية:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_33">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptFoo</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="pun">}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExceptBar</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">ExceptFoo</span><span class="pln"> </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">
	$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="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExceptBar</span><span class="pun">(</span><span class="str">"Baaaaad PHP!"</span><span class="pun">);</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">
</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">ExceptBar</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught ExceptBar\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">ExceptFoo</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught ExceptFoo\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</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">Exception</span><span class="pln"> $exception</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"Caught Exception\n"</span><span class="pun">;</span><span class="pln">
	echo </span><span class="str">"Message: {$exception-&gt;getMessage()}\n"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		بقي أمرٌ بسيطٌ تجدر الإشارة إليه ألا وهو كتلة <span style="font-family:courier new,courier,monospace;">finally</span> الموجودة في إصدار PHP 5.5 وما بعده، التي تضمن لك تنفيذ الشيفرات البرمجية الموجودة فيها دائمًا حتى لو حدث استثناءٌ ما.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_37">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	complicatedCode</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">NastyException</span><span class="pln"> $e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	handleError</span><span class="pun">(</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">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	importantCleanup</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		المولدات Generators
	</h2>
</div>

<div id="wmd-preview-section-33">
	<p>
		هذه ميزةٌ جديدةٌ في PHP منذ الإصدار 5.5، وهي تسمح لك باستعمال حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> للمرور على مجموعة من البيانات دون الحاجة إلى إنشاء مصفوفة في الذاكرة، الأمر الذي قد يؤدي إلى تجاوز حد استهلاك الذاكرة المسموح، أو إلى وقت معالجة كبير… إذ تستطيع كتابة دالة مولدة (generator function) التي تشبه الدوال العادية، إلا أنها بدلًا من إعادة قيمة ما، فهي "تُنتِج" (yield) قيمًا لكي يتم المرور عليها باستعمال الحلقات. 
	</p>

	<p>
		مثالٌ بسيطٌ عنها هو دالة range(0, 1000000)‎ التي تولد مصفوفة فيها قيم عددية من الصفر إلى المليون، وستستهلك 100 ميغابايت من الذاكرة العشوائية. ونستطيع بدلًا من ذلك أن نكتب مولدة اسمها<span style="font-family:courier new,courier,monospace;"> xrange()‎</span> -على سبيل المثال- وستستهلك أقل من 1 كيلوبايت! 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8950_40">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">function</span><span class="pln"> xrange</span><span class="pun">(</span><span class="pln">$start</span><span class="pun">,</span><span class="pln"> $limit</span><span class="pun">)</span><span class="pln">
</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"> $start</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;=</span><span class="pln"> $limit</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">// استعملنا yield بدلًا من return</span><span class="pln">
		</span><span class="kwd">yield</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">

</span><span class="com">// استعملنا المصفوفة المُعادة من استدعاء الدالة range في foreach كالمعتاد</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </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">9</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> $number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"$number "</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

echo </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// وكذلك استعملنا نواتج المولدة xrange</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">xrange</span><span class="pun">(</span><span class="lit">1</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">as</span><span class="pln"> $number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	echo </span><span class="str">"$number "</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

	<p>
		الفرق بين الطريقتين في استهلاك الذاكرة فقط، ولا تأثير لها على سرعة التنفيذ.
	</p>
</div>

<div id="wmd-preview-section-34">
	<h2 id="المصادر">
		المصادر
	</h2>

	<ul>
<li>
			راجع صفحة <a href="http://www.php-fig.org/psr/psr-1/" rel="external nofollow">Basic Coding Standard</a> و <a href="http://www.php-fig.org/psr/psr-2/" rel="external nofollow">Coding Style Guide</a> و <a href="http://www.php-fig.org/psr/psr-3/" rel="external nofollow">Logger Interface</a> و <a href="http://www.php-fig.org/psr/psr-4/" rel="external nofollow">Autoloading Standard</a>، وتابع الجديد عبر موقع <a href="http://www.php-fig.org/psr/" rel="external nofollow">PHP-FIG</a>.
		</li>
		<li>
			راجع مقالة <a href="https://academy.hsoub.com/programming/php/%D9%85%D8%A7-%D9%87%D9%88-composer-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D9%83%D9%84-%D9%85%D8%B7%D9%88%D8%B1-php-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r10/" rel="">ما هو Composer ولماذا يجب على كل مطور PHP استخدامه</a> لصاحبها يوغرطة بن علي.
		</li>
		<li>
			لمزيد من المعلومات حول تحويل كلمات المرور، راجع صفحة <a href="http://php.net/manual/en/function.password-hash.php" rel="external nofollow">password_hash</a> و <a href="http://php.net/manual/en/function.password-verify.php" rel="external nofollow">password_verify</a> في دليل PHP، وهذا <a href="http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely" rel="external nofollow">السؤال</a> على stack overflow.
		</li>
		<li>
			انظر إلى قسم <a href="http://www.phptherightway.com/#errors_and_exceptions" rel="external nofollow">الاستثناءات</a> في PHP: The Right Way، ومقالة <a href="http://www.hackingwithphp.com/19/8/7/exception-handling" rel="external nofollow">Exception handling</a>، وصفحة <a href="https://stackedit.io/php.net/manual/en/language.exceptions.php" rel="external nofollow">Exceptions</a> في دليل PHP.
		</li>
		<li>
			تعلم المزيد عن المولدات عبر دليل PHP بصفحتيه <a href="http://php.net/manual/en/language.generators.overview.php" rel="external nofollow">Generators overview</a> و <a href="http://php.net/manual/en/language.generators.syntax.php" rel="external nofollow">Generator syntax</a>.
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">343</guid><pubDate>Mon, 13 Jun 2016 07:13:37 +0000</pubDate></item><item><title>&#x62A;&#x648;&#x632;&#x64A;&#x639; &#x634;&#x64A;&#x641;&#x631;&#x627;&#x62A; PHP &#x639;&#x644;&#x649; &#x639;&#x62F;&#x629; &#x645;&#x644;&#x641;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/php/%D8%AA%D9%88%D8%B2%D9%8A%D8%B9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-php-%D8%B9%D9%84%D9%89-%D8%B9%D8%AF%D8%A9-%D9%85%D9%84%D9%81%D8%A7%D8%AA-r332/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/distribute-php-files.png.a073799573fb879eacdbbfede676a2df.png" /></p>

<div id="wmd-preview-section-75">
	<p id="توزيع-شيفرات-php-على-عدة-ملفات">
		سنشرح في هذا الدرس كيف نوزِّع شيفرات على عدِّة ملفات وكيف نُضمِّن شيفرات من ملفات أخرى. توفِّر PHP أربع دوال لتضمين الشيفرات من الملفات الأخرى:
	</p>

	<ul>
<li>
			include
		</li>
		<li>
			include_once
		</li>
		<li>
			require
		</li>
		<li>
			require_once
		</li>
	</ul>
<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="16434" data-unique="1faff3cbs" src="https://academy.hsoub.com/uploads/monthly_2016_05/distribute-php-files.png.23fc2b58341b48fc5ac324bfd3105fd8.png" alt="distribute-php-files.png"></p>
</div>

<div id="wmd-preview-section-76">
	<h2 id="الدالة-include">
		الدالة include
	</h2>

	<p>
		تُستعمَل include لتضمين الملفات الخارجية إلى الملف الحالي، حيث تنسخ النص من الملف الخارجي وتلصقه مكان وجودها، وإن حدثت أيّة أخطاء فستتجاوز هذه الدالة عملية تضمين الملف وسيُستكمَل التنفيذ مع إظهار تحذير (warning) دون إظهار خطأ (error). 
	</p>

	<p>
		على سبيل المثال، لدي ملفان هما <span style="font-family:courier new,courier,monospace;">tutorials.php </span>و<span style="font-family:courier new,courier,monospace;"> tutorials2.php </span>في نفس المجلد. 
	</p>

	<p>
		الملف <span style="font-family:courier new,courier,monospace;">tutorials2.php</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_7">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">/**
* this is another class in file tutorial2.php
*/</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bird</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">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"class Bird included"</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></pre>

	<p>
		الملف<span style="font-family:courier new,courier,monospace;"> tutorials.php</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_9">
<span class="pun">&lt;?</span><span class="pln">php
include </span><span class="str">'tutorial2.php'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// كما يُمكن أن نكتبه على النّحو التّالي include('tutorial2.php');</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">Bird</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		الناتج:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9033_11">
<span class="pln">class Bird included</span></pre>

	<h2>
		الدالة include_once
	</h2>
</div>

<div id="wmd-preview-section-77">
	<p>
		هذه الدالة شبيهة بالدالة <span style="font-family:courier new,courier,monospace;">include</span> لكن الاختلاف أنها تُضمِّن الملف مرةً واحدةً فقط؛ مثلًا، إن كان لديك ملفُ آخرٌ يُضمِّن كلا الملفين السابقين باستخدام <span style="font-family:courier new,courier,monospace;">include</span> فسيُضمَّن الصنف Bird مرتين وسينتج عن ذلك خطأ لأنه لا يُسمَح بإعادة تعريف الصنف مرةً أخرى. وهذا الأمر يحدث كثيرًا في المشاريع أو التطبيقات الكبيرة، لذا يكون البديل هو استخدام <span style="font-family:courier new,courier,monospace;">include_once</span> التي ستُضمِّن <span style="font-family:courier new,courier,monospace;">tutorial2.php </span>مرةً واحدةً فقط.
	</p>
</div>

<div id="wmd-preview-section-78">
	<h2 id="الدالة-require">
		الدالة require
	</h2>

	<p>
		تعمل <span style="font-family:courier new,courier,monospace;">require</span> كعمل <span style="font-family:courier new,courier,monospace;">include</span> إلا أنها تعطي خطأً (بدلًا من تحذير) عندما يحدث خطأ في تضمين الملف، ويتوقّف البرنامج عن التّنفيذ.
	</p>
</div>

<div id="wmd-preview-section-79">
	<h2 id="الدالة-requireonce">
		الدالة require_once
	</h2>

	<p>
		وهي تعمل أيضًا بشكلٍ شبيهٍ بالدالة <span style="font-family:courier new,courier,monospace;">include_once </span>إلا أنها تعطي خطأً بدلًا من تحذير كما في <span style="font-family:courier new,courier,monospace;">require</span>، ويتوقّف البرنامج أيضًا.
	</p>
</div>

<div id="wmd-preview-section-80">
	<h2 id="مسار-التضمين">
		مسار التضمين
	</h2>

	<p>
		كان لدينا في المثال السابق كلا الملفين في نفس المجلد ثم ضمَّنا الملف<span style="font-family:courier new,courier,monospace;"> tutorial2.php</span> مباشرةً، وهذا ما يدعى "بالمسار النسبي"؛ لكن كيف يمكننا أن نضمِّن ملفًا من مجلدٍ آخر؟ يمكننا تمثيل المسار إلى الملف بطريقتين: 
	</p>

	<ol>
<li>
			 المسارات النسبية 
		</li>
		<li>
			المسارات المطلقة
		</li>
	</ol>
</div>

<div id="wmd-preview-section-81">
	<h3 id="المسارات-المطلقة">
		المسارات المطلقة
	</h3>

	<p>
		وهي مسار الملف بدءًا من مجلد الجذر؛ الذي يكون في لينكس (وغيره من الأنظمة الشبيهة بِيونكس) كالآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_13">
<span class="pln">include_once</span><span class="pun">(</span><span class="pln"> </span><span class="str">'/var/www/html/findalltogether/tutorial2.php'</span><span class="pln"> </span><span class="pun">);</span></pre>

	<p>
		أما في ويندوز، فسيبدأ المسار المطلق بحرف القرص (مثل<span style="font-family:courier new,courier,monospace;"> C:\www\html\tutorial2.php</span>)، لاحظ أنَّ الشرطة المائلة الخلفية (\) هي التي تستعمل في المسارات في ويندوز.
	</p>
</div>

<div id="wmd-preview-section-82">
	<h3 id="المسارات-النسبية">
		المسارات النسبية
	</h3>

	<p>
		وهي مسار الملف نسبةً إلى الملف الحالي (أي الملف الذي يجري عملية التضمين)؛ حيث يمكن أن يكون الملف في ثلاثة أماكن نسبية: 
	</p>

	<ol>
<li>
			أن يكون في نفس مجلد الملف الذي يجري عملية التضمين 
		</li>
		<li>
			أن يكون ضمن مجلد في نفس مجلد الملف الذي يجري عملية التضمين 
		</li>
		<li>
			أن يكون المجلد الأب (parent) أو في مجلدٍ موجودٍ في المجلد الأب 
		</li>
	</ol>
<p>
		لنتناول شرح كل حالةٍ على حدة: 
	</p>

	<ul>
<li>
			لقد استعملنا مسبقًا الحالة الأولى، ولقد وضعنا اسم الملف مباشرةً إن كان في نفس المجلد 
		</li>
		<li>
			2. أما في الحالة الثانية، فعلينا أن نضيف اسم المجلد؛ فمثلًا إن كان الملف موجودًا في مجلدٍ باسم <span style="font-family:courier new,courier,monospace;">folder</span> فسيكون سطر التضمين هو:
		</li>
	</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_15">
<span class="pun">‎</span><span class="pln">include</span><span class="pun">(</span><span class="str">'folder/tutorial2.php'</span><span class="pun">);‎</span></pre>

	<p style="margin-right: 40px;">
		أما لو كان هنالك أكثر من مجلد فرعي، فسنحتاج إلى كتابة أسمائها أيضًا:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_17">
<span class="pun">‎</span><span class="pln">include</span><span class="pun">(</span><span class="str">'first/second/third/tutorial2.php'</span><span class="pun">);‎</span></pre>

	<ul>
<li>
			3. في الحالة الأخيرة، سنستعمل "<span style="font-family:courier new,courier,monospace;">‎../‎</span>" (نقطتين ثم خط مائل) كي ننتقل إلى المجلد السابق؛ وبفرض أنَّ الملف الحالي موجودٌ في ‎<span style="font-family:courier new,courier,monospace;">/var/www/html/tutorials/include/tutorials.php</span> ونريد تضمين الملف ‎<span style="font-family:courier new,courier,monospace;">/var/www/html/another/tutorial2.php</span>، فسنستعمل:
		</li>
	</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_19">
<span class="pun">‎</span><span class="pln">include</span><span class="pun">(</span><span class="str">'../../another/tutorial2.php'</span><span class="pun">);‎</span></pre>

	<p style="margin-right: 40px;">
		لتضمينه، إذ أنَّ ‎../‎ تعني أننا ننتقل إلى الخلف مجلدًا واحدًا فقط.
	</p>
</div>

<div id="wmd-preview-section-83">
	<h2 id="مجالات-الأسماء">
		مجالات الأسماء
	</h2>

	<p>
		في المشاريع الكبيرة، من الممكن (وهذا يحدث عادةً) أن يكون لدينا دالتان أو صنفان لهما نفس الاسم في مكتبتين أو ملفين مختلفين؛ ونحتاج أحيانًا أن نضمن كلا الملفين في نفس الملف، مما يؤدي إلى حدوث خطأ لأنه لا يجوز أن نعيد تعريف دالة أو صنف أكثر من مرة واحدة؛ لذا جاءت مجالات الأسماء (namespaces) للمساعدة في تجنب تلك التضاربات. مجالات الأسماء كالمجلدات، حيث لا نستطيع أن نضع ملفين بنفس الاسم في نفس المجلد، وبالمثل لا نستطيع تعريف دالتين أو صنفين في نفس مجال الأسماء، لكن نستطيع فعل ذلك في مجال أسماءٍ مختلف. 
	</p>

	<p>
		لنفترض مثلًا أننا نبرمج نظامًا للتسوق، ولدينا دالتَا عرض مختلفتين، واحدة في ملف <span style="font-family:courier new,courier,monospace;">car.php</span> كي تُظهِر عربة التسوق والأخرى في <span style="font-family:courier new,courier,monospace;">checkout.php </span>لتظهر معلومات الدفع؛ ونريد تضمين هاتين الدالتين في ملفٍ سينفِّذ الدالة ‎<span style="font-family:courier new,courier,monospace;">display()</span>‎ من ملف<span style="font-family:courier new,courier,monospace;"> checkout.php</span> إن ضغط المستخدم على زر "checkout"، وسيستدعي الدالة<span style="font-family:courier new,courier,monospace;"> display()‎</span> من ملف<span style="font-family:courier new,courier,monospace;"> cart.php</span> فيما عدا ذلك. علينا هاهنا أن نستعمل مجالًا للأسماء، حيث سنُعرِّف كل دالة بمجال أسماءٍ مختلف كي لا تظهر أيّة أخطاء عند تضمين كلا الملفين سويةً. 
	</p>

	<p>
		ملف<span style="font-family:courier new,courier,monospace;"> checkout.php</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_21">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">Checkout</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> display</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">// code for display function</span><span class="pln">
  echo </span><span class="str">"dispay in checkout"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

	<p>
		ملف <span style="font-family:courier new,courier,monospace;">cart.php</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_23">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">Cart</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> display</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">//code of dispay function in cart</span><span class="pln">
  echo </span><span class="str">"display in cart"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		ملف <span style="font-family:courier new,courier,monospace;">tutorials.php</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9033_25">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// including files in different namespace</span><span class="pln">
</span><span class="kwd">require</span><span class="pln"> </span><span class="str">'checkout.php'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">require</span><span class="pln"> </span><span class="str">'cart.php'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// checking condition</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $action </span><span class="pun">==</span><span class="pln"> </span><span class="str">"checkout"</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// calling from checkout namespace</span><span class="pln">
  </span><span class="typ">Checkout</span><span class="pln">\display</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">// calling from cart namespace</span><span class="pln">
  </span><span class="typ">Cart</span><span class="pln">\display</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		لاحظ ما يلي في الأمثلة السابقة:
	</p>

	<ul>
<li>
			تُنشَأ مجالات الأسماء بكتابة <span style="font-family:courier new,courier,monospace;">namespace NamespaceName;‎</span> بعد وسم<span style="font-family:courier new,courier,monospace;"> ‎&lt;?php</span>
		</li>
		<li>
			نستطيع استدعاء الدوال والأصناف من مجالات أسماء معيّنة بكتابة <span style="font-family:courier new,courier,monospace;">NamespaceName\functionName()‎ </span>و <span style="font-family:courier new,courier,monospace;">NamespaceName\classname‎ </span>على التوالي وبالترتيب
		</li>
	</ul>
</div>

<div id="wmd-preview-section-84">
	<h3 id="مجالات-الأسماء-الفرعية-والكلمة-المفتاحية-use">
		مجالات الأسماء الفرعية والكلمة المفتاحية use
	</h3>

	<p>
		يمكننا تعريف مجال فرعي كما لو كنا ننشِئ مجلدًا فرعيًا، الشكل العام لتعريفه هو
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_7">
<span class="pln">‎namespace NamespaceName/subNamespaceName/anotherSubNamespace;‎</span></pre>

	<p>
		وطريقة استعمال مجالات الأسماء الفرعية مماثلة تمامًا لاستعمال مجالات الأسماء العادية؛ وعندما يكون المشروع كبيرًا ويحتوي الكثير من مجالات الأسماء الفرعية، فسيصبح من المزعج أن نكتب نفس الاسم مرارًا وتكرارًا، لذا توفِّر لغة PHP الكلمة المحجوزة «use» لهذا الغرض، إذ تُسنِد <span style="font-family:courier new,courier,monospace;">use</span> اسم مجال الأسماء الفرعي بأكمله إلى اسمٍ ذي كلمةٍ وحيدة.
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_9">
<span class="pln">use longNamespaceName as shortName;</span></pre>

	<p>
		يمكنك بعد ذلك أن تستعمل الاسم القصير لمجال الأسماء بدلًا من كتابة كل الاسم، يدعى الاسم القصير بالاسم البديل (alias).
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2774_11">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">require</span><span class="pln"> </span><span class="str">"checkout.php"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// نعرف اسمًا أقصر للاسم الأطول</span><span class="pln">
</span><span class="kwd">use</span><span class="pln"> </span><span class="typ">Namespace</span><span class="pln">\SubNamespace\FrontEnd\Checkout </span><span class="kwd">as</span><span class="pln"> </span><span class="typ">NewCheckout</span><span class="pun">;</span><span class="pln">
</span><span class="typ">NewCheckout</span><span class="pln">\display</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?</span><span class="pln"> </span><span class="pun">&gt;</span></pre>

	<h2>
		التحميل التلقائي للأصناف
	</h2>
</div>

<div id="wmd-preview-section-85">
	<p>
		العديد من المبرمجين الذين يكتبون برامج كائنية التوجه يُنشئون ملفًا لكل صنف، ومن أكثر الأشياء التي تزعجهم هي كتابة قائمة طويلة من الملفات التي يجب تضمينها في بداية كل ملف. 
	</p>

	<p>
		لم يعد ذلك ضروريًا في PHP 5، فأصبحت هنالك طريقة لتضيمن الأصناف تلقائيًا عند الحاجة إليها. 
	</p>

	<p>
		يمكننا استعمال التحميل التلقائي للأصناف عبر الدالة<span style="font-family:courier new,courier,monospace;">spl_autoload_register()‎</span>، وهذه الدالة مرنة جدًا، وتسمح باستخدام أكثر من محمل تلقائي (autoloader)، هذا مثالٌ عن استخدامها:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2774_13">
<span class="pun">&lt;?</span><span class="pln">php
spl_autoload_register</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$class_name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    include $class_name</span><span class="pun">.</span><span class="str">'.php'</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">MyClass1</span><span class="pun">();</span><span class="pln">
$obj2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass2</span><span class="pun">();</span><span class="pln"> 
</span><span class="pun">?&gt;</span></pre>

	<p>
		تقبل دالة<span style="font-family:courier new,courier,monospace;"> spl_autoload_register </span>وسيطًا هو الدالة التي ستضمن ملفات الأصناف، فإما أن تُعرِّف الدالة ثم تمرر اسمها إلى دالة <span style="font-family:courier new,courier,monospace;">spl_autoload_register</span>، أو أن تعرف دالة مجهولة مباشرةً داخل الدالة<span style="font-family:courier new,courier,monospace;"> spl_autoload_register</span> كما في المثال السابق. مثالٌ عن الحالة الأولى:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2774_15">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_autoloader</span><span class="pun">(</span><span class="pln">$class_name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        include $class_name</span><span class="pun">.</span><span class="str">'.php'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

spl_autoload_register</span><span class="pun">(</span><span class="str">'my_autoloader'</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_2774_17">
<span class="pln">$car </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">;</span><span class="pln"> </span></pre>

	<p>
		سيقوم PHP بمحاولة تحميل الملف<span style="font-family:courier new,courier,monospace;"> Car.php</span> (يبحث في المُجلّد الحالي) وإن وجده يقوم بإنشاء مُتغير جديد من صنف <span style="font-family:courier new,courier,monospace;">Car</span>.
	</p>
</div>

<div id="wmd-preview-section-86">
	<h2 id="التحميل-التلقائي-في-composer">
		التحميل التلقائي في Composer
	</h2>

	<p>
		شاع استعمل Composer لإدارة حزم المكتبات البرمجية في PHP، إن أردت الاطلاع على المزيد من المعلومات حوله، فانظر إلى مقالة <a href="https://academy.hsoub.com/programming/php/%D9%85%D8%A7-%D9%87%D9%88-composer-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D9%83%D9%84-%D9%85%D8%B7%D9%88%D8%B1-php-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r10/" rel="">ما هو Composer ولماذا يجب على كل مطور PHP استخدامه</a>. 
	</p>

	<p>
		يُنشِئ Composer الملف <span style="font-family:courier new,courier,monospace;">vendors/autoloader.php </span>الذي يتيح تضمين المكتبات الضرورية لعمل مشروعك تلقائيًا دون الحاجة إلى فعل ذلك يدويًا، وذلك عبر تضمين ذاك الملف في شيفرات PHP:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2774_20">
<span class="pun">&lt;?</span><span class="pln">php
require_once </span><span class="str">"vendors/autoloader.php"</span><span class="pun">;</span></pre>

	<p>
		أسهل طريقة هي تحديد كل صنف على حدة، وسنُعرِّف لهذا الغرض مصفوفةً تحتوي على مسارات الملفات التي نريد تحميلها تلقائيًا في ملف<span style="font-family:courier new,courier,monospace;"> composer.json</span>، ربما تستفيد من هذه الطريقة في تضمين الملفات التي تحوي دوال PHP التي لا يمكن تحميلها تلقائيًا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_22">
<span class="pln">{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}</span></pre>

	<p>
		أو عبر PSR-4، التي تسمح لك بربط مجالات الأسماء إلى مسارات نسبية (relative paths) لجذر الحزمة، فعند التحميل التلقائي لصنف مثل <span style="font-family:courier new,courier,monospace;">Foo\\Bar\\Abz</span>، فإن سابقة (prefix) مجال الأسماء <span style="font-family:courier new,courier,monospace;">Foo\\‎</span> التي تشير إلى المجلد <span style="font-family:courier new,courier,monospace;">src/‎ </span>تعني أن آلية التحميل التلقائي ستبحث عن ملف باسم<span style="font-family:courier new,courier,monospace;"> src/Bar/Baz.php </span>وتضمِّنه إن كان موجودًا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_24">
<span class="pln">{
    "autoload": {
        "psr-4": {
            "Monolog\\": "src/",
            "Vendor\\Namespace\\": ""
        }
    }
}</span></pre>

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

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_26">
<span class="pln">{
    "autoload": {
        "psr-4": { "Monolog\\": ["src/", "lib/"] }
    }
}</span></pre>

	<p>
		وتستطيع توفير مجلد افتراضي إن لم يُعرَّف مجال الأسماء للصنف الذي يراد تحميله تلقائيًا، وذلك بترك مكان السابقة فارغًا:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2774_28">
<span class="pln">{
    "autoload": {
        "psr-4": { "": "src/" }
    }
}</span></pre>

	<h2>
		المصادر
	</h2>
</div>

<div id="wmd-preview-section-87">
	<ul>
<li>
			مقال <a href="http://www.findalltogether.com/tutorial/distribute-code-in-files-in-php/" rel="external nofollow">Distribute code in files in PHP</a> لصاحبه Harish Kumar
		</li>
		<li>
			<a href="https://getcomposer.org/doc/04-schema.md#autoload" rel="external nofollow">توثيق Composer</a>
		</li>
		<li>
			صفحات <a href="http://php.net/manual/en/function.include.php" rel="external nofollow">include</a> و <a href="http://php.net/manual/en/function.require.php" rel="external nofollow">require</a> و <a href="http://php.net/manual/en/language.oop5.autoload.php" rel="external nofollow">Autoloading Classes</a> و <a href="http://php.net/manual/en/function.spl-autoload-register.php" rel="external nofollow">spl_autoload_register</a> و ‎‎<a href="http://php.net/manual/en/function.autoload.php" rel="external nofollow">__autoload</a>
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">332</guid><pubDate>Sun, 15 May 2016 10:22:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F; PHP7 &#x645;&#x646; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-php7-%D9%85%D9%86-php-r327/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/572efefbb2d74_php7(1).png.15861ab640d643e9b6f77886b9344a03.png" /></p>

<div id="wmd-preview-section-23">
	<p id="الإصدار-الجديد-من-php-php-7">
		حمل عام 2015 حدثًا مهمًا لمجتمع PHP، فبعد أحد عشر عامًا بعد إصدار PHP 5.0 تم إطلاق الإصدار الرئيسي الجديد ألا وهو PHP 7. وسنتحدث في هذا الدرس عمّا حمله هذا الإصدار من تغييرات وإضافات. 
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="16257" data-unique="3lnjehism" src="https://academy.hsoub.com/uploads/monthly_2016_05/572efef99b18c_php7(1).png.a7dae966795a6cdf27a67b91ff11b7e0.png" alt="php7 (1).png"></p>

	<p>
		لكن أين اختفى إصدار PHP 6؟ إذا لم تعمل منذ فترة على PHP، فربما تتساءل ما الذي حدث لإصدار PHP 6، لماذا قفزوا مباشرةً من PHP 5 إلى PHP 7؟
	</p>

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

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

	<p>
		لكن كُتِبَت مقالات وكتب عن PHP 6 ودعمها لمحارف يونيكود قبل إيقاف المشروع، لهذا سُمِّي الإصدار الجديد PHP 7 لرفع الالتباس. 
	</p>

	<p>
		حسنًا، لنترك الماضي الحزين وراء ظهورنا ولننظر ما الذي أتت به PHP 7.
	</p>
</div>

<div id="wmd-preview-section-24">
	<h2 id="تحسينات-في-الأداء">
		تحسينات في الأداء
	</h2>

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

	<p>
		يمكنك إلقاء نظرة على <a href="http://talks.php.net/oz15#/wpbench" rel="external nofollow">العرض</a> الذي قدمه Rasmus Lerdorf لتفاصيل أكثر عن الإحصائيات حول الأداء، هذه صورة مأخوذة من ذاك العرض التي تُظهِر نتائج تشغيل ووردبريس على مختلف إصدارات PHP: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16256" href="https://academy.hsoub.com/uploads/monthly_2016_05/php7.png.6763943219556e51f5770eaba2180d99.png" rel="external"><img alt="php7.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16256" data-unique="a2p5iatqn" src="https://academy.hsoub.com/uploads/monthly_2016_05/php7.thumb.png.0b99b25754344c7fef48c11d9eef5d92.png"></a>
	</p>

	<p>
		تستطيع PHP 7 معالجة ضعف الطلبيات في الثانية تقريبًا، الذي يُمثِّل عمليًا تحسينًا قدره 100% في الأداء في المواقع التي تستعمل ووردبريس. 
	</p>

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

<div id="wmd-preview-section-25">
	<h2 id="المشاكل-في-التوافقية-مع-الإصدارات-السابقة">
		المشاكل في التوافقية مع الإصدارات السابقة
	</h2>

	<p>
		حدثت عدِّة تغييرات في بنية PHP في الإصدار السابع، التي يؤدي بعضها إلى عدم توافقية مع ما سبقها من الإصدارات. 
	</p>

	<p>
		أهم تلك التغييرات هي حذف الدوال والعناصر المهملة (deprecated) خصيصًا وسوم البداية والنهاية التي تشبه ASP (أي <span style="font-family:courier new,courier,monospace;">‎&lt;%‎</span> و ‎<span style="font-family:courier new,courier,monospace;">&lt;%=</span>‎ و ‎<span style="font-family:courier new,courier,monospace;">%&gt;‎</span>) حيث حُذِفَت بالإضافة إلى وسم <span style="font-family:courier new,courier,monospace;">&lt;script language="php"‎&gt;</span>، تأكد أنَّك تستعمل الوسم ‎<span style="font-family:courier new,courier,monospace;">&lt;?php</span> بدلًا عنهما. 
	</p>

	<p>
		الدوال التي أُهمِلَت في الإصدارات السابقة تم حذفها في PHP 7 مثل الدالة <a href="http://php.net/manual/en/function.split.php" rel="external nofollow">split</a>، والدوال التي تتبع للإضافة <span style="font-family:courier new,courier,monospace;">ereg</span> (أي جميع الدوال التي تبدأ بالسابقة<span style="font-family:courier new,courier,monospace;"> ereg_‎</span>). يجب استخدام الدوال التي تتبع للإضافة <span style="font-family:courier new,courier,monospace;">PCRE</span> بدلًا عنها (أي الدوال التي تبدأ بالسابقة <span style="font-family:courier new,courier,monospace;">preg_</span>‎) والتي توفر ميزات أكثر. 
	</p>

	<p>
		وحُذِفَت جميع دوال الإضافة <span style="font-family:courier new,courier,monospace;">mysql</span> أيضًا (أي الدوال التي تبدأ بالسابقة<span style="font-family:courier new,courier,monospace;"> mysql_‎</span>) والتي أهمِلَت منذ الإصدار 5.5؛ عليك استخدام دوال إضافة <span style="font-family:courier new,courier,monospace;">mysqli</span> التي تبدأ بالسابقة <span style="font-family:courier new,courier,monospace;">mysqli_‎ </span>بدلًا منها. 
	</p>

	<p>
		طُبِّقَت أيضًا السياسة الموحدة لتفسير المتغيرات، التي حلّت العديد من المشاكل التي تتعلق بالتعابير التي تحتوي على متغيرات.
	</p>
</div>

<div id="wmd-preview-section-26">
	<h2 id="الميزات-الجديدة">
		الميزات الجديدة
	</h2>

	<p>
		هذا هو الجزء المسلي هنا، لنتحدث عن أكثر الميزات إثارةً التي ستحصل عليها عند التحديث إلى PHP 7.
	</p>
</div>

<div id="wmd-preview-section-27">
	<h3 id="معاملين-جديدين">
		معاملين جديدين
	</h3>

	<p>
		يمكن استخدام معامل <span style="font-family:courier new,courier,monospace;">spaceship</span> (<span style="font-family:courier new,courier,monospace;">&lt;=&gt; </span>أو معامل المقارنة المدمج) لجعل تعبير المقارنة أقصر ما يمكن. انظر إلى هذا المثال: 
	</p>

	<p>
		<math xmlns="http://www.w3.org/1998/Math/MathML"><mi></mi></math></p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5345_13">
<span class="pln">a</span><span class="pun">&lt;=&gt;</span><span class="pln">b </span></pre>

	<p>
		ستكون نتيجة التعبير السابق 1- إن كان ‎<span style="font-family:courier new,courier,monospace;">a$</span> أصغر من ‎<span style="font-family:courier new,courier,monospace;">$b</span>، و 0 إذا كان<span style="font-family:courier new,courier,monospace;"> ‎$a</span>يساوي ‎<span style="font-family:courier new,courier,monospace;">$b</span>، و 1 إذا كان <span style="font-family:courier new,courier,monospace;">‎$a</span> أكبر من <span style="font-family:courier new,courier,monospace;">‎$b</span>. ويمكن اعتباره اختصارًا للتعبير الآتي: 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5345_15">
<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="lit">1</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">&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="lit">1</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></pre>

	<h3>
		تحديد أنواع المعاملات والقيم المُعادة
	</h3>
</div>

<div id="wmd-preview-section-28">
	<p>
		إحدى أهم الميزات الجديدة المنتظرة التي أتت بها PHP 7 هي تحديد أنواع معاملات (parameters) للدوال. التي تعني أنَّنا تستطيع تحديد ما هو نوع المعامل الذي ستقبله الدالة والذي سيكون إما <span style="font-family:courier new,courier,monospace;">int</span> (للأعداد الصحيحة) أو <span style="font-family:courier new,courier,monospace;">float</span> (للأعداد العشرية) أو <span style="font-family:courier new,courier,monospace;">string</span> (للسلاسل النصية) أو <span style="font-family:courier new,courier,monospace;">bool</span> (للقيم المنطقية <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span> أو ما يكافئها).
	</p>

	<p>
		لا يكون الالتزام بأنواع المعاملات المُحدَّدة إجباريًا افتراضيًا، أي non-strict، وهذا يعني لو مررت <span style="font-family:courier new,courier,monospace;">(int(1 </span>إلى دالة تتطلب عددًا عشريًا (float) فستصبح قيمة الوسيط الممرر <span style="font-family:courier new,courier,monospace;">(float(1.0</span> تلقائيًا، أما لو مررت <span style="font-family:courier new,courier,monospace;">(float(1.5</span> إلى دالة تتطلب عددًا صحيحًا (int)، فعندها ستصبح القيمة <span style="font-family:courier new,courier,monospace;">(int(1</span>. 
	</p>
</div>

<div id="wmd-preview-section-29">
	<h3 id="ميزات-أخرى-متفرقة">
		ميزات أخرى متفرقة
	</h3>

	<p>
		أصبحت PHP 7 تدعم محرف تهريب (escaping) جديد هو<span style="font-family:courier new,courier,monospace;"> ‎\u </span>الذي يسمح لنا باستعمال محارف يونيكود (بالنظام الست عشري) داخل سلاسل PHP النصية، ويستعمل بالشكل <span style="font-family:courier new,courier,monospace;">{‎\u{CODE</span>، المثال الآتي يُظهِر رمز القلب: 
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5345_19">
<span class="pln">echo </span><span class="pun">“</span><span class="pln">\u</span><span class="pun">{</span><span class="lit">1F49A</span><span class="pun">}”;</span><span class="pln"> </span></pre>

	<p>
		أضيفت أيضًا ميزة إنشاء أصناف مجهولة (Anonymous classes) التي تُفيد في حال أردنا إنشاء كائن وحيد من الصنف فقط: 
	</p>

	<ul>
<li>
			الإصدارات قبل PHP 7 
		</li>
	</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5345_28">
<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">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> log</span><span class="pun">(</span><span class="pln">msg
  </span><span class="pun">{</span><span class="pln">
    echomsg</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
$util</span><span class="pun">-&gt;</span><span class="pln">setLogger</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Logger</span><span class="pun">());</span></pre>

	<ul>
<li>
			في الإصدار PHP 7
		</li>
	</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5345_26">
<span class="pln">$util</span><span class="pun">-&gt;</span><span class="pln">setLogger</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">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"> log</span><span class="pun">(</span><span class="pln">$msg</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo $msg</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

	<h2>
		المصادر
	</h2>
</div>

<div id="wmd-preview-section-30">
	<ul>
<li>
			لمزيدٍ من المعلومات حول الإضافات التي حدثت في PHP 7، راجع التدوينة <a href="https://www.digitalocean.com/company/blog/getting-ready-for-php-7/" rel="external nofollow">Getting Ready for PHP 7</a> لصاحبتها Erika Heidi.
		</li>
		<li>
			والتدوينة <a href="https://www.toptal.com/php/php-7-performance-features" rel="external nofollow">Introduction To PHP 7: What’s New And What’s Gone</a> لصاحبها Vilson Duka، وصفحة <a href="http://php.net/manual/en/migration70.new-features.php" rel="external nofollow">New PHP 7 features</a> في دليل PHP.
		</li>
		<li>
			إذا أردت شرحًا لما حُذِفَ في PHP 7، فانظر إلى صفحة <a href="http://php.net/manual/en/migration70.incompatible.php" rel="external nofollow">Backward incompatible changes</a> في دليل PHP
		</li>
		<li>
			هنالك مرجع كامل لتغيرات PHP موجودٌ في الصفحة <a href="https://github.com/tpunt/PHP7-Reference" rel="external nofollow">الآتية</a> على github، وانظر كذلك إلى <a href="https://wiki.php.net/rfc#php_70" rel="external nofollow">PHP RFC</a>.
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">327</guid><pubDate>Sun, 08 May 2016 08:54:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62C;&#x631;&#x64A;&#x62F; (Abstraction)&#xA0;&#x648;&#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x627;&#x62A; (Interfaces) &#x648;&#x627;&#x644;&#x633;&#x645;&#x627;&#x62A; (Traits) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-abstraction%C2%A0%D9%88%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D8%B3%D9%85%D8%A7%D8%AA-traits-%D9%81%D9%8A-php-r317/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/abstraction-interfaces-traits-in-php.png.330718e7a809761329a607d493c61f9c.png" /></p>

<div id="wmd-preview-section-79">
	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="15424" data-unique="jpolndpbh" src="https://academy.hsoub.com/uploads/monthly_2016_04/abstraction-interfaces-traits-in-php.png.7d9f109e9d8848c2e2c844ba1a2f781e.png" alt="abstraction-interfaces-traits-in-php.png"></p>

	<h2 id="التجريد-والواجهات-والسمات-في-php">
		التجريد – Abstraction
	</h2>
</div>

<div id="wmd-preview-section-80">
	<p>
		نعلم أنَّ الصنف المُشتَق يأخذ خاصياته من الصنف الأب لكن الصنف المُشتَق مستقل تمامًا عن الصنف الأب؛ وقد يكون في بعض الأحيان من الجيد أن نرسم خطوطًا عريضة لآلية سلوك الصنف الابن، وهذه هي مهمة الأصناف والدوال المجردة. إذ أنَّ الصنف المجرد يحتوي على دوال غير مكتملة (أي مجردة) التي يجب أن يملأها الابن لكي يكون صنفًا وعدا ذلك سيكون صنفًا مجردًا أيضًا. 
	</p>

	<p>
		بكلامٍ آخر، الصنف المُجرَّد (Abstract Class) هو صنف يحتوي على أسماء دوال دون كتابة الشيفرات المسؤولة عن عملها وتسمى تلك الدوال بالدوال المجردة، وقد يحتوي أيضًا على دوال كاملة اعتيادية تؤدي وظيفتها تمامًا. انظر إلى المثال الآتي لمزيدٍ من الإيضاح:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6200_7">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// تعريف صنف مجرد</span><span class="pln">
abstract </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">AbsClass</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">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"this is an abstract class &lt;br&gt;"</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="com">// دالة مجردة</span><span class="pln">
  abstract </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> abs_function</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> full_function</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"this is not an abstract function &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">SubClass</span><span class="pln"> extends </span><span class="typ">AbsClass</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">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"this is child class &lt;br&gt;"</span><span class="pun">;</span><span class="pln">
    parent</span><span class="pun">::</span><span class="pln">full_function</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"> abs_function</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"this is completed abstract function &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">
$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SubClass</span><span class="pun">();</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">abs_function</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		نستعمل الأصناف المجردة عندما يلزمنا إنشاء طريقة محددة للتعامل مع عدِّة أصناف مُشتقَّة، التي قد تتشارك ببعض الوظائف. 
	</p>

	<p>
		<strong>ملاحظة</strong>: لا يمكن إنشاء كائن من صنف مجرد، حيث لا يمكن إلا اشتقاق تلك الأصناف. يستعمل الصنف المجرد لتقييد عمل الصنف الابن.
	</p>
</div>

<div id="wmd-preview-section-81">
	<h2 id="الواجهات-interfaces">
		الواجهات interfaces
	</h2>

	<p>
		من بين الحالات التي نستعمل فيها الواجهات (interfaces) هي عندما نريد تطبيق التعددية الشكلية أي أن تكون طريقة تعاملنا متشابهة مع عدِّة أصناف. 
	</p>

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

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6200_9">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// تعريف واجهة</span><span class="pln">
</span><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="com">// abstract functions </span><span class="pln">
  </span><span class="com">// all must be public</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> display</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"> another</span><span class="pun">(</span><span class="pln">$argument</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">interface</span><span class="pln"> </span><span class="typ">AnotherInterface</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"> complete_it</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"> one_more</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">Parent</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> parent_fun</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"parent function"</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">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Demo</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Parent</span><span class="pln"> </span><span class="kwd">implements</span><span class="pln"> </span><span class="typ">MyInterface</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AnotherInterface</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"> display</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"display complete"</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"> another</span><span class="pun">(</span><span class="pln">$argument</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="com">#code</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"> complete_it</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="com">#code</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"> one_more</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="com">#code</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></pre>

	<p>
		نستعمل الواجهات عندما نريد إنشاء طريقة موحدة للتعامل مع عدِّة أصناف، فمثلًا، نُنشِئ واجهة اسمها <span style="font-family:courier new,courier,monospace;">Database</span> فيها دوال مجردة مثل <span style="font-family:courier new,courier,monospace;">select</span> و <span style="font-family:courier new,courier,monospace;">insert</span> وغيرها، ثم نستعمل تلك الواجهة في صنف MySQL وفي صنف SQLite، ونعيد تعريف الدوال الموجودة في الواجهة بما يلائم طريقة عمل كل نوع من أنواع قواعد البيانات. وبهذه الطريقة نستطيع أن نستعمل قواعد بيانات MySQL أو SQLite بنفس الآلية تمامًا. 
	</p>

	<p>
		<strong>ملاحظة</strong>: يجب أن تكون جميع الدوال داخل الواجهة عامةً، يمكن أن يرث صنفٌ ما صنفًا آخر ويستعمل واجهة بنفس الوقت، لكن يجب أن يكون تعريف الاشتقاق قبل الواجهات.
	</p>
</div>

<div id="wmd-preview-section-82">
	<h2 id="السمات-traits">
		السمات Traits
	</h2>

	<p>
		قدم الإصدار 5.4.0 من PHP ميزة السّمات Traits، وهي طريقة تسمح بإعادة استعمال الشيفرات في اللغات التي لا تسمح بالوراثة المتعددة، وهي تقلل من المحدوديات الناتجة عن عدم السماح بالوراثة المتعددة عن طريق إتاحة استعمال مجموعة من الدوال في عدة أصناف. 
	</p>

	<p>
		أي لو كانت عندك مجموعة من الدوال العامة، وترغب في مشاركتها بين أكثر من صنف، فضعها في Trait ثم استعملها (<span style="font-family:courier new,courier,monospace;">use</span>) في تلك الأصناف.
	</p>

	<p>
		يُعرف Trait عبر ذكر الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">trait</span> متبوعةً باسمه، ثم تُعرَّف الدوال داخله. وتُستعمل الكلمة <span style="font-family:courier new,courier,monospace;">use</span> عند تعريف صنف يستعمل Trait معين كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6200_11">
<span class="pun">&lt;?</span><span class="pln">php
trait </span><span class="typ">HelloWorld</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 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">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">World</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    use </span><span class="typ">HelloWorld</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">World</span><span class="pun">();</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">sayHello</span><span class="pun">();</span><span class="pln"> </span><span class="com">// ستُطبع عبارة Hello World!</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		يمكن إعادة تعريف الدوال داخل الأصناف التي تستعمل Trait معيّن، كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6200_13">
<span class="pun">&lt;?</span><span class="pln">php
trait </span><span class="typ">HelloWorld</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 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">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">World</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    use </span><span class="typ">HelloWorld</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">NewWorld</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    use </span><span class="typ">HelloWorld</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 Universe!'</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
$obj1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">World</span><span class="pun">();</span><span class="pln">
$obj1</span><span class="pun">-&gt;</span><span class="pln">sayHello</span><span class="pun">();</span><span class="pln"> </span><span class="com">// ستُطبع عبارة Hello World!</span><span class="pln">

$obj2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">NewWorld</span><span class="pun">();</span><span class="pln">
$obj2</span><span class="pun">-&gt;</span><span class="pln">sayHello</span><span class="pun">();</span><span class="pln"> </span><span class="com">// ستُطبع عبارة Hello Universe!</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		يمكن استعمال أكثر من Trait في نفس الصنف عبر ذكر أسمائهم في عبارة <span style="font-family:courier new,courier,monospace;">use</span> مفصولًا بينهم بفاصلة، لاحظ أنه إذا عُرِّفَت دالتين بنفس الاسم في أكثر من Trait، ثم استعملناها في صنف، فسيحدث تضارب وتظهر رسالة خطأ <strong>fetal error</strong>، ويمكنك حل مشكلة التضارب في الأسماء عبر استعمال المعامل <span style="font-family:courier new,courier,monospace;">insteadof</span> أو عبر <span style="font-family:courier new,courier,monospace;">as</span> كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6200_15">
<span class="pun">&lt;?</span><span class="pln">php
trait A </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"> smallTalk</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'a'</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"> bigTalk</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'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">

trait B </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"> smallTalk</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'b'</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"> bigTalk</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">'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">Talker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// لدينا في A و B دالتين اسمهما bigTalk و smallTalk</span><span class="pln">
    </span><span class="com">// ما يلي سيجعل الصنف يستعمل الدالة smallTalk من B عوضًا عن مثيلتها في A</span><span class="pln">
    </span><span class="com">// و bigTalk من A عوضًا عن B</span><span class="pln">
    </span><span class="kwd">use</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> B </span><span class="pun">{</span><span class="pln">
        B</span><span class="pun">::</span><span class="pln">smallTalk insteadof A</span><span class="pun">;</span><span class="pln">
        A</span><span class="pun">::</span><span class="pln">bigTalk insteadof 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">Aliased_Talker</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">use</span><span class="pln"> A</span><span class="pun">,</span><span class="pln"> B </span><span class="pun">{</span><span class="pln">
        B</span><span class="pun">::</span><span class="pln">smallTalk insteadof A</span><span class="pun">;</span><span class="pln">
        A</span><span class="pun">::</span><span class="pln">bigTalk insteadof B</span><span class="pun">;</span><span class="pln">
        </span><span class="com">// لاحظ كيف استعملنا as لتغير اسم الدالة في الصنف</span><span class="pln">
        B</span><span class="pun">::</span><span class="pln">bigTalk </span><span class="kwd">as</span><span class="pln"> talk</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></pre>

	<h2>
		مصادر
	</h2>
</div>

<div id="wmd-preview-section-83">
	<ul>
<li>
			مقالة <a href="http://www.findalltogether.com/tutorial/abstraction-and-interface-in-php/" rel="external nofollow">Abstraction and Interface in PHP</a> لصاحبها Harish Kumar 
		</li>
		<li>
			فصل <a href="http://www.hackingwithphp.com/6/0/0/objects" rel="external nofollow">Objects</a> في كتاب Practical PHP Programming 
		</li>
		<li>
			فصل البرمجة غرضية التوجه في كتاب <a href="http://librebooks.org/learn-programming-with-php/" rel="external nofollow">تعلم البرمجة بلغة PHP</a> 
		</li>
		<li>
			صفحات <a href="http://php.net/manual/en/language.oop5.interfaces.php" rel="external nofollow">Object Interfaces</a> و <a href="http://php.net/manual/en/language.oop5.traits.php" rel="external nofollow">Traits</a> في دليل PHP وغيرها.
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">317</guid><pubDate>Tue, 19 Apr 2016 12:35:44 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; (Object Oriented Programming) &#x641;&#x64A; PHP</title><link>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/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/oop-in-php.png.e4a12b77203f4d53443ec66efd721a9d.png" /></p>
<div id="wmd-preview-section-11">
	<p id="الأصناف-في-php">
		كان الغرض من البرمجة الكائنية (Object oriented programing اختصارًا <abbr title="Object-Oriented Programming | البرمجة كائنية التوجه"><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></abbr>) هو السماح للمبرمجين بتسهيل تقسيم البرامج حسب وظيفتها؛ فالمبرمجون يُنشؤون "كائنات" ويضبطون بعض الخاصيات ثم يطلبون من تلك الكائنات أن تقوم بأشياءٍ معيّنة. مثلًا لدينا "الأكواب" عبارة عن كائنات، وتلك الأكواب لها خاصيات معيّنة مثل المادة المصنوعة منها (زجاج، أو بلاستيك، أو معدن) والسعة القصوى لها، كما يمكن إجراء عمليات عليها مثل ملء كوب. لكن عمومًا تنطوي كل تلك الأنواع تحت لواء "الأكواب" وإن اختلفت خاصياتها. 
	</p>

	<p style="text-align: center;">
		<img alt="oop-in-php.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15423" data-unique="h139zfc67" src="https://academy.hsoub.com/uploads/monthly_2016_04/oop-in-php.png.b925066103e674b0075ffc6259005906.png">
	</p>

	<p>
		أنُشِئت الأصناف (classes) في PHP لغرض التجريد (abstraction) والتغليف (encapsulation). والصنف هو مجموعة من المتغيرات والدوال التي تؤدي وظيفة مشابهة؛ وتساعد الأصناف في تجنب المشاكل الأمنية وذلك بفصل الواجهة (interface) عن طريقة التطبيق (implementation)، وتضيف الأصناف قيودًا إلى الوصول إلى المتغيرات والدوال. 
	</p>

	<p>
		يُعرَّف الصنف بكتابة الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">class</span> يليها اسم الصنف، ومن المستحسن اتباع طرق الكتابة التقليدية في أسماء الأصناف، حيث يبدأ اسم الصنف بحرفٍ كبير؛ هذا مثالٌ عن تعريف صنف بسيط:
	</p>
</div>

<div id="wmd-preview-section-12">
	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_11"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SimpleClass</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">?&gt;</span></pre>

	<p>
		الشيفرة الموجودة ضمن الصنف لا تنفذ مباشرةً، إذ علينا أولًا أن قومة بإنشاء بإشاء كائن (object) من ذاك الصنف، الكائن هو نسخة من الصنف تكون جميع متغيرات ودوال ذاك الصنف جزءًا من خاصياتها (properties). يمكن إنشاء كائن من صنف كالآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_15"><span class="pln">object_name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassName</span><span class="pun">();</span></pre>

	<h2>
		الخاصيات والدوال
	</h2>
</div>

<div id="wmd-preview-section-13">
	<p>
		المتغيرات التي تكون عضوًا بالصنف تسمى خاصيات (properties)، وتُعرَّف عبر استخدام إحدى محددات الوصول <span style="font-family:courier new,courier,monospace;">public</span> (عام) أو <span style="font-family:courier new,courier,monospace;">protected</span> (محمي) أو <span style="font-family:courier new,courier,monospace;">private</span> (خاص)، ويأتي بعدها التعريف الاعتيادي للمتغيرات، ويمكن أن تُسنَد القيم إليها مباشرةً، لكن يجب أن تكون تلك القيم ثابتة، أي لا تحتوي تعابير رياضية أو قيم معادة من دوال. 
	</p>

	<p>
		أما الدوال الأعضاء في الأصناف، فتسمى توابع methods، وتُعرَّف كغيرها من الدوال، لكن مع الانتباه إلى ضرورة تحديد مجال الدالة (عامة أو محمية أو خاصة) كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_19"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">SimpleClass</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"> $var </span><span class="pun">=</span><span class="pln"> </span><span class="str">'a default value'</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"> displayVar</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="kwd">var</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></pre>

	<p>
		المتغير <span style="font-family:courier new,courier,monospace;">‎$this</span> متوفر داخل دوال الصنف تلقائيًا (أي ليس عليك إنشاؤه)، وهو يشير إلى الكائن الذي قام بإنشاء نسخة من الصنف، ويُستعمل للوصول إلى الخاصيات أو الدوال الموجودة في الصنف. لاحظ عدم وجود رمز الدولار ($) قبل اسم المتغير عند الوصول إليه عبر ‎<span style="font-family:courier new,courier,monospace;">$this</span>. 
	</p>

	<p>
		مثالٌ عن ما سبق:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_21"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ClassName</span><span class="pln">
 </span><span class="pun">{</span><span class="pln">
     </span><span class="com">// تعريف متغير public</span><span class="pln">
     </span><span class="kwd">public</span><span class="pln"> $class_variable</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"> __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">class_variable </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">
         echo </span><span class="str">"this is the constructor &lt;br&gt;"</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">function</span><span class="pln"> get_global</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">class_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="kwd">function</span><span class="pln"> set_global</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">class_variable </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">// إظهار قيمة متغير في الصنف</span><span class="pln">
     </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> reset_display</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">private_function</span><span class="pun">();</span><span class="pln">
         echo $this</span><span class="pun">-&gt;</span><span class="pln">get_global</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="com">// دالة خاصة</span><span class="pln">
     </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> private_function</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">class_variable </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="pun">}</span><span class="pln">

 </span><span class="pun">}</span><span class="pln"> 

 $object_name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ClassName</span><span class="pun">();</span><span class="pln">
 echo $object_name</span><span class="pun">-&gt;</span><span class="pln">get_global</span><span class="pun">().</span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
 $object_name</span><span class="pun">-&gt;</span><span class="pln">set_global</span><span class="pun">(</span><span class="lit">231</span><span class="pun">);</span><span class="pln">
 echo $object_name</span><span class="pun">-&gt;</span><span class="pln">get_global</span><span class="pun">().</span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
 $object_name</span><span class="pun">-&gt;</span><span class="pln">reset_display</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		لاحظ المفاهيم الآتية في المثال السابق التي شرحنا بعضها أعلاه:
	</p>

	<ul>
		<li>
			المتغير الذي يكون متاحًا للوصول في كل الصنف (‎<span style="font-family:courier new,courier,monospace;">$class_variable</span>) يُعرَّف بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">public</span>؛ أما المتغيرات المحلية المُعرَّفة داخل دالة لا يمكن الوصول إليها إلا من تلك الدالة.
		</li>
		<li>
			يمكن الوصول إلى متغيرات أو دوال الصنف باستخدام ‎<span style="font-family:courier new,courier,monospace;">$this-&gt;variable_name;</span>‎ و <span style="font-family:courier new,courier,monospace;">‎$this-&gt;function_name();‎</span> على التوالي وبالترتيب. إذ أنَّ ‎<span style="font-family:courier new,courier,monospace;">$this</span> يُشير إلى الصنف نفسه.
		</li>
		<li>
			الدالة البانية (constructor) هي دالة ذات معنى خاص في الأصناف؛ حيث تُشغَّل هذه الدالة عندما نُنشِئ كائنًا من ذاك الصنف، ويمكن أيضًا إرسال وسائط إلى الدالة البانية. سنشرح الدالة البانية والهادمة لاحقًا.
		</li>
	</ul>

	<p>
		ناتج السكربت السابق:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8435_23"><span class="pln">it is constructor 
3600
231
3600</span></pre>

	<p>
		<strong>ملاحظة</strong>: لا يُنصح بتعديل قيم خاصيات الفئات يدويًا، وإنما استعمل دوالًا خاصةً لهذا الغرض، فمثلًا لو كان عندك صنفٌ وظيفته حساب كمية الماء اللازمة لمدينة ما، ولديك خاصية اسمها population تُمثِّل عدد سكان المدينة، فلا تسمح بالوصول إليها مباشرةً، وإنما اكتب دالةً اسمها <span style="font-family:courier new,courier,monospace;">setPopulation</span> مثلًا، واجعلها تُعدِّل قيمة عدد السكان وكل ما يتعلق بها من الحسابات تلقائيًا:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_25"><span class="pln">$obj</span><span class="pun">-&gt;</span><span class="pln">setPopulation</span><span class="pun">(</span><span class="lit">200000</span><span class="pun">);</span><span class="pln"> </span></pre>

	<h2>
		الوراثة
	</h2>
</div>

<div id="wmd-preview-section-14">
	<p>
		نحاول دومًا عندما نبرمج ألّا نعيد كتابة الشيفرة مرارًا وتكرارًا، وأن نفصل بين تطبيق الشيفرة والواجهة (interface) لأسباب تتعلق بالحماية. الخيار الجديد المتاح أمامنا الآن هو استعمال الوراثة للقيام بالأمور السابقة بكفاءة. 
	</p>

	<p>
		الوراثة في البرمجة كالوراثة في حياتنا، إذ يرث والدك بعض الخاصيات من جدك ويُعدِّلها أيضًا، وأنت أيضًا ترث بعض الخاصيات من والدك وتعدلها وتضيف غيرها. تسمى هذه العملية في البرمجة بالمصطلح inheritance. يمكن لأي صنف أن يوسِّع أو يشتق (extend) أصنافًا أخرى ويمكنه أن يصل إلى المتغيرات والدوال العامة والمحمية فيها فقط (أي لا يستطيع أن يصل إلى الدوال الخاصة <span style="font-family:courier new,courier,monospace;">private</span>).
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_27"><span class="pun">&lt;?</span><span class="pln">php
 </span><span class="com">/**
 * الوراثة في PHP
 */</span><span class="pln">
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Grandfather</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"> $global_variable</span><span class="pun">;</span><span class="pln">
     </span><span class="com">// الدالة البانية للصنف grandfather</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">global_variable </span><span class="pun">=</span><span class="pln"> </span><span class="lit">56</span><span class="pun">;</span><span class="pln">
         echo </span><span class="str">"I am grandfather &lt;br&gt;"</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"> default_function</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         echo </span><span class="str">"this is default function in grandfather &lt;br&gt;"</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"> private_function</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         echo </span><span class="str">"this is private function in grandfather &lt;br&gt;"</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"> protected_function</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         echo </span><span class="str">"this is protected function in grandfather &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"> public_function</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         echo </span><span class="str">"this is public function in grandfather &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="com">/**
 * هذا صنف فرعي مشتق من الصنف  Grandfather
 * وسيرث كل خاصياته عدا الخاصة (private) منها
 */</span><span class="pln">
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Father</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Grandfather</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"> $father_var</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">// السطر الآتي مساوٌ للسطر =&gt; parent::__construct();</span><span class="pln">
         </span><span class="typ">Grandfather</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">();</span><span class="pln">
         $this</span><span class="pun">-&gt;</span><span class="pln">father_var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">256</span><span class="pun">;</span><span class="pln">
         echo </span><span class="str">"I am father &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"> display_all</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">default_function</span><span class="pun">();</span><span class="pln">
         $this</span><span class="pun">-&gt;</span><span class="pln">protected_function</span><span class="pun">();</span><span class="pln">
         $this</span><span class="pun">-&gt;</span><span class="pln">public_function</span><span class="pun">();</span><span class="pln">
         echo </span><span class="str">"I am father's display_all &lt;br&gt;"</span><span class="pun">;</span><span class="pln">
         parent</span><span class="pun">::</span><span class="pln">public_function</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">
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Child</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
 </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"> __construct</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">Grandfather</span><span class="pun">::</span><span class="pln">__construct</span><span class="pun">();</span><span class="pln">
         echo </span><span class="str">"I am child &lt;br&gt;"</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">// تسمى هذه العملية «إعادة تعريف الدوال»</span><span class="pln">
     </span><span class="kwd">function</span><span class="pln"> display_all</span><span class="pun">()</span><span class="pln">
     </span><span class="pun">{</span><span class="pln">
         echo </span><span class="str">"function from father&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
         </span><span class="com">// استدعاء دالة من الصنف الأب</span><span class="pln">
         parent</span><span class="pun">::</span><span class="pln">display_all</span><span class="pun">();</span><span class="pln">
         echo </span><span class="str">"new added in child&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">
 $obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Father</span><span class="pun">();</span><span class="pln">
 $obj</span><span class="pun">-&gt;</span><span class="pln">display_all</span><span class="pun">();</span><span class="pln">

 echo </span><span class="str">"&lt;br&gt;&lt;br&gt;&lt;br&gt;Child object call&lt;br&gt;&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
 $obj2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">();</span><span class="pln">
 $obj2</span><span class="pun">-&gt;</span><span class="pln">display_all</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		الناتج:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8435_29"><span class="pln">I am grandfather 
I am father 
this is default function in grandfather 
this is protected function in grandfather 
this is public function in grandfather 
I am father's display_all 
this is public function in grandfather 
Child object call
I am grandfather 
I am child 
function from father
this is default function in grandfather 
this is protected function in grandfather 
this is public function in grandfather 
I am father's display_all 
this is public function in grandfather 
new added in child</span></pre>

	<p>
		يعطي المثال السابق صورةً كاملةً عن الوراثة، لنحاول فهمه:
	</p>

	<ul>
		<li>
			الصنف <span style="font-family:courier new,courier,monospace;">Child</span> يرِث من الصنف <span style="font-family:courier new,courier,monospace;">Father</span>، الذي بدوره يرث الصنف <span style="font-family:courier new,courier,monospace;">Grandfather</span>؛ وهذا يُسمى الوراثة متعددة المستويات.
		</li>
		<li>
			الصنف الفرعي (subclass أي الصنف الذي يقوم بالوراثة) يمكنه الوصول إلى جميع الخاصيات غير الخاصة (private) للصنف الموروث (يسمى أيضًا superclass).
		</li>
		<li>
			يمكن للصنف الفرعي أن يستدعي دوال الصنف الموروث عبر استعمال الصيغة الآتية<span style="font-family:courier new,courier,monospace;"> parent::function_name()‎</span> (يمكن استعمالها لمستوى وراثة وحيد فقط، أي يمكن للصنف <span style="font-family:courier new,courier,monospace;">Child</span> أن يستعملها لاستدعاء دوال الصنف <span style="font-family:courier new,courier,monospace;">Father</span>، ويمكن للصنف <span style="font-family:courier new,courier,monospace;">Father</span> أن يستعملها للصنف <span style="font-family:courier new,courier,monospace;">Grandfather</span>؛ لكن لا يمكن أن يستعملها الصنف <span style="font-family:courier new,courier,monospace;">Child</span> لاستدعاء دوال الصنف <span style="font-family:courier new,courier,monospace;">Grandfather</span>.) أو الصيغة الآتية <span style="font-family:courier new,courier,monospace;">SuperClass_name:function_name()</span>‎ التي يمكن استعمالها لاستدعاء دوال الصنف <span style="font-family:courier new,courier,monospace;">Grandfather</span> من الصنف <span style="font-family:courier new,courier,monospace;">Child</span>.
		</li>
		<li>
			يمكن أن يُعدِّل الصنف الفرعي في دوال الصنف الأب، وذلك يُعرَف بإعادة التعريف (overriding).
		</li>
		<li>
			لا تدعم <a href="https://academy.hsoub.com/php/" rel="">لغة PHP</a> الوراثة المتعددة؛ أي لا يمكن للصنف أن يرث أكثر من صنف واحد.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-15">
	<h2 id="محددات-الوصول">
		محددات الوصول
	</h2>

	<p>
		لقد تطرقنا سابقًا إلى موضوع محددات الوصول بشكل مبسط، حان الوقت الآن لشرحها بالتفصيل. 
	</p>

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

	<ul>
		<li>
			<span style="font-family:courier new,courier,monospace;">public</span> (عام): ذاك المتغير أو الدالة يمكن الوصول إليه من داخل الصنف أو من خارجه
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">private</span> (خاص): لا يمكن الوصول إلى المتغير أو الدالة إلا من داخل الصنف نفسه
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">protected</span> (محمي): يسمح بالوصول إلى المتغير أو الدالة من الصنف نفسه والصنف المُشتَق منه فقط
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">final</span> (نهائي): هذه الدالة لا يمكن إسناد قيمة أخرى إليه أو تعريفها في الأصناف المُشتقَة (لا يمكن استخدام <span style="font-family:courier new,courier,monospace;">final</span> مع الخصائص/المُتغيّرات). 
		</li>
	</ul>

	<p>
		نستعمل عادةً المُحدِّد <span style="font-family:courier new,courier,monospace;">public</span> للخاصيات أو الدوال التي تريد الوصول إليها من خارج الصنف، أما <span style="font-family:courier new,courier,monospace;">private</span> فتستعمل للأجزاء الداخلية التي لا يلزم الوصول إليها من خارج الصنف، أما <span style="font-family:courier new,courier,monospace;">protected</span> فهي للخاصيات التي تستعمل في بنية الصنف (كما في <span style="font-family:courier new,courier,monospace;">private</span>) لكن من المقبول توريثها إلى أصنافٍ أخرى كي يعدلوها بما يلائم.
	</p>

	<p>
		فمثلًا، لو كنا نكتب صنفًا للاتصال بقاعدة البيانات، فسيكون مقبض الاتصال (connection handle) لقاعدة البيانات مخزنًا في متغير خاص، لأنه يستعمل داخل الصنف فقط، ولا يجب أن يكون متوفرًا لمستخدم هذا الصنف؛ أما عنوان الشبكة لمضيف خادوم قواعد البيانات، فهو خاص بالصنف، ولا يجب على المستخدم تعديله، لكن من المقبول تعديله من صنفٍ يرث هذا الصنف. أما الطلبيات التي تُجرى على قاعدة البيانات، فيجب أن تكون عامة، كي يستطيع مستخدم الصنف الوصول إليها.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="الدالة-البانية-والدالة-الهادمة">
		الدالة البانية والدالة الهادمة
	</h2>

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

	<p>
		تحمل هذه الدالة اسم ‎<span style="font-family:courier new,courier,monospace;">__construct</span>. 
	</p>

	<p>
		يجدر بالذكر أنَّ الدالة البانية للصنف الأب لا تستدعى تلقائيًا عند إنشاء كائن للصنف الابن، ويجب استدعاؤها يدويًا عبر <span style="font-family:courier new,courier,monospace;">parent::__construct()</span>‎ ضمن الدالة البانية للصنف الابن. لكن إن لم تُعرَّف دالة بانية للصنف الابن، فسيرث الدالة البانية للصنف الأب تلقائيًا. مثالٌ عليها سيوضح ما سبق:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_31"><span class="pun">&lt;?</span><span class="pln">php
</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">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="kwd">print</span><span class="pln"> </span><span class="str">"In BaseClass constructor\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">SubClass</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">function</span><span class="pln"> __construct</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">
       </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"In SubClass constructor\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">OtherSubClass</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="com">// سيرث هذا الصنف الدالة البانية للصنف الأب</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// ستنفذ الدالة البانية للصنف BaseClass</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">BaseClass</span><span class="pun">();</span><span class="pln">

</span><span class="com">// ستنفذ الدالة البانية للصنف BaseClass</span><span class="pln">
</span><span class="com">// وستنفذ الدالة البانية للصنف SubClass</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">SubClass</span><span class="pun">();</span><span class="pln">

</span><span class="com">// ستنفذ الدالة البانية للصنف BaseClass</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">OtherSubClass</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		أما الدالة الهادمة، فهي الدالة التي تُنفَّذ عندما لا يعود الكائن موجودًا، وتُعرَّف -كما الدالة البانية- بذكر اسمها ‎<span style="font-family:courier new,courier,monospace;">__destruct</span>، ولا تستدعى الدالة الهادمة للصنف الأب إن أُعيد تعريفها في الصنف الابن.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_33"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MyDestructableClass</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"> </span><span class="pun">{</span><span class="pln">
       </span><span class="kwd">print</span><span class="pln"> </span><span class="str">"In constructor\n"</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"> </span><span class="str">"MyDestructableClass"</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"> __destruct</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">"Destroying "</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"> </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">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyDestructableClass</span><span class="pun">();</span><span class="pln"> </span><span class="com">// الناتج: In constructor</span><span class="pln">
echo </span><span class="str">"We will destroy \$obj \n"</span><span class="pun">;</span><span class="pln">
unset</span><span class="pun">(</span><span class="pln">$obj</span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج: Destroying MyDestructableClass</span><span class="pln">
echo </span><span class="str">'$obj Destroyed'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		معرفة نوع الكائنات
	</h2>
</div>

<div id="wmd-preview-section-17">
	<p>
		لقد رأيت كيف أنَّ الوراثة هي أمرٌ مهمٌ في البرمجة الكائنية، ولكن قد تختلط عليك الكائنات، ولن تدري لأي صنفٍ تنتمي. يأتي الحل مع الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">instanceof</span> التي يمكن استعمالها كأحد المعاملات، فستُعيد TRUE إن كان الكائن المذكور اسمه على يسارها تابعًا لصنفٍ ما أو لصنفٍ مشتقٍ من الصنف المذكور على يمينها. على سبيل المثال:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_36"><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">SubClass</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">$obj </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">SubClass</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">$obj </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">BaseClass</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">}</span></pre>

	<p>
		ناتج العبارتان الشرطيتان السابقتان هو TRUE لأن ‎<span style="font-family:courier new,courier,monospace;">$obj</span> هو كائنٌ ينتمي إلى الصنف <span style="font-family:courier new,courier,monospace;">SubClass</span> (أول عبارة شرطية)، وينتمي إلى صنفٍ مشتقٍ من <span style="font-family:courier new,courier,monospace;">BaseClass</span> (العبارة الشرطية الثانية). 
	</p>

	<p>
		أما لو أردت أن تعلم إن كان الكائن ينتمي إلى صنفٍ مشتقٍ من الصنف المذكور، فاستعمل الدالة <span style="font-family:courier new,courier,monospace;">is_subclass_of()</span>‎، الذي تقبل وسيطين، أولهما هو الكائن الذي سنختبره، والثاني هو اسم الصنف الأب.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_38"><span class="pun">&lt;?</span><span class="pln">php
</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">class</span><span class="pln"> </span><span class="typ">SubClass</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">

$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SubClass</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">$obj </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">SubClass</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> echo </span><span class="str">'instanceof is TRUE'</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_subclass_of</span><span class="pun">(</span><span class="pln">$obj</span><span class="pun">,</span><span class="pln"> </span><span class="str">'SubClass'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> echo </span><span class="str">'is_subclass_of is TRUE'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		ستجد أن <span style="font-family:courier new,courier,monospace;">instanceof</span> في المثال السابق ستعطي TRUE، بينما ستعطي <span style="font-family:courier new,courier,monospace;">is_subclass_of()‎ </span>القيمة FALSE، لأن ‎<span style="font-family:courier new,courier,monospace;">$obj</span> ليس كائنًا لصنف مشتق من الصنف <span style="font-family:courier new,courier,monospace;">SubClass</span>، وإنما هو من الصنف <span style="font-family:courier new,courier,monospace;">SubClass</span> نفسه.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="تحديد-الصنف-في-معاملات-الدوال">
		تحديد الصنف في معاملات الدوال
	</h2>

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

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_40"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Numbers</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"> print_random</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo rand</span><span class="pun">(</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">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Chars</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> random </span><span class="pun">(</span><span class="typ">Numbers</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">-&gt;</span><span class="pln">print_random</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$char </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Chars</span><span class="pun">();</span><span class="pln">
random</span><span class="pun">(</span><span class="pln">$char</span><span class="pun">);</span><span class="pln"> </span><span class="com">// fatal error:  Argument 1 passed to random() must be an instance of Numbers</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		الدوال "السحرية"
	</h2>
</div>

<div id="wmd-preview-section-19">
	<p>
		عندما تشاهد دالةً يبدأ اسمها بشرطتين سفليتين، فاعلم أنها دالة سحرية (Magic function)، وهي متوفرة من PHP، وتحجز PHP جميع أسماء الدوال التي تبدأ بشرطتين سفليتين على أنها دالة سحرية، لذا يُنصَح بتجنب استعمال هذا النمط من التسمية لتلافي حدوث تضارب في المستقبل مع الدوال السحرية التي قد تعرفها الإصدارات الحديثة من PHP. 
	</p>

	<p>
		لقد رأينا سابقًا الدالتين البانية <span style="font-family:courier new,courier,monospace;">‎__construct()</span>‎ والهادمة ‎<span style="font-family:courier new,courier,monospace;">__destruct()‎</span>، وسنتحدث هنا عن الدوال <span style="font-family:courier new,courier,monospace;">‎__get()‎</span> و <span style="font-family:courier new,courier,monospace;">‎__set()</span>‎ و <span style="font-family:courier new,courier,monospace;">‎__call()‎</span> و ‎<span style="font-family:courier new,courier,monospace;">__toString()</span>‎. 
	</p>

	<p>
		تُعرَّف الدالتان <span style="font-family:courier new,courier,monospace;">‎__get()‎ </span>و <span style="font-family:courier new,courier,monospace;">‎__set()</span>‎ داخل الأصناف، تستعمل الدالة ‎<span style="font-family:courier new,courier,monospace;">__get()‎</span> عندما تحاول قراءة متغير غير مُعرَّف من متغيرات الصنف، وتُستعمَل الدالة<span style="font-family:courier new,courier,monospace;"> ‎__set()‎ </span>عند محاولة إسناد قيمة لمتغير غير موجود، انظر إلى المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_9"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MagicClass</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">'Magic'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> $age </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123</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">$var</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"getting: $var "</span><span class="pun">;</span><span class="pln">
        echo $this</span><span class="pun">-&gt;</span><span class="pln">$var</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">$var</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">
        echo </span><span class="str">"setting: $var to $value"</span><span class="pun">;</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">$var </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">
$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MagicClass</span><span class="pun">();</span><span class="pln">
echo $obj</span><span class="pun">-&gt;</span><span class="pln">name</span><span class="pun">;</span><span class="pln"> </span><span class="com">// الناتج: Magic</span><span class="pln">
$obj</span><span class="pun">-&gt;</span><span class="pln">age </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">
echo $obj</span><span class="pun">-&gt;</span><span class="pln">age</span><span class="pun">;</span><span class="pln"> </span><span class="com">// الناتج: getting: age 123</span><span class="pln">
echo $obj</span><span class="pun">-&gt;</span><span class="pln">last_name</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ستحاول الدالة __get الحصول على قيمة الخاصية last_name، لكنها غير موجودة، وسيظهر خطأ من مرتبة Notice لإشارة إلى ذلك.</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		قد نستفيد من الدالتين ‎<span style="font-family:courier new,courier,monospace;">__get()</span>‎ و ‎<span style="font-family:courier new,courier,monospace;">__set()‎</span> بإظهار رسالة خطأ عند محاولة الوصول إلى عناصر غير موجودة (أو لا يُمسَح لنا بالوصول إليها). 
	</p>

	<p>
		أما دالة <span style="font-family:courier new,courier,monospace;">‎__call()</span>‎ فغرضها مشابه لغرض<span style="font-family:courier new,courier,monospace;"> ‎__get()‎</span> إلا أنها تُستعمَل عند محاولة استدعاء دالة غير موجودة. 
	</p>

	<p>
		ستستدعى الدالة السحرية<span style="font-family:courier new,courier,monospace;"> ‎__toString()‎ </span>في حال تمت محاولة طباعة الكائن كسلسلة نصية. هذه الدالة بسيطة جدًا وتعمل كما يلي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_8435_7"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MagicClass</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"> __toString</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">"I'm Magical! :-)"</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">
$obj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MagicClass</span><span class="pun">();</span><span class="pln">
echo $obj</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		مصادر
	</h2>
</div>

<div id="wmd-preview-section-20">
	<ul>
		<li>
			مقالات <a href="http://www.findalltogether.com/tutorial/classes-in-php/" rel="external nofollow">Classes in PHP</a> و <a href="http://www.findalltogether.com/tutorial/inheritance-in-php/" rel="external nofollow">Inheritance in PHP</a> لصاحبها Harish Kumar.فص
		</li>
		<li>
			ل <a href="http://www.hackingwithphp.com/6/0/0/objects" rel="external nofollow">Objects</a> في كتاب Practical PHP Programming.
		</li>
		<li>
			فصل البرمجة غرضية التوجه في كتاب <a href="http://librebooks.org/learn-programming-with-php/" rel="external nofollow">تعلم البرمجة بلغة PHP</a>.
		</li>
		<li>
			صفحات <a href="http://php.net/manual/en/oop5.intro.php" rel="external nofollow">Introduction</a> و <a href="http://php.net/manual/en/language.oop5.basic.php" rel="external nofollow">The Basics</a> و <a href="http://php.net/manual/en/language.oop5.decon.php" rel="external nofollow">Constructors and Destructors</a> و <a href="http://php.net/manual/en/language.oop5.visibility.php" rel="external nofollow">Visibility</a> و <a href="http://php.net/manual/en/language.oop5.inheritance.php" rel="external nofollow">Object Inheritance</a> و <a href="http://php.net/manual/en/language.oop5.magic.php" rel="external nofollow">Magic Methods</a> و <a href="http://php.net/manual/en/language.oop5.typehinting.php" rel="external nofollow">Type Hinting</a> في <a href="http://php.net/manual/en/language.oop5.php" rel="external nofollow">دليل PHP</a> وغيرها.
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">316</guid><pubDate>Thu, 21 Apr 2016 08:11:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; (Functions) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-php-r295/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/functions-in-php.png.1c913499cb9cb45885c78ce81199cbf0.png" /></p>
<div id="wmd-preview-section-12">
	<p id="الدوال-في-php">
		عندما نكتب برنامجًا طويلًا جدًا، فإن الشيفرة ستوزَّع في عددٍ من الملفات والأصناف (classes) والدوال (functions)؛ الدوال هي مجموعة من التعليمات التي تنجز مُهمِّة معيّنة وهدفها ألا تكرر الشيفرات التي تكتبها؛ فمثلًا في نظام للاستيثاق، يكون هنالك دوال لتسجيل الدخول (login) والتسجيل (register) وتسجيل الخروج (logout).
	</p>

	<p style="text-align: center;">
		<img alt="functions-in-php.png.72ed56e8dd3aad246c6" class="ipsImage ipsImage_thumbnailed" data-fileid="14115" data-unique="lqc8r0nd9" src="https://academy.hsoub.com/uploads/monthly_2016_03/functions-in-php.png.72ed56e8dd3aad246c66fd171a10e251.png">
	</p>
</div>

<div id="wmd-preview-section-13">
	<h2 id="أبسط-أشكال-الدوال">
		أبسط أشكال الدوال
	</h2>

	<p>
		إن الشكل العام لأبسط دالة هو:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_8"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> function_name</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">?&gt;</span></pre>

	<p>
		وكما في المتغيرات، تستطيع إسناد أي اسم إلى الدالة (أعطينا الدالة في المثال السابق الاسم <span style="font-family:courier new,courier,monospace;">function_name</span>). تُكتَب الشيفرة التي ستنفذها الدالة عندما يتم استدعاؤها بين أقواس معقوفة ({})؛ نستطيع استدعاء الدالة عبر كتابة اسمها ويليه أقواس عادية () كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_10"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// يمكنك أن تستدعي الدالة هنا قبل تعريفها</span><span class="pln">

</span><span class="com">// تعريف دالة ذات الاسم say_hello</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="com">// كل ما تفعله هذه الدالة هو طباعة hello</span><span class="pln">
  echo </span><span class="str">"hello"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// استدعاء الدالة</span><span class="pln">
say_hello</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		الدوال ذات الوسائط
	</h2>
</div>

<div id="wmd-preview-section-14">
	<p>
		يمكننا تمرير المعلومات الإضافية (مثل اسم المستخدم وكلمة المرور) إلى الدوال باستخدام الوسائط (arguments)، وعلينا تعريف المعاملات (parameters). 
	</p>

	<p>
		<strong>ملاحظة</strong>: الوسائط هي البيانات التي نمررها إلى الدالة عندما نستدعيها، أما المعاملات فهي المتغيرات التي نُعرِّفها عندما نكتب الشيفرة الخاصة بالدالة.
	</p>

	<p>
		يمكننا أن نعتبر أن المعاملات هي حاويات والوسائط هي البيانات التي نضعها في تلك الحاويات.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_12"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// دالة تسجيل الدخول ذات وسيطين</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> login</span><span class="pun">(</span><span class="pln">$user</span><span class="pun">,</span><span class="pln"> $pass</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">"hello, username is $user and password is $pass"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// استدعاء الدالة</span><span class="pln">
login</span><span class="pun">(</span><span class="str">"user1"</span><span class="pun">,</span><span class="str">"UsEr!p@$$W0rD"</span><span class="pun">);</span><span class="pln">

</span><span class="com">// استدعاء الدالة مرةً أخرى</span><span class="pln">
login</span><span class="pun">(</span><span class="str">"user2"</span><span class="pun">,</span><span class="str">"simplepassword"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		المعاملات ذوات القيم الافتراضية
	</h2>
</div>

<div id="wmd-preview-section-15">
	<p>
		يمكننا أن نعطي قيمًا افتراضية للمعاملات لكي يمكن تجاوز تحديد قيمتها عند استدعاء الدالة.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_14"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// دالة تسجيل الدخول ذات ثلاثة وسائط</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> login</span><span class="pun">(</span><span class="pln">$user</span><span class="pun">,</span><span class="pln"> $pass</span><span class="pun">,</span><span class="pln"> $active </span><span class="pun">=</span><span class="pln"> </span><span class="str">"not active"</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">"hello, username is $user and password is $pass and user is $active"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// استدعاء الدالة</span><span class="pln">
login</span><span class="pun">(</span><span class="str">'user1'</span><span class="pun">,</span><span class="str">'UsEr!p@$$W0rD'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// استدعاء الدالة مرةً أخرى</span><span class="pln">
login</span><span class="pun">(</span><span class="str">'user2'</span><span class="pun">,</span><span class="str">'simplepassword'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'active'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		<strong>ملاحظة</strong>: إن أردت ألّا تُحدِّد قيمةً لوسيطٍ ما عند استدعاء الدالة، فيجب أن يكون المعامل الموافق لذاك الوسيط في آخر القائمة كما في المثال السابق. ويملك المعامل افتراضيًا القيمة "null".
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="الدوال-ذات-المعاملات-متغيرة-العدد">
		الدوال ذات المعاملات متغيرة العدد
	</h2>

	<p>
		يمكن أن تملك الدوال عددًا متغيرًا من المعاملات؛ وفي الواقع، تستطيع تمرير إي عدد من الوسائط إلى دالة؛ استعمل الدوال المُضمَّنة في <a href="https://academy.hsoub.com/php/" rel="">PHP </a>الآتية للوصول إلى تلك الوسائط: 
	</p>

	<ul>
		<li>
			الدالة <span style="font-family:courier new,courier,monospace;">func_get_args()‎</span>: تُعيد مصفوفة بجميع الوسائط المُمرَّرة 
		</li>
		<li>
			الدالة <span style="font-family:courier new,courier,monospace;">func_num_args()‎</span>: تُعيد العدد الإجمالي للوسائط المُمرَّرة.
		</li>
		<li>
			الدالة <span style="font-family:courier new,courier,monospace;">func_get_arg(argument_number)‎</span>: تُعيد المتغير ذو الرقم <span style="font-family:courier new,courier,monospace;">argument_number </span>
		</li>
	</ul>

	<p>
		سنظهِر -في المثال الآتي- مجموع الأرقام المُمرَّرة إلى الدالة كوسائط بالإضافة إلى عرضها.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_16"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">function</span><span class="pln"> sum</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">// سنستعمل func_get_args() للحصول على كل المعاملات على شكل مصفوفة</span><span class="pln">
  $ary </span><span class="pun">=</span><span class="pln"> func_get_args</span><span class="pun">();</span><span class="pln">
  print_r</span><span class="pun">(</span><span class="pln">$ary</span><span class="pun">);</span><span class="pln">
  echo </span><span class="str">"&lt;br&gt;"</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="com">// سنستعمل func_num_args للحصول على العدد الكلي للمعاملات</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"> func_num_args</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">// سنستعمل func_get_arg(index) للحصول على قيمة معامل معيّن</span><span class="pln">
    echo func_get_arg</span><span class="pun">(</span><span class="pln">$i</span><span class="pun">).</span><span class="str">'&lt;br&gt;'</span><span class="pun">;</span><span class="pln">
    $sum</span><span class="pun">+=</span><span class="pln"> func_get_arg</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">"sum is $sum &lt;br&gt;&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

sum</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="pln">
sum</span><span class="pun">(</span><span class="lit">23</span><span class="pun">,</span><span class="lit">2343</span><span class="pun">,</span><span class="lit">54</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">6</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		ناتج تنفيذ السكربت السابق هو:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2332_18"><span class="pln">Array ( [0] =&gt; 1 [1] =&gt; 2 [2] =&gt; 3 [3] =&gt; 4 ) 
1
2
3
4
sum is 10 

Array ( [0] =&gt; 23 [1] =&gt; 2343 [2] =&gt; 54 [3] =&gt; 2 [4] =&gt; 1 [5] =&gt; 6 ) 
23
2343
54
2
1
6
sum is 2429</span></pre>

	<h2>
		إعادة القيم من الدوال
	</h2>
</div>

<div id="wmd-preview-section-17">
	<p>
		لاحظ أننا في المثال السابق طبعنا السلسلة النصية مباشرةً، لكن ماذا لو أردنا أن نجعل الدالة تُعيد قيمةً ما؟ نستعمل العبارة البرمجية <span style="font-family:courier new,courier,monospace;">return</span> لإعادة قيمة من الدالة، وتُسبِّب هذه العبارة بإنهاء تنفيذ الدالة مباشرةً وإعادة القيمة إلى مكان استدعاء الدالة، لنرى مثالًا عن دالة تُعيد مربَّع العدد المُمرَّر إليها:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_20"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> square </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"> $num </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="com">// الناتج هو 16</span><span class="pln">
echo square </span><span class="pun">(</span><span class="lit">4</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_2332_22"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> powers </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"> array </span><span class="pun">(</span><span class="pln">$num</span><span class="pun">,</span><span class="pln"> $num </span><span class="pun">*</span><span class="pln"> $num</span><span class="pun">,</span><span class="pln"> $num </span><span class="pun">*</span><span class="pln"> $num </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="com">// الناتج هو: Array ( [0] =&gt; 4 [1] =&gt; 16 [2] =&gt; 64 )</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">powers </span><span class="pun">(</span><span class="lit">4</span><span class="pun">));</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		مجالات تعريف الدوال
	</h2>
</div>

<div id="wmd-preview-section-18">
	<p>
		تستطيع أن تستدعي الدوال المُعرَّفة في الأمثلة السابقة قبل مكان تعريفها، لأن مجالها (scope) هو المجال العام، يجدر بالذكر أنَّك تستطيع تعريف الدوال داخل جملة شرطية (if) لكن لا يمكنك استدعاؤها إن لم يتحقق الشرط كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_24"><span class="pun">&lt;?</span><span class="pln">php
$str </span><span class="pun">=</span><span class="pln"> </span><span class="str">'create the function'</span><span class="pun">;</span><span class="pln">
global_function</span><span class="pun">();</span><span class="pln">

</span><span class="com">// لا يمكننا استدعاء الدالة not_global هاهنا، لأن المفسر لا يعتبرها موجودةً إن لم تتحقق الجملة الشرطية الآتية</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$str </span><span class="pun">==</span><span class="pln"> </span><span class="str">'create the function'</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"> not_global</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'I don\'t exist until program execution reaches me'</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">// نستطيع الآن استدعاء الدالة not_global بعد اختبار أن السلسلة $str مساوية للقيمة اعلاه، لتجنب إظهار خطأ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$str </span><span class="pun">==</span><span class="pln"> </span><span class="str">'create the function'</span><span class="pun">)</span><span class="pln"> not_global</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> global_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'I exist immediately upon program 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>
		الأمر سيان لآلية تعريف دالة داخل دالة أخرى:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_26"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> global_function</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"> not_global</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'I don\'t exist until global_function() is called'</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">// لا يمكننا استدعاء not_global هنا، إذ علينا استدعاء global_function أولًا</span><span class="pln">
global_function</span><span class="pun">();</span><span class="pln">

</span><span class="com">// نستطيع الآن استدعاء الدالة not_global، لأن استدعاء global_function قد جعلها متاحةً للمفسر</span><span class="pln">
not_global</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		المتغيرات في الدوال
	</h2>
</div>

<div id="wmd-preview-section-19">
	<p>
		مجال المتغيرات (variable scope) هو "المجال" الذي يبقى فيه المتغير مُعرَّفًا، أي بكلامٍ آخر، المتغيرات المُعرَّفة داخل الدوال لا يمكن الوصول إليها من خارج تلك الدوال؛ أما المتغيرات المُعرَّفة في المجال العام (global scope) يمكن الوصول إليها من أي جزء من البرنامج في المجال العام؛ ربما أربكك الشرح السابق لكن انظر إلى هذا المثال للتوضيح:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_28"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// المتغير $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="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo $a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// لا يمكن الوصول إلى المتغير $a لأنه في المجال العام</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// لن يظهر أي شيء ﻷن المتغير $a ليس ضمن مجال الدالة</span><span class="pln">
test</span><span class="pun">();</span><span class="pln">

</span><span class="com">// سيظهر الرقم 1، لأن المجال هو العام</span><span class="pln">
echo $a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		لن تظهر مخرجات عند استدعاء الدالة <span style="font-family:courier new,courier,monospace;">test()</span>‎ لأن الدالة <span style="font-family:courier new,courier,monospace;">echo</span> داخلها تُشير إلى نسخة محلية من المتغير <span style="font-family:courier new,courier,monospace;">‎$a </span>التي لم تُسنَد لها قيمة في ذاك المجال. يمكن الوصول إلى المتغيرات في المجال العام من داخل الدوال باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">global</span> كما يلي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_30"><span class="pun">&lt;?</span><span class="pln">php

$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">2</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="pln">
  </span><span class="com">// أصبح بإمكاننا الوصول إلى المتغيرين في مجال الدالة الخاص، وتعديل قيمتهما مباشرةً</span><span class="pln">
  </span><span class="kwd">global</span><span class="pln"> $a</span><span class="pun">,</span><span class="pln">  $b</span><span class="pun">;</span><span class="pln">
  $b </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">

sum</span><span class="pun">();</span><span class="pln">
echo $b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		نوعٌ أخيرٌ هو المتغيرات الثابتة (static variables) التي يُسمَح بوجودها في مجال الدوال الخاص فقط، لكنها لا تفقد قيمتها عند انتهاء تنفيذ الدالة، انظر إلى المثال الآتي لتوضيح الأمور:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_32"><span class="pun">&lt;?</span><span class="pln">php
</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">
  $a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  echo $a</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">
</span><span class="pun">?&gt;</span></pre>

	<p>
		الدالة السابقة عديمة الفائدة لأنها في كل مرة تُستدعى فيها ستضبط قيمة المتغير <span style="font-family:courier new,courier,monospace;">‎$a</span> إلى 0، ثم ستُظهِر قيمة ذاك المتغير (التي هي صفر)، وأخيرًا لن نستفيد من زيادة قيمة المتغير (<span style="font-family:courier new,courier,monospace;">‎$a++</span>‎) لانتهاء تنفيذ الدالة ولن يعود المتغير <span style="font-family:courier new,courier,monospace;">‎$a </span>موجودًا. أما لو عرَّفنا المتغير ‎<span style="font-family:courier new,courier,monospace;">$a</span> على أنه ثابت، فلن يفقد قيمته بعد انتهاء تنفيذ الدالة:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_34"><span class="pun">&lt;?</span><span class="pln">php
</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="kwd">static</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">
  echo $a</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">
</span><span class="pun">?&gt;</span></pre>

	<p>
		ستتم تهيئة المتغير <span style="font-family:courier new,courier,monospace;">‎$a</span> في أول مرة تُستدعى فيها الدالة، وستُطبَع قيمة المتغير وستزداد قيمته في كل مرة تستدعى فيها الدالة مرةً أخرى.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_36"><span class="pun">&lt;?</span><span class="pln">php

</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="kwd">static</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">
  echo $a</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">

</span><span class="com">//الناتج 0</span><span class="pln">
test</span><span class="pun">();</span><span class="pln">

</span><span class="com">//الناتج 1</span><span class="pln">
test</span><span class="pun">();</span><span class="pln">

</span><span class="com">//الناتج 2</span><span class="pln">
test</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<blockquote>
		<p>
			<strong>ملاحظة</strong>: يجب إسناد قيم بسيطة إلى المتغيرات الثابتة عند تعريفها، إذ لا يجوز استعمال التعابير الرياضية أو إسناد القيم المُعادة من الدوال <br>
			إليها.
		</p>
	</blockquote>
</div>

<div id="wmd-preview-section-20">
	<h2 id="المعاملات-المرجعية">
		المعاملات المرجعية
	</h2>

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

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_38"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">function</span><span class="pln"> test</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="com">// لاحظ عدم استعمال عبارة return هنا</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">
test</span><span class="pun">(</span><span class="pln">$a</span><span class="pun">);</span><span class="pln">
echo $a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// الناتج هو 6</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		الاختلاف الوحيد الذي يجعل الوسائط تُمرَّر بمرجعيتها هو وضع محرف «&amp;» قبل اسم الوسيط عند تعريف الدالة.
	</p>
</div>

<div id="wmd-preview-section-21">
	<h2 id="الدوال-المجهولة">
		الدوال المجهولة
	</h2>

	<p>
		الدوال المجهولة (anonymous functions) التي تُعرَف أيضًا بالمصطلح "closures" تسمح بإنشاء دالة ليس لها اسم محدد، وإنما تُسند مباشرةً إلى متغير مَثَلُها كَمَثَلِ أيّةِ عملية إسنادٍ أخرى، وتنتهي عملية الإسناد أيضًا بفاصلة منقوطة؛ هذا مثالٌ عنها:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_40"><span class="pun">&lt;?</span><span class="pln">php

$square </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">$num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo $num </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">

$square</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج 4</span><span class="pln">
$square</span><span class="pun">(</span><span class="lit">15</span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج 225</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		نستطيع أن نُمرِّر إلى الدوال المجهولة أي متغير موجود في مجال المتغيرات الأعلى منها وذلك باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">use</span>، تأمّل في المثال الآتي وفي تعليقاته:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2332_42"><span class="pun">&lt;?</span><span class="pln">php
$message </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">// لم نستعمل الكلمة المفتاحية use هنا</span><span class="pln">
$example </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 $message</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
$example</span><span class="pun">();</span><span class="pln"> </span><span class="com">// لن تَظهَر أيّة قيمة (أو بالتحديد، سيظهر خطأ Notice ﻷن المتغير غير مُعرَّف)</span><span class="pln">

</span><span class="com">// تمرير المتغير $message</span><span class="pln">
$example </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="kwd">use</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">
    echo $message</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
$example</span><span class="pun">();</span><span class="pln"> </span><span class="com">// الناتج: hello</span><span class="pln">

</span><span class="com">// القيمة المُمرّرة تؤخذ قبل تعريف الدالة، وليس قبل استدعائها</span><span class="pln">
$message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'world'</span><span class="pun">;</span><span class="pln">
$example</span><span class="pun">();</span><span class="pln"> </span><span class="com">// الناتج: hello</span><span class="pln">

</span><span class="com">// إعادة قيمة المتغير إلى قيمته الأصلية</span><span class="pln">
$message </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">// الوراثة بالمرجعية (inherit by-reference)</span><span class="pln">
$example </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="kwd">use</span><span class="pln"> </span><span class="pun">(&amp;</span><span class="pln">$message</span><span class="pun">)</span><span class="pln"> </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">
$example</span><span class="pun">();</span><span class="pln"> </span><span class="com">// الناتج: hello</span><span class="pln">

</span><span class="com">// إذا تغيرت قيمة المتغير الآن، فستتأثر الدالة المجهولة بها</span><span class="pln">
$message </span><span class="pun">=</span><span class="pln"> </span><span class="str">'world'</span><span class="pun">;</span><span class="pln">
$example</span><span class="pun">();</span><span class="pln"> </span><span class="com">// الناتج: world</span><span class="pln">

</span><span class="com">// استعمال الوسائط العادية</span><span class="pln">
$example </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">$arg</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">$message</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo $arg </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">
$example</span><span class="pun">(</span><span class="str">"hello"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج: hello world</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		تمرين
	</h2>
</div>

<div id="wmd-preview-section-22">
	<p>
		اكتب دالةً تقبل وسيطين أولهما هو طول المستطيل والآخر هو عرض المستطيل، وستعيد هذه الدالة أربع قيم تُمثِّل إحداثيات نقاط التقاء أضلاعه على فرض أنَّ مركزه يقع على مبدأ الإحداثيات.
	</p>
</div>

<div id="wmd-preview-section-23">
	<h2 id="المصادر">
		المصادر
	</h2>

	<ul>
		<li>
			مقال <a href="http://www.findalltogether.com/tutorial/functions-in-php/" rel="external nofollow">Functions in php</a> لصاحبه Harish Kumar.
		</li>
		<li>
			مقالتي <a href="http://daylerees.com/php-pandas-functions/" rel="external nofollow">Functions</a> و <a href="http://daylerees.com/php-pandas-closures/" rel="external nofollow">Closures</a> لصاحبهما Dayle Rees.
		</li>
		<li>
			صفحات <a href="http://php.net/manual/en/language.functions.php" rel="external nofollow">Functions</a> و <a href="http://php.net/manual/en/functions.anonymous.php" rel="external nofollow">Anonymous functions</a> و <a href="http://php.net/manual/en/functions.user-defined.php" rel="external nofollow">User-defined functions</a> في دليل php وغيرها.
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">295</guid><pubDate>Wed, 16 Mar 2016 22:27:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; (Arrays) &#x648;&#x62D;&#x644;&#x642;&#x629; foreach &#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%88%D8%AD%D9%84%D9%82%D8%A9-foreach-%D9%81%D9%8A-php-r294/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/arrays-in-php.png.8f0a102e57a72b6fe70480f3ae9a44bd.png" /></p>

<div id="wmd-preview-section-9">
	<p id="المصفوفات-وحلقة-foreach-في-php">
		سنعلم في هذا الدرس عن المصفوفات وحلقة foreach.
	</p>

	<p style="text-align: center;">
		<img alt="arrays-in-php.png.804f45254f7db5324b6a44" class="ipsImage ipsImage_thumbnailed" data-fileid="14088" data-unique="0v0otiuzc" src="https://academy.hsoub.com/uploads/monthly_2016_03/arrays-in-php.png.804f45254f7db5324b6a44f4542747c6.png"></p>

	<p>
		لنفترض أنَّك تريد أن تُخزِّن مقدارًا كبيرًا من البيانات؛ أول 10000 من مضاعفات الرقم 5 على سبيل المثال، فعليك أنَّ تُعرِّف 10000 متغير لهم 10000 اسم؛ وهذه مهمة صعبة ومضنية بالتأكيد. أحد الحلول هو تخزين البيانات في مصفوفة، إذ يمكننا تخزين أي عدد نريده من القيم في مصفوفة وحيدة فقط! لنلقِ نظرةً عن آلية عمل المصفوفات.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_11">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// تعريف مصفوفة ذات ثلاثة عناصر</span><span class="pln">
$type1 </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'first element'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'second element'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'third element'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// نستعمل الدالة print_r لطباعة جميع عناصر المصفوفة</span><span class="pln">
</span><span class="com">// الناتج: Array ( [0] =&gt; first element [1] =&gt; second element [2] =&gt; third element ) </span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$type1</span><span class="pun">);</span><span class="pln">
    echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// نستعمل المفاتيح (الفهارس) للوصول إلى قيم معيّنة في المصفوفة</span><span class="pln">
</span><span class="com">// لاحظ أنَّ المفاتيح رقمية من 0 حتى 2</span><span class="pln">
echo $type1</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
echo $type1</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
echo $type1</span><span class="pun">[</span><span class="lit">2</span><span class="pun">];</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<ul><li>
			في السطر الثالث من الشيفرة السابقة، عرَّفنا مصفوفةً اسمها ‎ <span style="font-family:courier new,courier,monospace;">$type1</span>وملأناها بثلاث قيم (first element، و second element، و third element).
		</li>
		<li>
			كيف يمكننا استعمالها الآن؟ كل قيمة من القيم المُخزَّنة في المصفوفة مرتبطة بمُعرِّف فريد يسمى الفهرس (index)؛ يمكنك الوصول إلى تلك القيم عبر الفهرس الخاص بها.
		</li>
		<li>
			يطبع السطر السابع في المثال السابق المصفوفة بأكملها باستعمال الدالة<span style="font-family:courier new,courier,monospace;"> print_r()‎</span>، وسترى أنَّه على الرغم من أنَّك قد ملأت القيم فقط، لكنك ستحصل أيضًا على أرقامٍ تبدأ من الصفر وترتبط بتلك القيم؛ وفي الواقع، تلك الأرقام هي الرقم التسلسلي للقيمة (تذكر أننا نبدأ العد في البرمجة من الرقم 0 بدلًا من 1).
		</li>
		<li>
			ثم قمنا بطباعة القيم التي خزناها في الموضع 0 و 1 و 2 على التوالي وبالترتيب.
		</li>
	</ul></div>

<div id="wmd-preview-section-10">
	<h2 id="المصفوفات-الترابطية">
		المصفوفات الترابطية
	</h2>

	<p>
		استخدمنا الفهارس الافتراضية في المثال السابق (0، و 1، و2)، لكن يمكننا أن نُعرِّف الفهارس يدويًا كما في المثال الآتي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_13">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// طريقةٌ أخرى لتعريف مصفوفة</span><span class="pln">
$type2 </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'key'</span><span class="pun">=&gt;</span><span class="str">'value'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'key2'</span><span class="pun">=&gt;</span><span class="str">'value2'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'key3'</span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'value3'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج: Array ( [key] =&gt; value [key2] =&gt; value2 [key3] =&gt; value3 )</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$type2</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// المفاتيح هنا نصيّة، وهي key1، و key2، و key3</span><span class="pln">
echo $type2</span><span class="pun">[</span><span class="str">'key3'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		عرَّفنا في المثال السابق الفهارس الخاصة بنا (تُسمى أيضًا المفاتيح [keys]) التي ترتبط مع تلك القيم. يسمى هذا النوع من المصفوفات بالمصفوفات ترابطية (associative arrays).
	</p>
</div>

<div id="wmd-preview-section-11">
	<h2 id="الوصول-إلى-عناصر-المصفوفات">
		الوصول إلى عناصر المصفوفات
	</h2>

	<p>
		تُعتبَر كل قيمة في المصفوفة متغيرًا مستقلًا، فيمكننا أن نجري جميع العمليات التي يمكن القيام بها على المتغيرات (كالزيادة والنقصان وإسناد القيم …إلخ.):
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_15">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// نعرِّف مصفوفةً فارغةً</span><span class="pln">
$arr </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">
$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">'academy'</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">'hsoub'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// قد لا تكون المفاتيح ذات أرقام متتالية (لاحظ عدم وجود المفتاحين 2 و 3)</span><span class="pln">
$arr</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="str">'com'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// يمكننا استعمال نمطي المفاتيح (الرقمية والنصية) في نفس المصفوفة</span><span class="pln">
$arr</span><span class="pun">[</span><span class="str">'day'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Monday'</span><span class="pun">;</span><span class="pln">
$arr</span><span class="pun">[</span><span class="str">'num1'</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">
$arr</span><span class="pun">[</span><span class="str">'num2'</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">

</span><span class="com">// كل عنصر في المصفوفة مستقل تمامًا عما سواه</span><span class="pln">
$arr</span><span class="pun">[</span><span class="str">'num3'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $arr</span><span class="pun">[</span><span class="str">'num1'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> $arr</span><span class="pun">[</span><span class="str">'num2'</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">$arr</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		لاحظ كيف أننا عرفنا بدايةً مصفوفةً فارغة، ثم أضفنا عناصرها بذكر المتغير الحاوي على مصفوفة متبوعًا بأقواسٍ مربعة ([]) بداخلها مفتاح العنصر. يجدر بالذكر أننا نستطيع أن نستعمل مفاتيح رقمية ونصية في نفس المصفوفة. 
	</p>

	<p>
		إذا أردنا أن نجعل PHP تُرقِّم عناصر المصفوفة تلقائيًا عند إسناد قيم لها، فيكفي أن نضع أقواسًا مربعة فارغة كما يلي:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_17">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// نعرِّف مصفوفةً فارغةً</span><span class="pln">
$arr </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// يمكننا جعل PHP تُرقِّم العناصر تلقائيًا كما يلي</span><span class="pln">
$arr</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'academy'</span><span class="pun">;</span><span class="pln">
$arr</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hsoub'</span><span class="pun">;</span><span class="pln">
$arr</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'com'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سنطبع كامل المصفوفة باستعمال print_r</span><span class="pln">
</span><span class="com">// الناتج: Array ( [0] =&gt; academy [1] =&gt; hsoub [2] =&gt; com )</span><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="pun">?&gt;</span></pre>

	<p>
		يجدر بالذكر أننا نستطيع أن ندرج قيمة عنصر من عناصر المصفوفة في سلسلةٍ نصيةٍ مباشرةً كما في المتغيرات (أي يجب أن تكون علامة الاقتباس مزدوجةً) لكن علينا في المصفوفات أن نحيط اسم العنصر بقوسين معقوفين كما يلي (لاحظ أننا استعملنا الطريقة الأكثر شيوعًا الآن في تعريف المصفوفات، ألا وهي إحاطة عناصر المصفوفة بقوسين مربعين [] كما يظهر في المثال أدناه): 
	</p>
</div>

<div id="wmd-preview-section-12">
	<h2 id="المصفوفات-والحلقات">
		المصفوفات والحلقات
	</h2>

	<p>
		لنفترض أننا نريد إجراء بعض العمليات على كمية كبيرة من البيانات مخزَّنة في مصفوفة (ولنقل أننا نريد طباعة البيانات، أو حساب مجموع الأرقام الموجودة في المصفوفة)؛ فسنستعمل لهذا الغرض الحلقات، لنلقِ نظرةً على مثالٍ عن حلقة <span style="font-family:courier new,courier,monospace;">for</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_19">
<span class="pun">&lt;?</span><span class="pln">php
$a </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">21</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">43</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</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">4</span><span class="pun">];</span><span class="pln">
</span><span class="com">// عناصر المصفوفة هي: $a[0], $a[1], $a[2]...</span><span class="pln">

</span><span class="com">// سنُهيِّئ متغيرًا للمجموع ونسند إليه القيمة 0</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">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"> </span><span class="lit">7</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">// ستزداد قيمة المتغير $i في كل تكرار للحلقة</span><span class="pln">
  </span><span class="com">// أي أن قيمته ستتغير إلى قيمة مفتاح العنصر التالي في المصفوفة</span><span class="pln">
  $sum </span><span class="pun">+=</span><span class="pln"> $a</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 $sum</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		أنصحك بأن تُعيد حلّ المثال السابق باستعمال حلقتَيّ <span style="font-family:courier new,courier,monospace;">while</span> و <span style="font-family:courier new,courier,monospace;">do-while</span><span style="font-family:courier new,courier,monospace;"> </span>من <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-loops-%D9%81%D9%8A-php-r278/">درس الحلقات</a><span style="font-family:courier new,courier,monospace;"> </span>لكي تتدرب على استعمالها. 
	</p>

	<p>
		هنالك حلقةٌ إضافيةٌ في PHP وُضِعَت خصيصًا للمصفوفات، اسمها حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>. إذ تبدأ هذه الحلقة من أول عنصر في المصفوفة وتنتهي بآخر عنصر فيها. لنعد كتابة المثال السابق باستخدام حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_22">
<span class="pun">&lt;?</span><span class="pln">php
$a </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">21</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">43</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</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">4</span><span class="pun">];</span><span class="pln">
</span><span class="com">// عناصر المصفوفة هي: $a[0], $a[1], $a[2]...</span><span class="pln">

</span><span class="com">// سنُهيِّئ متغيرًا للمجموع ونسند إليه القيمة 0</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">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a </span><span class="kwd">as</span><span class="pln"> $v</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">// $v = $a[$i];</span><span class="pln">
  </span><span class="com">// $sum += $v;</span><span class="pln">
  </span><span class="com">// i++;</span><span class="pln">
  $sum </span><span class="pun">+=</span><span class="pln"> $v</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="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		نُسنِد -في كل تكرار للحلقة- قيمةً جديدةً للمتغير الذي اسمه ‎$v ونعطيه قيمة العنصر التالي في المصفوفة ‎<span style="font-family:courier new,courier,monospace;">$a</span>؛ حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> مفيدة جدًا عندما لا تعرف عدد العناصر الموجودة في المصفوفة، أو إذا كنت تستعمل مصفوفة ترابطية (associative arrays).
	</p>
</div>

<div id="wmd-preview-section-13">
	<h3 id="حلقة-foreach-مع-المصفوفات-الترابطية">
		حلقة foreach مع المصفوفات الترابطية
	</h3>

	<p>
		أما في حالة المصفوفات الترابطية، فعلينا تعريف متغيرين (بدلًا من واحد) لأننا لا نعلم قيمة الفهرس (أو المفتاح [key]) لكل عنصر. أول متغير نُعرِّفه هو المفتاح، والثاني هو القيمة التي ترتبط به. الشكل العام لحلقة <span style="font-family:courier new,courier,monospace;">foreach </span>هو:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_24">
<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">
  statements
</span><span class="pun">}</span></pre>

	<p>
		تمعّن في المثال الآتي وانظر كيف أُسنِد المفتاح إلى متغير، وأُسنِدَت قيمته إلى متغيرٍ آخر؛ يجدر بالذكر أنَّ المصفوفة المستعملة هي مصفوفة متعددة الأبعاد، أي أنَّ قيمة العنصر هي بدورها مصفوفةٌ أخرى، ولا مانع من استعمال حلقة <span style="font-family:georgia,serif;">foreach</span> داخل حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> أخرى إن دعت الضرورة إلى ذلك.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_26">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="com">// نُعرِّف مصفوفة ذات بعدين</span><span class="pln">
$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">'student1'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'SN'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">16472</span><span class="pun">,</span><span class="pln"> </span><span class="str">'math_grade'</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="str">'student2'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'SN'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">16483</span><span class="pun">,</span><span class="pln"> </span><span class="str">'math_grade'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'C'</span><span class="pun">),</span><span class="pln">
  </span><span class="str">'student3'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'SN'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">16587</span><span class="pun">,</span><span class="pln"> </span><span class="str">'math_grade'</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="pun">];</span><span class="pln">

</span><span class="com">// حلقة foreach تمر على جميع عناصر المصفوفة الرئيسية</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"> $student </span><span class="pun">=&gt;</span><span class="pln"> $info</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لاحظ كيف أنَّ القيمة المُنسدَة إلى المتغير $info هي مصفوفة أخرى</span><span class="pln">
  echo </span><span class="str">"the serial number for $student is {$info['SN']}, and he got {$info['math_grade']} grade in math!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<h2>
		دوال التعامل مع المصفوفات
	</h2>
</div>

<div id="wmd-preview-section-14">
	<p>
		ألم تتساءل كيف سنعلم إن كانت المصفوفة تحتوي عنصرًا ما أم لا؟ ربما فكرت باستعمال حلقةٍ ما للمرور على جميع عناصر المصفوفة، لكن PHP تسهِّل عليك الأمر وتوفر لك دالةً لاختبار وجود عنصرٍ ما في المصفوفة ألا وهي الدالة<span style="font-family:courier new,courier,monospace;">in_array()</span> ‎ التي تقبل وسيطين أولهما هو القيمة التي سيُبحَث عنها، وثانيهما هي المصفوفة التي سيُبحَث فيها؛ وستعيد هذه الدالة القيمة TRUE إن وجِدَت تلك القيمة في المصفوفة، و FALSE خلا ذلك. 
	</p>

	<p>
		أما لو أردت معرفة إن كان مفتاحٌ ما موجودًا في المصفوفة، فاستعمل الدالة<span style="font-family:courier new,courier,monospace;">array_key_exists()</span> ‎ التي تقبل وسيطين أيضًا أولهما هو المفتاح الذي يُبحَث عنه، وثانيهما هو المصفوفة التي سيُبحَث فيها؛ وستعيد هذه الدالة TRUE إن وجد ذاك المفتاح، و FALSE عدا ذلك. مثالٌ عن استعمالهما:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_28">
<span class="pun">&lt;?</span><span class="pln">php
$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'subdomain'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'academy'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'domain'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'hsoub'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'root_domain'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'com'</span><span class="pun">];</span><span class="pln">

</span><span class="com">// التحقق إن كانت القيمة «hsoub» موجودةً في المصفوفة</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">in_array</span><span class="pun">(</span><span class="str">'hsoub'</span><span class="pun">,</span><span class="pln"> $arr</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'"hsoub" value found'</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">array_key_exists</span><span class="pun">(</span><span class="str">'subdomain'</span><span class="pun">,</span><span class="pln"> $arr</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'"subdomain" key found'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		هل تتذكر كيف قسّمنا السلاسل النصية إلى قسمين يفصل بينهما محرف معيّن في <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-strings-%D9%81%D9%8A-php-%E2%80%93-%D8%A7%D9%84%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r279/">درس السلاسل النصية</a> وحصلنا على الجزء الواقع بعد ذاك المحرف؟ الدالة<span style="font-family:courier new,courier,monospace;"> explode()‎ </span>تفعل المِثل، لكنها تُخزِّن الناتج في مصفوفة، حيث تقبل وسيطين أولهما هو السلسلة النصية التي تُمثِّل الفاصل بين عناصر المصفوفة، وثانيهما هو السلسلة النصية التي تريد تقسيمها؛ انظر إلى ناتج المثال الآتي لإزالة الغموض عن الكلام السابق:
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_31">
<span class="pun">&lt;?</span><span class="pln">php
$str </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hsoub academy is the best academy ever'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سنقسم السلسلة النصية السابقة عند كلمة is، ثم سنطبع مخرجاتها</span><span class="pln">
$arr1 </span><span class="pun">=</span><span class="pln"> explode</span><span class="pun">(</span><span class="str">'is'</span><span class="pun">,</span><span class="pln"> $str</span><span class="pun">);</span><span class="pln">
</span><span class="com">// الناتج: Array ( [0] =&gt; hsoub academy [1] =&gt; the best academy ever ) </span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$arr1</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سنقسم السلسلة النصية السابقة عند كلمة academy، مما يُنتِج ثلاثة عناصر في المصفوفة</span><span class="pln">
$arr2 </span><span class="pun">=</span><span class="pln"> explode</span><span class="pun">(</span><span class="str">'academy'</span><span class="pun">,</span><span class="pln"> $str</span><span class="pun">);</span><span class="pln">
</span><span class="com">// الناتج: Array ( [0] =&gt; hsoub [1] =&gt; is the best [2] =&gt; ever )</span><span class="pln">
print_r</span><span class="pun">(</span><span class="pln">$arr2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		أما لو أردت دمج عناصر المصفوفة وتحويلها إلى سلسلة نصية، فاستعمل الدالة<span style="font-family:courier new,courier,monospace;"> implode()‎</span>؛ التي لها شكلان عامان أحدهما يقبل وسيطًا وحيدًا هو المصفوفة التي تريد تحويلها إلى سلسلة نصية؛ والشكل الثاني يقبل وسيطين أولهما هو السلسلة النصية التي ستوضع بين عناصر المصفوفة وثانيهما هو المصفوفة التي تريد تحويلها إلى سلسلة نصية.
	</p>

	<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1884_33">
<span class="pun">&lt;?</span><span class="pln">php
$arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'academy'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'hsoub'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'com'</span><span class="pun">];</span><span class="pln">

</span><span class="com">// إن استعملنا implode ذات الشكل الأول، فسنحصل على academyhsoubcom</span><span class="pln">
$str1 </span><span class="pun">=</span><span class="pln"> implode</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">);</span><span class="pln">
echo $str1</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أما لو استعملنا الشكل الثاني، ومررنا «.» كوسيط، فسنحصل على academy.hsoub.com</span><span class="pln">
$str2 </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"> $arr</span><span class="pun">);</span><span class="pln">
echo $str2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

	<p>
		يُلخِّص الجدول الآتي بعض دوال المصفوفات الشهيرة:.
	</p>

	<center>
		<style type="text/css">
table{border: 1px solid, black; border-collapse: collapse;}
th, td{border: 1px solid black;padding: 5px 10px;}
th{background-color: #fbfcfc;}		</style><table><thead><tr><th>
						الدالة
					</th>
					<th>
						شرحها
					</th>
				</tr></thead><tbody><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">array_merge()‎</span>
					</td>
					<td>
						<ul><li>
								يُمرَّر إليها أكثر من مصفوفة كوسيط
							</li>
							<li>
								مهمتها هي دمج تلك المصفوفات مع بعضها بعضًا وإعادة المصفوفة الناتجة
							</li>
						</ul></td>
				</tr><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">array_rand()‎‎</span>
					</td>
					<td>
						<ul><li>
								اختيار قيمة عشوائية واحدة أو أكثر
							</li>
							<li>
								تقبل وسيطًا إجباريًا هو المصفوفة التي ستؤخذ القيمة العشوائية منها
							</li>
							<li>
								ووسيطًا اختياريًا يُحدِّد عدد القيم التي ستُعاد
							</li>
							<li>
								تُعيد سلسلةً نصيةً تحوي مفتاح العنصر العشوائي المُختار إن اختارت قيمةً عشوائيةً وحيدة
							</li>
							<li>
								تعيد مصفوفة بمفاتيح العناصر العشوائية إن كان الوسيط الثاني أكبر من 1
							</li>
						</ul></td>
				</tr><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">()array_search</span>
					</td>
					<td>
						<ul><li>
								تبحث في المصفوفة عن قيمة مُعيّنة وستُعيد المفتاح المقابل لها إن وُجِدَت
							</li>
							<li>
								تقبل وسيطين أولهما هو القيمة التي ستبحث عنها، وثانيهما هو المصفوفة التي سيُبحَث فيها
							</li>
						</ul></td>
				</tr><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">array_sum()‎</span>
					</td>
					<td>
						<ul><li>
								حساب مجموع القيم العددية في مصفوفة
							</li>
							<li>
								تقبل وسيطًا وحيدًا هو المصفوفة المُراد حساب مجموع الأعداد فيها
							</li>
						</ul></td>
				</tr><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">()array_unique</span>
					</td>
					<td>
						<ul><li>
								تُزيل هذه الدالة جميع التكرارات في مصفوفة تُمرَّر إليها كوسيط
							</li>
						</ul></td>
				</tr><tr><td style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">()count</span>
					</td>
					<td>
						<ul><li>
								ربما هذه من أهم الدوال السابقة، إذ تُعيد عدد العناصر الموجودة في مصفوفة تُمرَّر إليها كوسيط.
							</li>
							<li>
								نستفيد كثيرًا من هذه الدالة في حلقة for إن لم نكن نعرف عدد عناصر المصفوفة
							</li>
							<li>
								نستطيع أن نكتب:
							</li>
						</ul><pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6123_11">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</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">array</span><span class="pun">.</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></pre>
					</td>
				</tr></tbody></table></center>
</div>

<div id="wmd-preview-section-15">
	<h2 id="تمرين">
		تمرين
	</h2>

	<p>
		لديك المصفوفة الآتية باسم <span style="font-family:courier new,courier,monospace;">names</span>:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1884_35">
<span class="pln">Array
(
    [16472] =&gt; Ayham
    [16483] =&gt; Ameen
    [15789] =&gt; Bashir
)</span></pre>

	<p>
		والمصفوفة باسم <span style="font-family:courier new,courier,monospace;">grades</span>:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1884_37">
<span class="pln">Array
(
    [16472] =&gt; Array
        (
            [math] =&gt; 62
            [arabic] =&gt; 76
            [english] =&gt; 75
        )

    [16483] =&gt; Array
        (
            [math] =&gt; 85
            [arabic] =&gt; 71
            [english] =&gt; 82
        )

    [15789] =&gt; Array
        (
            [math] =&gt; 52
            [arabic] =&gt; 86
            [english] =&gt; 93
        )

)</span></pre>

	<p>
		اكتب برنامجًا يأخذ اسم الطالب ثم يطبع جميع علاماته.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="المصادر">
		المصادر
	</h2>

	<ul><li>
			مقال <a href="http://www.findalltogether.com/tutorial/array-and-foreach-loop-in-php/" rel="external nofollow">Array and foreach loop in PHP</a> لصاحبه Harish Kumar.
		</li>
		<li>
			كتاب تعلم البرمجة بلغة PHP.
		</li>
		<li>
			صفحات <a href="http://php.net/manual/en/language.types.array.php" rel="external nofollow">Arrays</a> و <a href="http://php.net/manual/en/function.array.php" rel="external nofollow">array</a> وما هو موجود في <a href="http://php.net/manual/en/ref.array.php" rel="external nofollow">Array Functions</a>.
		</li>
	</ul></div>
]]></description><guid isPermaLink="false">294</guid><pubDate>Tue, 15 Mar 2016 22:04:43 +0000</pubDate></item><item><title>&#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; (Strings) &#x641;&#x64A; PHP &#x2013; &#x627;&#x644;&#x642;&#x633;&#x645; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-strings-%D9%81%D9%8A-php-%E2%80%93-%D8%A7%D9%84%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r281/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/strings-in-php.png.e1d2c9d21278ee53d2700b4f5760cb8a.png" /></p>

<p dir="rtl">
	سنكمل الآن ما تعلمناه في <a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-php-%E2%80%93-%D8%A7%D9%84%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r279/">الدرس السابق</a> عن السلاسل النصية.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="strings-in-php.png.73a25cd387ef4649ec556" class="ipsImage ipsImage_thumbnailed" data-fileid="12948" data-unique="g1eqr4x9p" src="https://academy.hsoub.com/uploads/monthly_2016_02/strings-in-php.png.73a25cd387ef4649ec55600d612fd33f.png"></p>

<p dir="rtl">
	وقد كان محتوى الدرس الأول كالآتي:
</p>

<ol dir="rtl"><li>
		إنشاء والوصول إلى السلاسل النصية باستخدام <span style="font-family:courier new,courier,monospace;">$</span> و<span style="font-family:courier new,courier,monospace;"> {}</span>، واستخدام الدالة<span style="font-family:courier new,courier,monospace;"> <strong>strlen()</strong>‎.</span>
	</li>
	<li>
		البحث في السلاسل النصية باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">strstr()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strpos()‎ و strrpos()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">substr_count()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strpbrk()‎</span></strong>
			</li>
		</ul></li>
	<li>
		الاستبدال في السلاسل النصية باستخدام الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;"> str_replace()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">()substr_replace</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">()strtr</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strtr()‎</span></strong>
			</li>
		</ul></li>
	<li>
		التعامل مع حالات الحروف الكبيرة (uppercase) والصغيرة (lowercase) باستخدام الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">strtolower()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strtoupper()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ucfirst()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">lcfirst()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ucword()‎</span></strong>
			</li>
		</ul></li>
	<li>
		النسخ غير الحساسة لحالة الأحرف لجميع الدوال السابقة.
	</li>
</ol><p dir="rtl">
	أما هذا الدرس فسيحتوي على ما يلي:
</p>

<ol dir="rtl"><li>
		تنسيق السلاسل النصية باستخدام<span style="font-family:courier new,courier,monospace;"> <strong>printf()</strong>‎</span>، بما في ذلك تعيين دقة الأرقام العشرية.
	</li>
	<li>
		إزالة الفراغات (trimming) من أطراف السلاسل النصية باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;"> trim()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ltrim()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">rtrim()‎</span></strong>
			</li>
		</ul></li>
	<li>
		إضافة حواشي (paddings) للنصوص باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">str_pad()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_RIGHT</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_LEFT</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_BOTH</span></strong>
			</li>
		</ul></li>
	<li>
		التفاف (wrapping) النصوص عبر استعمال الدالة <strong><span style="font-family:courier new,courier,monospace;">wordwrap()‎.</span></strong>
	</li>
	<li>
		تنسيق الأرقام باستخدام الدالة <strong><span style="font-family:courier new,courier,monospace;">number_format()‎</span></strong>.
	</li>
	<li>
		الوقت والتاريخ.
	</li>
</ol><h2 dir="rtl">
	تنسيق السلاسل النصية
</h2>

<h3 dir="rtl">
	الدالة printf()‎
</h3>

<p dir="rtl">
	الدالة <span style="font-family:courier new,courier,monospace;">printf()</span>‎ هي أداةٌ قويةٌ تمكِّنك من تنسيق السلاسل النصية بطرقٍ مختلفة، تأخذ <span style="font-family:courier new,courier,monospace;">printf()</span>‎ وسيطًا يُسمى سلسلة التنسيق (format string) يُتبَع عادةً بوسيطٍ اختياري أو أكثر يحتوي على السلسلة أو السلاسل التي ستوضع في السلسلة السابقة، ثم ستطبع هذه الدالة النتيجة النهائية.
</p>

<p dir="rtl">
	سلسلة التنسيق تحتوي على نصٍ عادي وفيه مُحدِّدات التنسيق (conversion specifications)، يتطلب وجود كل محدد تنسيق وسيطًا إضافيًا يُمرَّر إلى <span style="font-family:courier new,courier,monospace;">printf()‎</span>، ومهمته هي تنسيق ذاك الوسيط ووضعه في سلسلة التنسيق، ثم بعد ذلك ستُعرَض السلسلة النهائية المُنسَّقة؛ تبدأ محددات التنسيق دومًا بإشارة النسبة المئوية (%)، ربما يبدو الأمر معقدًا للوهلة الأولى، لكن مثالًا بسيطًا كهذا سيجعل إيصال الفكرة أمرًا هينًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_7">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج: "Pi rounded to a whole number is: 3"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Pi rounded to a whole number is: %d"</span><span class="pun">,</span><span class="pln"> M_PI </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	إن عبارة "<strong><span style="font-family:courier new,courier,monospace;">Pi rounded to a whole number is: %d"</span></strong> هي سلسلة التنسيق، و "<strong>%d</strong>" ضمن السلسلة السابقة هي محدد للتنسيق، وفي هذه الحالة، يُخبِر هذه المحدد الدالة <span style="font-family:courier new,courier,monospace;">printf()‎</span> أن تقرأ الوسيط الإضافي وتضعه -بعد تنسيقه كعدد صحيح- في سلسلة التنسيق؛ الوسيط الإضافي هو الثابت <span style="font-family:courier new,courier,monospace;">M_PI</span> الموجود في لغة PHP، التي يُمثِّل القيمة التقريبية للعدد π بعدد معيّن من المنازل العشرية (14 منزلة افتراضيًا)؛ أي أنَّ النتيجة النهائية لاستدعاء الدالة السابقة هي طباعة سلسلة التنسيق مع استبدال "<strong>%d</strong>" بقيمة الثابت π مُقرَّبًا إلى أقرب عدد صحيح.
</p>

<p dir="rtl">
	المزيد من المُحدِّدات:
</p>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">b: </span></strong>معاملة الوسيط كعدد صحيح (integer) وتنسيقه كعدد ثنائي.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">c</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كمحرف بنظام ASCII الذي يحمل نفس القيمة العددية.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">d</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كعدد عشري مع إشارة (signed). 
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">e</span></strong>: تنسيق الوسيط بالطريقة العلمية (مثلًا، 3.45e+2).
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">f</span></strong>: تنسيق الوسيط كعدد ذو فاصلة عائمة (floating point)، آخذًا بالحسبان إعدادات «المحليّة» (locale) الحالية (على سبيل المثال، تستعمل بعض الدول الأوروبية الفاصلة كعلامة تفصل الأرقام الصحيحة عن الأرقام العشرية عوضًا عن النقطة؛ أي 3,14 بدلًا من 3.14).
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">F</span></strong>: تنسيق الوسيط كعدد ذو فاصلة عائمة بغض النظر عن إعدادات المحليّة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">o</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظامي الثماني.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">s</span></strong>: تنسيق الوسيط كسلسلة نصيّة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">u</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كعدد عشري دون إشارة (unsigned).
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">x</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظام الست عشري بأحرفٍ ذات الحالة الصغيرة (lowercase).
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">X</span></strong>: معاملة الوسيط كعدد صحيح وتنسيقه كعدد بالنظام الست عشري بأحرفٍ ذات الحالة الكبيرة (uppercase).
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">%</span></strong>: إظهار إشارة النسبة المئوية (%)، لا يتطلب هذا المُحدِّد وجود وسيط إضافي.
	</li>
</ul><h3 dir="rtl">
	إضافة حواشي إلى المخرجات
</h3>

<p dir="rtl">
	يمكنك إضافة محارف إلى يسار (افتراضيًا) أو إلى يمين الوسيط الذي يتم تنسيقه كي يُصبِح بعرضٍ معيّن، وهذا مفيدٌ إن أردت أن تُضيف أصفارًا تسبِق الأعداد، أو أن تحاذي عدِّة سلاسل نصية أفقيًا عبر إضافة فراغات على جوانبها.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_31">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‏‎: "000123"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%06d&lt;br/&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: "004567"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%06d&lt;br/&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: "123456"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%06d&lt;br/&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123456</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h3 dir="rtl">
	دقة الأرقام
</h3>

<p dir="rtl">
	عندما تُظهِر الأعداد ذات الفاصلة العائمة باستخدام المحدِّد <strong>f</strong> أو <strong>F</strong>، يمكنك استعمال مُحدِّد لدقة الأرقام لتعيين عدد المنازل العشرية التي سيُقرَّب (أو يدوَّر) إليها الرقم. لإضافة مُحدِّد دقة الأرقام، أضف نقطة (.) يلحقها عدد المنازل العشرية التي ستستخدم، قبل مُحدِّد النوع؛ انظر إلى المثال الآتي للتوضيح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_9">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‏‎: "123.456700" (الدقة الافتراضية)</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">//الناتج ‏‎: "123.46"</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%.2f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: "123"</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%.0f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: "123.4567000000"</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">"%.10f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	يمكنك استخدام مُحدِّد الحاشية مع مُحدِّد الدقة، في حال أردت أن يكون طول الرقم معينًا (بما في ذلك الأرقام بعد الفاصلة العشرية، والفاصلة نفسها أيضًا):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_11">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‏‎: "123.46"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%.2f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: "000000123.46"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%012.2f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‏‎: " 123.4567"</span><span class="pln">
printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"%12.4f&lt;br /&gt;"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">123.4567</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	إزالة الفراغات من أطراف السلاسل النصية
</h2>

<p dir="rtl">
	قد لا ترغب في بعض الأحيان بوجود أيّة فراغات قبل أو بعد السلسلة النصية، وفي هذه الحالة نستعمل هذه الدوال:
</p>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">trim()‎: </span></strong>إزالة الفراغات (white-space) من بداية ونهاية السلسلة النصية.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">ltrim()‎: </span></strong>إزالة الفراغات من بداية السلسلة النصية فقط.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">rtrim()‎: </span></strong>إزالة الفراغات من نهاية السلسلة النصية فقط.
	</li>
</ul><p dir="rtl">
	انظر إلى ناتج المثال الآتي للتوضيح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5218_7">
<span class="pun">&lt;?</span><span class="pln">php

echo trim</span><span class="pun">(</span><span class="str">" hsoub "</span><span class="pun">);</span><span class="pln">

echo ltrim</span><span class="pun">(</span><span class="str">" hsoub "</span><span class="pun">);</span><span class="pln">

echo rtrim</span><span class="pun">(</span><span class="str">" hsoub "</span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	إضافة حواشي إلى النصوص
</h2>

<p dir="rtl">
	لقد رأينا سابقًا كيف يمكننا استخدام الدالة <span style="font-family:courier new,courier,monospace;">printf()</span>‎ لإضافة حواشي إلى بداية أو نهاية سلسلة نصيّة؛ لكن لغة PHP توفِّر دالةً مخصصةً لهذا الأمر اسمها<span style="font-family:courier new,courier,monospace;"> str_pad()‎</span>، وهي أكثر مرونةً من <span style="font-family:courier new,courier,monospace;">printf()</span>‎ وأسهل استخدامًا.
</p>

<p dir="rtl">
	لاستعمال الدالة <span style="font-family:courier new,courier,monospace;">str_pad()</span>‎، مرِّر السلسلة التي ستتم إضافة الحواشي إليها، وعرض السلسلة النهائي، وستعيد الدالة السلسلة وقد تمت إضافة فراغات إلى يمينها (افتراضيًا):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_29">
<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">
echo str_pad</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Hello, world!"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="com">// الناتج‏‎: "Hello, world! "</span><span class="pln">
echo </span><span class="str">'&lt;/pre&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	ولإضافة محارف أخرى غير الفراغ كحاشية، فمرِّر سلسلةً نصيةً كوسيطٍ ثالثٍ اختياري، لاحظ أنَّك تستطيع استخدام محرف وحيد أو أكثر من محرف؛ وفي الحالة الأخيرة، ستُكرَّر السلسلة النصية حسب العرض المُحدَّد:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_27">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‏‎: "Hello, world!*******"</span><span class="pln">
echo str_pad</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Hello, world!"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</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"> </span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج‏‎: "Hello, world!1231231"</span><span class="pln">
echo str_pad</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Hello, world!"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">,</span><span class="pln"> </span><span class="str">"123"</span><span class="pln"> </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">?&gt;</span></pre>

<p dir="rtl">
	يمكنك جعل الدالة<span style="font-family:courier new,courier,monospace;"> str_pad()‎</span> تضع الحاشية على يسار السلسلة النصية، أو على يمنيها ويسارها معًا؛ وذلك بتمرير وسيط ثالث اختياري يحتوي على ثوابت الدالة المذكورين في الجدول الآتي:
</p>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_RIGHT: </span></strong>إضافة الحاشية على اليمين (الحالة الافتراضية)، مما يحاذي السلسلة النصيّة إلى اليسار.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_LEFT: </span></strong>إضافة الحاشية على اليسار، مما يحاذي السلسلة النصيّة إلى اليمين.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_BOTH: </span></strong>إضافة الحاشية على الطرفين الأيمن والأيسر معًا، مما يؤدي إلى توسيط السلسلة النصية ما أمكن.
	</li>
</ul><p dir="rtl">
	<strong>مثال</strong>: (لاحظ وجود 3 محارف للحاشية على اليسار، و4 على اليمين؛ إذ لا يمكن توسيطها تمامًا):
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_25">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‏‎: "***Hello, world!****"</span><span class="pln">
echo str_pad</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Hello, world!"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">,</span><span class="pln"> </span><span class="str">"*"</span><span class="pun">,</span><span class="pln"> STR_PAD_BOTH </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">?&gt;</span></pre>

<h2 dir="rtl">
	التفاف النصوص
</h2>

<p dir="rtl">
	أحيانًا يكون عندك نصٌ طويلٌ مثل رسائل البريد الإلكتروني أو المقالات، وربما تريد أن تُقسَّم الأسطر بعرضٍ مختلف. تفعل الدالة<span style="font-family:courier new,courier,monospace;"> wordwrap()‎</span> هذا الأمر؛ يمكنك تحديد عدد المحارف في السطر عبر هذه الدالة، انظر إلى هذا المثال أولًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_23">
<span class="pun">&lt;?</span><span class="pln">php

$myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"this is my string

which is very long.

it is containing five lines

and a number of white

spaces"</span><span class="pun">;</span><span class="pln">

echo wordwrap </span><span class="pun">(</span><span class="pln">$myString</span><span class="pun">);</span><span class="pln">

echo </span><span class="str">"&lt;br&gt;&lt;br&gt;&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

echo wordwrap </span><span class="pun">(</span><span class="pln">$myString</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">);</span><span class="pln">

echo </span><span class="str">"&lt;br&gt;&lt;br&gt;&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

echo wordwrap </span><span class="pun">(</span><span class="pln">$myString</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</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">?&gt;</span></pre>

<p dir="rtl">
	لاحظ النتيجة بنفسك بفتح مصدر صفحة الويب ورؤية النتيجة لمختلف الجمل بقيمٍ مختلفة للوسيط الثاني (غير 40، مثل 10، أو 15، أو 20 ...إلخ.).
</p>

<h2 dir="rtl">
	تنسيق الأعداد
</h2>

<p dir="rtl">
	تُستعمَل الدالة <span style="font-family:courier new,courier,monospace;">number_format()‎</span> لتنسيق الأعداد، وتستقبل وسيطًا أو وسيطين أو أربعة وسائط.
</p>

<ol dir="rtl"><li>
		أول وسيط هو العدد الذي سيُنسَّق
	</li>
	<li>
		الوسيط الثاني هو عدد المنازل العشرية
	</li>
	<li>
		الوسيط الثالث هو المحرف الذي سيفصل بين الأعداد الصحيحة والأرقام العشرية
	</li>
	<li>
		أما رابع وسيط، فيُحدِّد المحرف الذي سيفصل بين الآلاف في الأعداد الصحيحة
	</li>
</ol><p dir="rtl">
	يوضَّح ما سبق بالمثال الآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_19">
<span class="pun">&lt;?</span><span class="pln">php

$myNumber </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12344555.3453</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج‏:‎ 1,23,44,555.3453</span><span class="pln">
echo number_format</span><span class="pun">(</span><span class="pln">$myNumber</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج‏:‎ 1,23,44,555.34</span><span class="pln">
echo number_format</span><span class="pun">(</span><span class="pln">$myNumber</span><span class="pun">,</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج‏:‎ 1 23 44 555,3453</span><span class="pln">
echo number_format</span><span class="pun">(</span><span class="pln">$myNumber</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="str">','</span><span class="pun">,</span><span class="str">' '</span><span class="pun">);</span><span class="pln">
echo </span><span class="str">"&lt;br&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	الوقت والتاريخ
</h2>

<p dir="rtl">
	يلزم الحصول على الوقت والتاريخ وعرضه بطريقة مناسبة كثيرًا في تطوير الويب، ولهذا توفِّر PHP الأدوات اللازمة لذلك. أهم تلك الأدوات هي الدالة<span style="font-family:courier new,courier,monospace;"> date()‎ </span>التي تقبل سلسلةً نصيةً تُحدِّد تنسيق المخرجات، وتتألف من محارف التنسيق الآتية:
</p>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">d: </span></strong>يعيد رقم اليوم من الشهر، وتتراوح قيمته من 01 إلى 31. استخدام المحرف <strong><span style="font-family:courier new,courier,monospace;">j </span></strong>للحصول على رقم اليوم دون 0 بادئة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">m: </span></strong>يعيد رقم الشهر، وتتراوح قيمته من 01 إلى 12. استخدام المحرف <strong><span style="font-family:courier new,courier,monospace;">n</span></strong> للحصول على رقم الشهر دون 0 بادئة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">w: </span></strong>الحصول على رقم اليوم من الأسبوع، وتتراوح قيمته بين 0 الذي يشير إلى يوم الأحد، و6 ليوم السبت.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">h: </span></strong>الحصول على الساعة الحالية بنظام 12 ساعة. استخدم g للحصول على الساعة بنظام 24 دون 0 بادئة. استخدام <strong><span style="font-family:courier new,courier,monospace;">a</span></strong> للحصول على am أو pm، و <strong><span style="font-family:courier new,courier,monospace;">A</span></strong> للحصول على AM أو PM.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">H: </span></strong>الحصول على الساعة الحالية لكن بنظام 24 ساعة. استخدم<strong><span style="font-family:courier new,courier,monospace;"> G</span></strong> للحصول على الساعة بنظام 24 دون 0 بادئة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">i: </span></strong>الحصول على الدقائق.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><strong>s</strong>: </span>الحصول على الثواني.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">Y: </span></strong>الحصول على السنة على هيئة أربعة أرقام.
	</li>
</ul><p dir="rtl">
	ويمكن تمرير وسيطٍ اختياري هو بصمة الوقت (timestamp) لكي تُعيد الدالة <span style="font-family:courier new,courier,monospace;">date()‎</span> قيمة التاريخ والوقت لها، لكن إن لم تُحدِّد بصمة الوقت، فستؤخذ القيمة من ناتج الدالة <span style="font-family:courier new,courier,monospace;">time()‎ </span>التي تُعيد بصمة الوقت مقاسةً بالثواني منذ بداية وقت يونكس (<a href="https://en.wikipedia.org/wiki/Unix_time" rel="external nofollow">Unix </a><a href="https://en.wikipedia.org/wiki/Unix_time" rel="external nofollow">Time</a>) (أي منتصف ليلة رأس السنة عام 1970).
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_15">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج‎: 12:31:55</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">'H:i:s'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج‎: 2015/12/23</span><span class="pln">
echo date</span><span class="pun">(</span><span class="str">'Y/m/d'</span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	<strong>ملاحظة</strong>: يجدر بالذكر أنَّ الدالة <span style="font-family:courier new,courier,monospace;">mktime()</span>‎ تنُشِئ بصمة الوقت لتاريخ معيّن كي تستعملها مع الدالة <span style="font-family:courier new,courier,monospace;">date</span>، شكلها العام هو الآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_17">
<span class="pln">mktime</span><span class="pun">(</span><span class="pln">$hour</span><span class="pun">,</span><span class="pln"> $minute</span><span class="pun">,</span><span class="pln"> $second</span><span class="pun">,</span><span class="pln"> $month</span><span class="pun">,</span><span class="pln"> $day</span><span class="pun">,</span><span class="pln"> $year</span><span class="pun">);</span></pre>

<p dir="rtl">
	حيث أول وسيط هو الساعة، والثاني هو الدقيقة، والثالث هو الثانية، والرابع هو الشهر، والخامس هو اليوم من الشهر، والسادس هو السنة؛ مثالٌ عن استعمالها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_6378_13">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// الناتج هو مثلًا‏‎: 1450872238</span><span class="pln">
$current_time </span><span class="pun">=</span><span class="pln"> time</span><span class="pun">();</span><span class="pln">
echo $current_time</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ناتج بصمة الوقت هو‎: 1030134920</span><span class="pln">
$past_time </span><span class="pun">=</span><span class="pln"> mktime</span><span class="pun">(</span><span class="lit">22</span><span class="pun">,</span><span class="pln"> </span><span class="lit">35</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</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">2002</span><span class="pun">);</span><span class="pln">
echo $past_time</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج هو‎: 12-23-2015 13:03</span><span class="pln">
</span><span class="com">// يمكن أن نحذف الوسيط الثاني، لأن الدالة date ستعتمد الوقت الحالي المُعادة من الدالة time افتراضيًا</span><span class="pln">
echo </span><span class="str">'current date is: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> date </span><span class="pun">(</span><span class="str">'m-d-Y H:i'</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> $current_time</span><span class="pun">);</span><span class="pln">

</span><span class="com">// الناتج هو‎: 08-23-2002 22:35</span><span class="pln">
</span><span class="com">// يمكن أن نحذف الوسيط الثاني، لأن الدالة date ستعتمد الوقت الحالي المُعادة من الدالة time افتراضيًا</span><span class="pln">
echo </span><span class="str">'a date in the past: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> date </span><span class="pun">(</span><span class="str">'m-d-Y H:i'</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> $past_time</span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	تمرين
</h2>

<p dir="rtl">
	اكتب برنامجًا يأخذ تاريخ ميلاد المستخدم ثم يُظهِر عمره بالسنوات والأشهر والأيام؛ مثلًا: 35 سنة، و 4 أشهر، و23 يومًا.
</p>

<h2 dir="rtl">
	المصادر
</h2>

<ul dir="rtl"><li>
		مقال <a href="http://www.findalltogether.com/tutorial/strings-in-php-part-2/" rel="external nofollow">Strings in PHP  part-2</a> لصاحبه Harish Kumar.
	</li>
	<li>
		صفحة <a href="http://php.net/manual/en/function.sprintf.php" rel="external nofollow">sprintf</a>، و <a href="http://php.net/manual/en/function.date.php" rel="external nofollow">date</a> في دليل PHP وغيرها.
	</li>
</ul>
]]></description><guid isPermaLink="false">281</guid><pubDate>Tue, 16 Feb 2016 06:48:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; (Strings) &#x641;&#x64A; PHP &#x2013; &#x627;&#x644;&#x642;&#x633;&#x645; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-strings-%D9%81%D9%8A-php-%E2%80%93-%D8%A7%D9%84%D9%82%D8%B3%D9%85-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r279/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/strings-in-php.png.880d800e0b05caee927f934ed0177f6e.png" /></p>

<p dir="rtl">
	سنبدأ الآن في تعلم التعامل مع السلاسل النصية وما هي العمليات التي تُجرى عليها.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="strings-in-php.png.42dce12a3b0916427b1fa" class="ipsImage ipsImage_thumbnailed" data-fileid="12947" data-unique="4vxu0wi40" src="https://academy.hsoub.com/uploads/monthly_2016_02/strings-in-php.png.42dce12a3b0916427b1fabc55efbb020.png"></p>

<p dir="rtl">
	ولمّا كان الحديث عن السلاسل النصيّة يحتاج شرحًا طويلًا، فقد قسمناها إلى قسمين، لنأخذ فكرةً عن محتواهما:
</p>

<p dir="rtl">
	القسم الأول: 
</p>

<ol dir="rtl"><li>
		إنشاء والوصول إلى السلاسل النصية باستخدام <span style="font-family:courier new,courier,monospace;">$</span> و<span style="font-family:courier new,courier,monospace;"> {}</span>، واستخدام الدالة<span style="font-family:courier new,courier,monospace;"> <strong>strlen()</strong>‎.</span>
	</li>
	<li>
		البحث في السلاسل النصية باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">strstr()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strpos()‎ و strrpos()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">substr_count()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strpbrk()‎</span></strong>
			</li>
		</ul></li>
	<li>
		الاستبدال في السلاسل النصية باستخدام الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;"> str_replace()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">()substr_replace</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">()strtr</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strtr()‎</span></strong>
			</li>
		</ul></li>
	<li>
		التعامل مع حالات الحروف الكبيرة (uppercase) والصغيرة (lowercase) باستخدام الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">strtolower()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">strtoupper()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ucfirst()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">lcfirst()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ucword()‎</span></strong>
			</li>
		</ul></li>
	<li>
		النسخ غير الحساسة لحالة الأحرف لجميع الدوال السابقة.
	</li>
</ol><p dir="rtl">
	القسم الثاني:
</p>

<ol dir="rtl"><li>
		تنسيق السلاسل النصية باستخدام<span style="font-family:courier new,courier,monospace;"> <strong>printf()</strong>‎</span>، بما في ذلك تعيين دقة الأرقام العشرية.
	</li>
	<li>
		إزالة الفراغات (trimming) من أطراف السلاسل النصية باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;"> trim()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">ltrim()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">rtrim()‎</span></strong>
			</li>
		</ul></li>
	<li>
		إضافة حواشي (paddings) للنصوص باستعمال الدوال:
		<ul><li>
				<strong><span style="font-family:courier new,courier,monospace;">str_pad()‎</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_RIGHT</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_LEFT</span></strong>
			</li>
			<li>
				<strong><span style="font-family:courier new,courier,monospace;">STR_PAD_BOTH</span></strong>
			</li>
		</ul></li>
	<li>
		التفاف (wrapping) النصوص عبر استعمال الدالة <strong><span style="font-family:courier new,courier,monospace;">wordwrap()‎.</span></strong>
	</li>
	<li>
		تنسيق الأرقام باستخدام الدالة <strong><span style="font-family:courier new,courier,monospace;">number_format()‎</span></strong>.
	</li>
	<li>
		الوقت والتاريخ.
	</li>
</ol><h2 dir="rtl">
	لماذا علي أن أتعلم عن السلاسل النصية؟
</h2>

<p dir="rtl">
	لأنه علينا -عند تطوير الويب- أن نحصل على البيانات من المستخدم؛ التي تكون في غالب الأحيان على شكل سلاسل نصيّة. لذا علينا أن نُرشِّح (filter) تلك البيانات لأغراضٍ أمنية، وذلك عبر التعلم عن كيفية التعامل مع السلاسل النصية.
</p>

<h2 dir="rtl">
	إنشاء السلاسل النصية والوصول إليها
</h2>

<p dir="rtl">
	كما تعلم مسبقًا، نُعرِّف السلاسل النصية بكتابة النصوص ضمن علامتي اقتباس مفردتين أو مزدوجتين، وبإسنادها إلى متغير:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9259_7">
<span class="pln">$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'string'</span><span class="pun">;</span></pre>

<p dir="rtl">
	أو:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9259_9">
<span class="pln">$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"string"</span><span class="pun">;</span></pre>

<p dir="rtl">
	سيتم تفسير أيّة متغيرات ترد ضمن السلاسل النصية بقيمة ذاك المتغير إن كانت السلسلة النصية محاطة بعلامتَي اقتباس مزدوجتين، وإلا فلن تُفسَّر تلك المتغيرات. أي أننا نستطيع أن نضع المتغيرات مباشرةً في السلاسل النصيّة كالآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9259_12">
<span class="pun">&lt;?</span><span class="pln">php

$site </span><span class="pun">=</span><span class="pln"> </span><span class="str">'academy.hsoub.com'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج هو:</span><span class="pln">
</span><span class="com">// Please visit academy.hsoub.com</span><span class="pln">
echo </span><span class="str">"Please visit $site"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// مثالٌ أكثر «تعقيدًا»‏</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="com">// {} تشير إلى اسم المتغير</span><span class="pln">
</span><span class="com">// الناتج هو:</span><span class="pln">
</span><span class="com">// these are cats</span><span class="pln">
echo </span><span class="str">"these are {$cat}s"</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	يمكننا "تهريب" (escape) بعض المحارف الخاصة، لكن لاحظ أنَّ المحارف الخاصة لا يمكن تهريبها إذا كانت ضمن علامتي اقتباس مفردتين، إذ تعمل مع علامات الاقتباس المزدوجة فقط.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9106_7">
<span class="pun">&lt;?</span><span class="pln">php

$site </span><span class="pun">=</span><span class="pln"> </span><span class="str">'academy.hsoub.com'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// \n هو محرف السطر الجديد</span><span class="pln">
</span><span class="com">/* ستحصل على مخرجات كما يلي في المتصفح:
string academy.hsoub.com

أما لو نظرت إلى مصدر الصفحة، فستجد شيئًا شبيهًا بما يلي:
string
academy.hsoub.com

ذلك ﻷن HTML لا تأخذ الفراغات بعين الاعتبار،
لكن ذلك مفيدٌ في PHP

*/</span><span class="pln">

echo </span><span class="str">"string\n $site"</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: إذا أردت تضمين علامة اقتباس مفردة داخل سلسلة نصية محاطة بعلامتي اقتباس مفردتين، فعليك «تهريبها» عبر وضع شرطة خلفية مائلة (\) قبلها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_8">
<span class="pln">echo </span><span class="str">'chars\' escaping'</span><span class="pun">;</span></pre>

<h2 dir="rtl">
	معرفة طول سلسلة نصية
</h2>

<p dir="rtl">
	يمكن الحصول على طول السلاسل النصية باستعمال الدالة <span style="font-family:courier new,courier,monospace;">strlen()</span>‎، حيث تأخذ وسيطًا وحيدًا هو السلسلة النصية، وتُعيد (returns) طول تلك السلسلة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_9106_9">
<span class="pun">&lt;?</span><span class="pln">php

$site </span><span class="pun">=</span><span class="pln"> </span><span class="str">'academy.hsoub.com'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج هو 17</span><span class="pln">
echo strlen</span><span class="pun">(</span><span class="pln">$site</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج هو 14 (بما في ذلك الفراغات)</span><span class="pln">
echo strlen</span><span class="pun">(</span><span class="str">'it is a string'</span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	<strong>ملاحظة</strong>: من المثير للاهتمام أنَّك تستطيع الوصول إلى المحارف (characters) في سلسلة نصيّة بكتابة ‎$myname[0]، أو ‎$myname[1] وهلّم جرًا إلى نهاية السلسلة النصية؛ هذه هي طريقة الوصول إلى عناصر المصفوفات، التي سنأخذها في درسٍ لاحق.
</p>

<h2 dir="rtl">
	البحث في السلاسل النصية
</h2>

<p dir="rtl">
	تأخذ الدوال التي تبحث عن السلاسل النصية وسيطين، أولهما هو السلسلة التي ستبحث فيها، وثانيهما هو النص التي ستبحث عنه في تلك السلسلة. إن لم يُعثر على النص فستعيد تلك الدوال القيمة false؛ يلخِّص هذا الجدول أبرز تلك الدوال:
</p>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">strstr()</span></strong>‎: إن عُثِرَ على النص، فستعيد الدالة<span style="font-family:courier new,courier,monospace;"> strstr()‎</span> قسمًا من السلسلة النصية يبدأ من مكان العثور على النص إلى نهاية السلسلة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">strpos()</span></strong>‎: تستعمل هذه الدالة للعثور على مكان وجود النص المُطابَق انطلاقًا من بداية السلسلة النصية، وستعيد مكانه.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">strrpos()</span></strong>‎: هذه الدالة شبيهة بالدالة السابقة <span style="font-family:courier new,courier,monospace;">strpos()‎</span> إلا أنها تبدأ البحث من النهاية.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">substr_count()</span></strong>‎: تحصي عدد مرات مطابقة النص الذي نبحث عنه في السلسلة النصية.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">strpbrk()</span></strong>‎: التحقق من وجود الحرف في السلسلة النصية وستعيد السلسلة النصية التي تلي ذاك الحرف.
	</li>
</ul><p dir="rtl">
	<strong>ملاحظة</strong>: كل تلك الدوال السابقة (باستثناء <span style="font-family:courier new,courier,monospace;">substr_count()</span>‎) ستعمل إلى أن تحدث أول مُطابَقة ثم ينتهي تنفيذها؛ فمثلًا، لو بحثنا عن h في "hsoub hosub" فستعيد الدالة <strong><span style="font-family:courier new,courier,monospace;">strstr('hsoub hsoub', 'h')‎ </span></strong>أول h تمت مطابقتها ثم سينتهي تنفيذها.
</p>

<p dir="rtl">
	انظر إلى المثال الآتي للمزيد من الإيضاح:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_10">
<span class="pun">&lt;?</span><span class="pln">php

$string </span><span class="pun">=</span><span class="pln"> </span><span class="str">"This is a @str string for a search"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ستُطبَع الكلمة search</span><span class="pln">
</span><span class="com">// الجزء من السلسلة النصية التي تبدأ بالقسم sea</span><span class="pln">
echo strstr</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">'sea'</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ستُطبَع الكلمة earch</span><span class="pln">
</span><span class="com">// الجزء من السلسلة النصية التي تبدأ بالقسم ear</span><span class="pln">
echo strstr</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">'ear'</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيُطبَع الرقم 8</span><span class="pln">
</span><span class="com">// الذي هو موضع أول حرف 'a'</span><span class="pln">
</span><span class="com">// تذكر أنَّ العد يبدأ من الصفر وليس الواحد</span><span class="pln">
echo strpos</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيُطبَع الرقم 30</span><span class="pln">
</span><span class="com">// الذي هو موضع آخر حرف 'a'</span><span class="pln">
echo strrpos</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيُطبَع الرقم 3</span><span class="pln">
</span><span class="com">// عدد أحرف 'a' في السلسلة النصية</span><span class="pln">
echo substr_count</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">,</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">).</span><span class="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ستُطبَع الجملة @str string for a search</span><span class="pln">
</span><span class="com">// التي تكون بعد محرف @ (بما فيها محرف @)</span><span class="pln">
echo strpbrk</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="str">'&lt;/br&gt;'</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	الاستبدال في السلاسل النصية
</h2>

<ul><li>
		<strong><span style="font-family:courier new,courier,monospace;">str_replace()</span></strong>‎: استبدال جميع أماكن ورود النص الذي نبحث عنه في السلسلة النصية.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">substr_replace()</span></strong>‎: استبدال القسم المُحدَّد من السلسلة الهدف بسلسلةٍ أخرى.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">strtr()</span></strong>‎: استبدال محارف معيّنة في السلسلة الهدف بمحارف أخرى.
	</li>
</ul><p dir="rtl">
	لنلقِ الآن نظرةً على كل دالةٍ على حدة.
</p>

<h3 dir="rtl">
	الدالة str_replace()‎
</h3>

<p dir="rtl">
	تأخذ هذه الدالة ثلاثة وسائط: أولها هو السلسلة التي سنبحث عنها، وثانيها هي السلسلة التي سيتم الاستبدال بها، وثالثها هي السلسلة التي سنبحث فيها. وستعيد هذه الدالة نسخةً من السلسلة الأصلية مع استبدال جميع أماكن ورود السلسلة التي يتم البحث عنها. هذا مثالٌ عنها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_16">
<span class="pun">&lt;?</span><span class="pln">php

$myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"It was the best of times, it was the worst of times,"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج: "It was the best of bananas, it was the worst of bananas,"</span><span class="pln">
echo str_replace</span><span class="pun">(</span><span class="pln"> </span><span class="str">"times"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> $myString </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	إن أردت أن تعرف عدد مرات استبدال السلسلة التي يتم البحث عنها، فمرِّر وسيطًا رابعًا اختيارًا، وسيُسنَد إليه عدد مرات الاستبدال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_14">
<span class="pun">&lt;?</span><span class="pln">php

$myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"It was the best of times, it was the worst of times,"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج: "It was the best of bananas, it was the worst of bananas,"</span><span class="pln">
echo str_replace</span><span class="pun">(</span><span class="pln"> </span><span class="str">"times"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> $myString</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="str">"&lt;br/&gt;"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج: "The text was replaced 2 times."</span><span class="pln">
echo </span><span class="str">"The text was replaced $num times"</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h3 dir="rtl">
	الدالة substr_replace()‎
</h3>

<p dir="rtl">
	في حين أنَّ الدالة <span style="font-family:courier new,courier,monospace;">str_replace()</span>‎ تبحث عن سلسلة نصيّة معينة لاستبدالها، لكن الدالة <span style="font-family:courier new,courier,monospace;">substr_replace()‎ </span>تستبدل جزءًا مُحدَّدًا من السلسلة الهدف؛ عليك تمرير ثلاثة وسائط لاستعمالها: السلسلة الهدف التي ستُجرى عليها عملية الاستبدال، والنص الذي سيتم وضعه بدلًا من السلسلة المُستبدَلة، والفهرس (index، أي المكان) الذي ستبدأ منه عملية الاستبدال.
</p>

<p dir="rtl">
	تستبدل الدالة<span style="font-family:courier new,courier,monospace;"> subsrt_replace()‎</span> جميع المحارف من نقطة البداية إلى نهاية السلسلة النصية، وتعيد نسخةً مُعدَّلةً من السلسلة (أي أنَّ السلسلة الأصلية ستبقى على حالها دون أن يُعدَّل فيها شيء)؛ يوضِّح هذا المثال طريقة عمل الدالة <span style="font-family:courier new,courier,monospace;">substr_replace()</span>‎:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_18">
<span class="pun">&lt;?</span><span class="pln">php

$myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"It was the best of times, it was the worst of times,"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج: "It was the bananas"</span><span class="pln">
echo substr_replace</span><span class="pun">(</span><span class="pln"> $myString</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	يمكنك أن تلاحظ أنَّ الشيفرة السابقة استبدلت جميع محتويات السلسلة النصية الأصلية بدءًا من الفهرس index) 11) إلى النهاية بالنص "bananas"؛ إن لم تكن تريد استبدال كل النص من نقطة البداية إلى نهاية السلسلة النصية، فيمكنك تحديد وسيط رابع اختياري يحتوي عدد المحارف التي ستُستبدل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5657_20">
<span class="pun">&lt;?</span><span class="pln">php

$myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"It was the best of times, it was the worst of times,"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الناتج: "It was the best of bananas, it was the worst of times,"</span><span class="pln">
echo substr_replace</span><span class="pun">(</span><span class="pln"> $myString</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bananas"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">19</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="pun">?&gt;</span></pre>

<h3 dir="rtl">
	الدالة strtr()‎
</h3>

<p dir="rtl">
	يمكنك أيضًا استخدام الدالة <span style="font-family:courier new,courier,monospace;">srttr()‎</span> لاستبدال سلاسل نصية بسلاسل نصية أخرى، عوضًا عن استبدال المحارف بمحارف فقط. عليك تمرير وسيطين لفعل ذلك: السلسلة التي تريد تغييرها، ومصفوفة (array) بأزواج «المفتاح/القيمة» حيث كل «مفتاح» يُمثِّل قيمة السلسلة النصية التي سيتم البحث عنها، وكل قيمة مرتبطة بذاك المفتاح هي السلسلة النصيّة التي ستستبدل تلك المُطابَقة. سنشرح المصفوفات في درسٍ لاحق.
</p>

<h2 dir="rtl">
	التعامل مع حالات الأحرف
</h2>

<p dir="rtl">
	ستأخذ الدوال الآتية وسيطًا وحيدًا الذي هو سلسلةٌ نصيّةٌ؛ ما رأيك أن تتدرب عليها وأن تجربها بنفسك.
</p>

<ul dir="rtl"><li>
		<span style="font-family:courier new,courier,monospace;"><strong>()strtolower</strong>: </span>جعل كل أحرف السلسلة النصية بأحرفٍ ذات الحالة الصغيرة (lowercase)
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">strtoupper()‎: </span></strong>جعل كل أحرف السلسلة النصية بأحرفٍ ذات الحالة الكبيرة (uppercase)
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">ucfirst()‎: </span></strong>جعل أول حرف من السلسلة النصية حرفًا بالحالة الصغيرة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">lcfirst()‎: </span></strong>جعل أول حرف من السلسلة النصية حرفًا بالحالة الكبيرة.
	</li>
	<li>
		<strong><span style="font-family:courier new,courier,monospace;">ucword()‎: </span></strong>جعل أول حرف من كل كلمة في السلسلة النصية حرفًا بالحالة الكبيرة.
	</li>
</ul><h2 dir="rtl">
	الدوال غير الحساسة لحالة الأحرف
</h2>

<p dir="rtl">
	هذه هي نسخٌ من الدوال السابقة التي لا تأخذ حالة الأحرف بعين الاعتبار أثناء عملها:
</p>

<ul><li>
		<span style="font-family:courier new,courier,monospace;">strstr()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">stristr()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">strpos()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">stripos()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">strrpos()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">strripos()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">str_replace()‎</span>
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">str_ireplace()‎</span>
	</li>
</ul><h2 dir="rtl">
	تمرين
</h2>

<p dir="rtl">
	قد تحتاج إلى عرض البريد الإلكتروني للأشخاص الذين يضيفون تعليقات في موقعك، لكنك لا تريد أن تُرسَل إليهم رسائل عشوائية… اكتب برنامجًا يبدِّل رمز <strong>@</strong> في البريد الإلكتروني إلى<strong> [at]</strong>، والنقطة في آخر العنوان إلى <strong>[dot]</strong> أي أنَّ «<strong>user.name@domain.com</strong>» سيُصبِح «<strong>user.name [at] domain [dot] com</strong>». (للمساعدة، انظر إلى صفحة دليل <span style="font-family:courier new,courier,monospace;">strstr</span> في المصادر).
</p>

<h2 dir="rtl">
	المصادر
</h2>

<ul dir="rtl"><li>
		مقال <a href="http://www.findalltogether.com/tutorial/strings-in-php-part-1/" rel="external nofollow">Strings in PHP part-1</a> لصاحبه Harish Kumar.
	</li>
	<li>
		صفحات <a href="http://php.net/manual/en/language.types.string.php" rel="external nofollow">Strings</a> ،<a href="http://php.net/manual/en/function.strstr.php" rel="external nofollow">strstr</a> ،<a href="http://php.net/manual/en/function.strpos.php" rel="external nofollow">strpos</a> و <a href="http://php.net/manual/en/function.substr-replace.php" rel="external nofollow">str_replace</a>، وغيرها.
	</li>
</ul>
]]></description><guid isPermaLink="false">279</guid><pubDate>Mon, 15 Feb 2016 17:38:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; (Loops) &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-loops-%D9%81%D9%8A-php-r278/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/loops-in-php.png.715bc1cfaa2afbb65e2e789c7d4c04bf.png" /></p>

<p dir="rtl">
	سنتطرّق في هذا الدرس إلى مفهوم الحلقات في PHP، التي تسمح لك بتنفيذ تعليمات برمجية مرةً أو أكثر. فعلى سبيل المثال، لو أردت أن أطبع كلمة "hsoub" عشر مرات فعلي عندها أن أكتب الأمر <span style="font-family:courier new,courier,monospace;">echo</span> مراتٍ عشر، لكن يمكنني عبر استعمال حلقة أن أكتب الأمر <span style="font-family:courier new,courier,monospace;">echo</span> مرةً واحدةً لطباعة الجملة عشر مرات.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="loops-in-php.png.ab2c8b7dc9c2bd9e9b1e899" class="ipsImage ipsImage_thumbnailed" data-fileid="12834" data-unique="m3mc20ies" src="https://academy.hsoub.com/uploads/monthly_2016_02/loops-in-php.png.ab2c8b7dc9c2bd9e9b1e899978dd364c.png"></p>

<p dir="rtl">
	هنالك أربعة أنواع من الحلقات في PHP  هي:
</p>

<ul dir="rtl"><li>
		حلقة <span style="font-family:courier new,courier,monospace;">while</span>
	</li>
	<li>
		حلقة <span style="font-family:courier new,courier,monospace;">do-while</span>
	</li>
	<li>
		حلقة <span style="font-family:courier new,courier,monospace;">for</span>
	</li>
	<li>
		حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>
	</li>
</ul><p dir="rtl">
	سنتعلم في هذا الدرس عن أول ثلاث حلقات لأن الرابعة متعلقة بالمصفوفات التي سنتعلمها لاحقًا، لذا سنؤجِّل شرح حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> إلى درسٍ قادم.
</p>

<h2 dir="rtl">
	حلقة while
</h2>

<p dir="rtl">
	حلقة <span style="font-family:courier new,courier,monospace;">while</span> هي من أبسط أشكال الحلقات في PHP، إذ تقوم هذه الحلقة بتنفيذ التعليمات البرمجية مرارًا وتكرارًا إلى أن يتحقق الشرط (أي تصبح قيمته FALSE)، ويتم التحقق من قيمة الشرط قبل كل تكرار، فلو تغيرت قيمته أثناء التنفيذ فسيستمر تنفيذ التعليمات الموجودة في الحلقة إلى نهايتها؛ وقد يتحقق شرط حلقة <span style="font-family:courier new,courier,monospace;">while</span> من البداية (أي تكون قيمته من البداية FALSE)، وبهذا لن تُنفَّذ التعليمات الموجودة فيها أبدًا. الشكل العام للحلقة <span style="font-family:courier new,courier,monospace;">while</span>  هو:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_7">
<span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">expr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  statments
</span><span class="pun">}</span></pre>

<p dir="rtl">
	خصائص هذا الشرط مماثلة لخصائص شرط عبارة <span style="font-family:courier new,courier,monospace;"><a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-php-r238/">if-else</a></span>؛ فلطالما كانت قيمة الشرط <span style="font-family:courier new,courier,monospace;">true</span> أو قيمةً ليست صفرية، فسيستمر تنفيذ الشيفرة مرارًا وتكرارًا. لنلقِ نظرةً على هذا المثال:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_9">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// نعطي قيمةً ابتدائية للمتغير</span><span class="pln">
$initial_value </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">// أصغر من 10 هو الشرط الذي سينهي الحلقة</span><span class="pln">
</span><span class="kwd">while</span><span class="pun">(</span><span class="pln">$initial_value </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 </span><span class="str">'hsoub'</span><span class="pun">.</span><span class="str">'&lt;br&gt;'</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// سنزيد قيمة المتغير بمقدار 1</span><span class="pln">
  $initial_value</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	تبدأ قيمة المتغير<span style="font-family:courier new,courier,monospace;"> ‎$initial_value</span> من القيمة 0 وسيستمر تنفيذ الحلقة لطالما كانت قيمة المتغير <span style="font-family:courier new,courier,monospace;">‎initial_value$ </span>أصغر من 10؛ تزداد قيمة ‎<span style="font-family:courier new,courier,monospace;">$initial_value</span> بمقدار 1 في كل تكرار؛ وسيطبع المثال السابق الكلمة "hsoub" عشر مرات، ويُستعمَل الوسم<span style="font-family:courier new,courier,monospace;"> &lt;br&gt;</span> لإدراج سطرٍ جديد في مستندات HTML (لطباعة الكلمات في أسطرٍ مختلفة). تذكر أنَّ النقطة "." تجمع بين سلسلتين نصيتين.
</p>

<h2 dir="rtl">
	حلقة do-while
</h2>

<p dir="rtl">
	هذه الحلقة مشابهة جدًا لحلقة <span style="font-family:courier new,courier,monospace;">while</span> لكن الاختلاف بينها هو أنَّ هذه الحلقة تتحقق من قيمة الشرط بعد أن تنفِّذ الشيفرة الموجود ضمنها؛ أي أنها تتحقق من الشرط عند تكرار تنفيذ الشيفرة وليس عند تنفيذها لأول مرة. شكلها العام هو:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_16">
<span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  statments
</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">expr</span><span class="pun">);</span></pre>

<p dir="rtl">
	مثالٌ عليها:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_11">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// نعطي قيمةً ابتدائية للمتغير</span><span class="pln">
$initial_value </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">// أصغر من 10 هو الشرط الذي سينهي الحلقة</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'hsoub'</span><span class="pun">.</span><span class="str">'&lt;br&gt;'</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// سنزيد قيمة المتغير بمقدار 1</span><span class="pln">
  $initial_value</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">$initial_value </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">?&gt;</span></pre>

<p dir="rtl">
	سيطبع هذا المثال الكلمة "hsoub" عشر مرات أيضًا، لكن الاختلاف يكمن فيما لو كانت القيمة الابتدائية للمتغير<span style="font-family:courier new,courier,monospace;"> ‎$initial_value </span>أكبر أو تساوي 10، ففي هذا الحالة لن تُنفَّذ حلقة <span style="font-family:courier new,courier,monospace;">while</span> بينما ستُنفَّذ حلقة <span style="font-family:courier new,courier,monospace;">do-while</span>. أي أنها ستنفَّذ مرةً واحدةً على الأقل. لاحظ وجود الفاصلة المنقوطة بعد <span style="font-family:courier new,courier,monospace;">while</span> في حلقة <span style="font-family:courier new,courier,monospace;">do-while</span>.
</p>

<h2 dir="rtl">
	حلقة for
</h2>

<p dir="rtl">
	الشكل العام لحلقة <span style="font-family:courier new,courier,monospace;">for</span> هو:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_18">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">initialize</span><span class="pun">;</span><span class="pln"> condition</span><span class="pun">;</span><span class="pln"> operation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  statments
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لنأخذ مثالًا قبل أن نناقش آلية عمل هذه الحلقة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_20">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// تهيئة المتغير داخل الحلقة</span><span class="pln">
</span><span class="kwd">for</span><span class="pun">(</span><span class="pln">$initial </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $initial </span><span class="pun">&lt;</span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $initial</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'hsoub'</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="com">// تهيئة المتغير خارج الحلقة</span><span class="pln">
$initial_value </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"> $initial_value </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $initial_value</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'hsoub'</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">?&gt;</span></pre>

<p dir="rtl">
	شاهدنا -في أول نوعين من الحلقات- كيف أننا نهيّئ متغيرًا، ثم علينا التحقق من الشرط في الحلقة كي تُنفَّذ، ثم في النهاية علينا تعديل قيمة المتغير (زيادةً أو نقصانًا). لكننا نجري الخطوات الثلاث السابقة في مكانٍ وحيد في حلقة <span style="font-family:courier new,courier,monospace;">for</span>. تأخذ الحلقة <span style="font-family:courier new,courier,monospace;">for</span> ثلاثة وسائط (arguments):
</p>

<ol dir="rtl"><li>
		<strong> القيمة الابتدائية (initialize)</strong>: وهي مماثلة لأول نوعين من الحلقات. يمكننا تهيئة المتغيرات في حلقة <span style="font-family:courier new,courier,monospace;">for</span> بطريقتين، الأولى داخل الحلقة (بين الأقواس) والأخرى قبل الحلقة. لاحظ طريقة الكتابة في المثال السابق؛ حيث يُفصَل بين كل وسيط والآخر بفاصلة منقوطة؛ وإذا كنت تُهيّئ القيمة خارج الحلقة، فلا تنسَ أن تضع الفاصلة المنقوطة حتى ولو كانت القيمة فارغة.
	</li>
	<li>
		<strong>الشرط (condition)</strong>: وهو يقارن بين قيمة المتغير الذي تمت تهيئته والقيمة المعطية.
	</li>
	<li>
		<strong>العملية (operation)</strong>: وهي التي ستعدِّل في قيمة المتغير بعد نهاية تنفيذ كل تكرار للحلقة.
	</li>
</ol><h3 dir="rtl">
	أمثلة إضافية
</h3>

<p dir="rtl">
	لا يكفي الشكل العام للأوامر والتعليمات لتعلم لغة البرمجة وفهمها فهمًا تامًا؛ لنحاول الآن استيعاب هذه الأمثلة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_22">
<span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// طباعة الأرقام من 10 إلى 0</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$number</span><span class="pun">=</span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $number </span><span class="pun">&gt;=</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="pun">{</span><span class="pln">
  echo $number</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">?&gt;</span></pre>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_24">
<span class="pun">&lt;?</span><span class="pln">php

</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">$number</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $number </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln"> $number</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">
  echo $number</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">?&gt;</span></pre>

<p dir="rtl">
	نجد -في المثال أعلاه- المعامل "<strong>‎+=‎</strong>" الذي يُضيف القيمة على الجانب الأيمن إلى قيمة المتغير على الجانب الأيسر؛ يمكنك أيضًا استعمال هذه المعاملات:
</p>

<ul dir="rtl"><li>
		"<strong>‎*=</strong>‎": الضرب، مثال<span style="font-family:courier new,courier,monospace;"> ‎$number *= 2‎</span>
	</li>
	<li>
		"<strong>‎-=</strong>‎": الطرح
	</li>
	<li>
		"<strong>‎/=</strong>‎": القسمة
	</li>
	<li>
		"‎<strong>%=</strong>‎": باقي القسمة
	</li>
	<li>
		"<strong>‎^=</strong>‎": القوة (أو الأس)
	</li>
</ul><p dir="rtl">
	سنكتب الآن برنامجًا لطباعة مضاعفات الرقم 5 بين العددين 1 و 100؛ تذكَّر أن المعامل <strong>%</strong> يُعيد باقي القسمة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_26">
<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">$number</span><span class="pun">=</span><span class="lit">1</span><span class="pun">;</span><span class="pln"> $number </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">100</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">if</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">5</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">
    echo $number</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="pun">?&gt;</span></pre>

<h2 dir="rtl">
	الشكل البديل لبنى التحكم
</h2>

<p dir="rtl">
	تدعم PHP شكلًا بديلًا لأقواس بنى التحكم التي هي <span style="font-family:courier new,courier,monospace;"><a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-php-r238/">if</a></span>، و <span style="font-family:courier new,courier,monospace;">while</span>، و <span style="font-family:courier new,courier,monospace;">for</span>، و <span style="font-family:courier new,courier,monospace;">foreach</span>، و <span style="font-family:courier new,courier,monospace;">switch</span>؛ وطريقة استعمال الشكل البديل هي وضع نقطتين رأسيتين (:) بدلًا من قوس البداية، واستبدال قوس النهاية بالكلمات "<span style="font-family:courier new,courier,monospace;">endif;</span>‎"، أو "<span style="font-family:courier new,courier,monospace;">endwhile;</span>‎"، أو "<span style="font-family:courier new,courier,monospace;">‎endfor;‎</span>"، أو "<span style="font-family:courier new,courier,monospace;">endforeach;‎</span>" (سنناقش تلك الحلقة في درسٍ لاحق)، أو "<span style="font-family:courier new,courier,monospace;">endswitch;</span>‎" على التوالي وبالترتيب.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_28">
<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">$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="pun">?&gt;</span><span class="pln">
  A is equal to 5
</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 dir="rtl">
	قسم HTML في المثال السابق (A is equal to 5) موجودٌ ضمن جملة <span style="font-family:courier new,courier,monospace;">if</span> شرطية مكتوبة بالشكل البديل، لاحظ أن تمييز بداية ونهاية بنى التحكم أسهل عند دمج HTML مع PHP. ستظهر جملة "A is equal to 5" فقط إن كانت قيمة المتغير <span style="font-family:courier new,courier,monospace;">‎$a</span> مساوية للرقم 5.
</p>

<p dir="rtl">
	يمكن تطبيق الشكل البديل على عبارات <span style="font-family:courier new,courier,monospace;">else</span> و <span style="font-family:courier new,courier,monospace;">elseif</span> أيضًا. هذا مثالٌ عنها بالشكل البديل:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2586_30">
<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">$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">
  echo </span><span class="str">"..."</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">
  echo </span><span class="str">"!!!"</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><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	تمرين
</h2>

<p dir="rtl">
	اكتب برنامجًا فيه حلقتين متداخلتين لطباعة جدول الضرب للأعداد من 1 إلى 9؛ حيث يكون ناتج خرجه هو:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2586_32">
<span class="pln">1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81</span></pre>

<p dir="rtl">
	حاول أن تشغل السكربت السابق من سطر الأوامر (استعمل<span style="font-family:courier new,courier,monospace;"> ‎\t</span> لإدراج مسافة جدولة [tab]، و<span style="font-family:courier new,courier,monospace;"> ‎\n </span>لإدراج سطر جديد).
</p>

<h2 dir="rtl">
	المصادر
</h2>

<ul dir="rtl"><li>
		مقال <a href="http://www.findalltogether.com/wp/programming/php/php-tutorials/loops-in-php/" rel="external nofollow">Loops in PHP</a> لصاحبه Harish Kumar.
	</li>
	<li>
		صفحات <a href="http://php.net/manual/en/control-structures.while.php" rel="external nofollow">while</a>، و <a href="http://php.net/manual/en/control-structures.do.while.php" rel="external nofollow">do-while</a>، و <a href="http://php.net/manual/en/control-structures.for.php" rel="external nofollow">for</a>، و <a href="http://php.net/manual/en/control-structures.alternative-syntax.php" rel="external nofollow">Alternative syntax</a> في دليل PHP وغيرها.
	</li>
</ul>
]]></description><guid isPermaLink="false">278</guid><pubDate>Wed, 10 Feb 2016 13:10:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62C;&#x645;&#x644; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; &#x641;&#x64A; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-php-r238/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/conditional-statements-in-php.png.796640031e867dc1020b382362349620.png" /></p>
<p dir="rtl">
	<span style="font-size: 14px; line-height: 1.6;">يُبنى أي سكربت </span><span style="font-size: 14px; line-height: 1.6;">PHP </span><span style="font-size: 14px; line-height: 1.6;">من سلسلةٍ من التعليمات البرمجية، التي تكون عمليات إسناد، أو استدعاء لدوال، أو حلقات، أو جملًا شرطية</span><span style="font-size: 14px; line-height: 1.6;">. </span><span style="font-size: 14px; line-height: 1.6;">تنتهي التعلميات عادةً بفاصلة منقوطة، ويمكن تجميع التعليمات ضمن مجموعة عبر وضعها ضمن أقواس معقوفة </span><span style="font-size: 14px; line-height: 1.6;">(</span><span style="font-size: 14px; line-height: 1.6;">أي </span><span style="font-size: 14px; line-height: 1.6;">{}).</span>
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="conditional-statements-in-php.png.17acc2" class="ipsImage ipsImage_thumbnailed" data-fileid="12768" data-unique="pdffqx23s" src="https://academy.hsoub.com/uploads/monthly_2016_02/conditional-statements-in-php.png.17acc26db68f3a944470a6977c8a3f61.png">
</p>

<p dir="rtl">
	سنفصِّل في هذا الدرس الجمل الشرطية (التي هي عبارات <span style="font-family:courier new,courier,monospace;">if-else</span>، وعبارة <span style="font-family:courier new,courier,monospace;">switch</span>). حيث تُستعمَل هذه العبارات لاتخاذ القرارات وتنفيذ إجراءات اعتمادًا على تحقيق شرطٍ معيّن وهي من أهم التعابير البرمجية التي علينا تعلمها؛ لننظر إلى مثالٍ أولًا.
</p>

<p dir="rtl">
	ليكن لدينا متغيرٌ اسمه ‎<span style="font-family:courier new,courier,monospace;">$a</span>، ونريد أن نُظهِر الكلمة "hsoub" إن كانت قيمة المتغير <span style="font-family:courier new,courier,monospace;">‎$a</span> مساويةً للسلسلة النصية "hsoub"؛ ستبدو الشيفرة كالآتي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_7"><span class="pun">&lt;?</span><span class="pln">php

$a </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hsoub'</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">$a </span><span class="pun">==</span><span class="pln"> </span><span class="str">'hsoub'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">//إذا كانت قيمة المتغير مساويةً للكلمة 'hsoub' فستُطبَع الكلمة hsoub</span><span class="pln">
  echo </span><span class="str">'hsoub'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	يمكنك ملاحظة أننا استعملنا عبارة <span style="font-family:courier new,courier,monospace;">if</span> للتحقق إن كانت قيمة المتغير ‎<span style="font-family:courier new,courier,monospace;">$a</span> مساويةً للسلسلة النصية "hsoub" أم لا؛ ركِّز على البنية العامة:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_9"><span class="kwd">if</span><span class="pun">(</span><span class="pln"> expr </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  statements
</span><span class="pun">}</span></pre>

<p dir="rtl">
	ستُنفَّذ العبارات داخل حلقة <span style="font-family:courier new,courier,monospace;">if</span> إن كانت قيمة الشرط هي <span style="font-family:courier new,courier,monospace;">true</span> أو قيمة غير صفرية (non-zero) أو قيمة غير فارغة (non-empty)؛ هذا شرحٌ للكلمات الثلاث السابقة:
</p>

<ul dir="rtl">
	<li>
		<strong>القيمة true</strong>: معنى هذا القيمة واضحٌ وجلي؛ ففي المثال السابق استعملنا معامل المقارنة "<strong>==</strong>" لنتحقق إن كانت قيمة المتغير ‎$a مساويةً للسلسلة النصية "hsoub" أم لا. إن كانت مساويةً فسيعيد المعاملُ القيمةَ true وخلا ذلك سيعيد القيمة false.
	</li>
	<li>
		<strong>قيمة غير صفرية</strong>: يمكننا تجربتها بوضع 0 أو أعداد أخرى ليست مساوية للصفر في مكان الشرط... في الحقيقة، تعتبر الصفر مساويةً للقيمة false ويعتبر أي شيء عداها قيمته true.
	</li>
	<li>
		<strong>قيمة غير فارغة</strong>: جميع المتغيرات الفارغة أو غير الموجودة (null) تعتبر false، وبقية القيم أو المتغيرات تعتبر true. لاحظ أنَّ القيم الفارغة لا تعني أن تترك مكان الشرطِ فارغًا في عبارة if، وإنما تعني السلاسل النصية أو المتغيرات الفارغة أو غير الموجودة.
	</li>
</ul>

<p dir="rtl">
	حاول تجربة الأنواع الثلاثة آنفة الذكر لإيضاح ما سبق تمامًا.
</p>

<h2 dir="rtl">
	عبارة else
</h2>

<p dir="rtl">
	تستعمل هذه العبارة عندما نحتاج إلى اختيار أحد احتمالين؛ فنريد مثلًا أن نُصنِّف طلاب الصف بناءً على درجاتهم، إذ يعتبر الطلاب الذين يحصلون على درجةٍ أقل من 33 راسبين، وسيعتبرون عدا ذلك ناجحين. سيبدو السكربت كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_11"><span class="pun">&lt;?</span><span class="pln">php

$marks </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</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">$marks </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">33</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'you have failed'</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">'you have passed!'</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">// لاحظ كيف عطلناها بوضعها في تعليق</span><span class="pln">

</span><span class="com">/*

if ($marks &lt; 33) {
  echo 'you have failed';
}

if ($marks &gt;= 33) {
  echo 'you have passed!';
}

*/</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	من الواضح أنَّه سينفَّذ إما ما هو موجودٌ داخل عبارة <span style="font-family:courier new,courier,monospace;">if</span>، أو ما هو موجودٌ داخل عبارة <span style="font-family:courier new,courier,monospace;">else</span>؛ وذلك بعد التحقق من قيمة المتغير ‎<span style="font-family:courier new,courier,monospace;">$marks</span>، إذ ينفَّذ ما هو موجودٌ في <span style="font-family:courier new,courier,monospace;">else</span> إن لم يتحقق شرط <span style="font-family:courier new,courier,monospace;">if</span>.
</p>

<h2 dir="rtl">
	التشعب في العبارات الشرطية
</h2>

<p dir="rtl">
	يمكنك إنشاء عبارة شرطية داخل عبارة شرطية أخرى، فمثلًا لو أردنا أن نتحقق إن أخذ الطالب الدرجة ‎A+‎ أم لا، فسنعدِّل السكربت ليبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_13"><span class="pun">&lt;?</span><span class="pln">php

$marks </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</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">$marks </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">33</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'you have failed'</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">// نكتب جملة شرطية داخل عبارة else</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$marks </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">90</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">'you have passed and got A+ grade'</span><span class="pun">;</span><span class="pln">
  </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">'you have passed but not got A+ grade'</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></pre>

<h2 dir="rtl">
	عبارات elseif
</h2>

<p dir="rtl">
	إن كان لدينا أكثر من خيارين فعلينا وقتها استعمال عبارة <span style="font-family:courier new,courier,monospace;">elseif</span>، وهي شبيهةٌ بالعبارات المتشعبة؛ فيمكننا مثلًا إعادة كتابة السكربت السابق ليبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_15"><span class="pun">&lt;?</span><span class="pln">php

$marks </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</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">$marks </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">33</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'you have failed'</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">$marks </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">90</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'you have passed and got A+ grade'</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">'you have passed but not got A+ grade'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	إن لم يتحقق الشرط الأول (الدرجة &gt;= 33)، فستتحقق العبارة <span style="font-family:courier new,courier,monospace;">elseif</span> من الشرط المتعلق بها (الدرجة &gt; 90) فإن لم يتحقق هذا الشرط أيضًا فستنفَّذ عبارة <span style="font-family:courier new,courier,monospace;">else</span>. يمكنك كتابة عبارات <span style="font-family:courier new,courier,monospace;">elseif</span> لأي عدد من المرات، فمثلًا، لو كان لديك أربعة خيارات (بدلًا من ثلاثة) فعليك وقتها استعمال عبارة <span style="font-family:courier new,courier,monospace;">elseif</span> مرتين.
</p>

<p dir="rtl">
	<strong>تمرين</strong>: حاول أن تُعدِّل السكربت السابق لكي يعطي التقديرات الآتية للطلاب:
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_02/img2.png.40f638caf323d73a22018840d8deba66.png" data-fileid="12767" data-fileext="png" rel=""><img alt="img2.thumb.png.a42bf92aec2f920503efbc123" class="ipsImage ipsImage_thumbnailed" data-fileid="12767" data-unique="1qq8jbyvx" src="https://academy.hsoub.com/uploads/monthly_2016_02/img2.thumb.png.a42bf92aec2f920503efbc123ad47bf3.png"></a>
</p>

<h2 dir="rtl">
	عبارة switch
</h2>

<p dir="rtl">
	إن جرَّبت إعادة كتابة المثال السابق لتضمين جميع التقديرات الممكنة للدرجات، فستجد أنَّ عليك كتابة الشروط مرارًا وتكرارًا؛ وما سبق مجرد مثالٍ بسيط، فما بالك بمثالٍ ضخمٍ بلائحةٍ ضخمة؟ لنتحدث الآن عن طريقةٍ جديدةٍ للجمل الشرطية تسمى "عبارة <span style="font-family:courier new,courier,monospace;">switch</span>"؛ التي هي شبيهةٌ بسلسلةٍ من جمل <span style="font-family:courier new,courier,monospace;">if</span> الشرطية. لنلقِ نظرةً على هذه الشيفرة أولًا:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_17"><span class="pun">&lt;?</span><span class="pln">php

$name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'hsoub'</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">switch</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">'variable'</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"it is a variable"</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">'hsoub'</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"best academy ever!"</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">'this is necessary default case'</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">// هذه العبارة ليست ضرورية</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	لنحاول فهم ما جرى في السكربت السابق:
</p>

<ul dir="rtl">
	<li>
		نبدأ السكربت بتعريف متغير اسمه "name".
	</li>
	<li>
		ثم نمرِّر ذاك المتغير إلى عبارة <span style="font-family:courier new,courier,monospace;">switch.</span>
	</li>
	<li>
		ستأخذ العبارة <span style="font-family:courier new,courier,monospace;">swtich</span> المتغير وتحاول مطابقة قيمته مع الحالات (cases) المُعرَّفة داخلها، فإن طابقت تلك القيمة أيّة حالةٍ فسينفَّذ ما يليها إلى أن نصل إلى عبارة <span style="font-family:courier new,courier,monospace;">break.</span>
	</li>
	<li>
		سينتهي تنفيذ الحلقة (أي "سنخرج" منها) بعد تنفيذ أوّل عبارة <span style="font-family:courier new,courier,monospace;">break.</span>
	</li>
	<li>
		يجب أن يكون في كل عبارة <span style="font-family:courier new,courier,monospace;">switch</span> حالة افتراضية (default case) التي تنفَّذ إن لم تُطابِق المدخلات أيّة حالةٍ من الحالات.
	</li>
	<li>
		ليس من الضروري وجود عبارة <span style="font-family:courier new,courier,monospace;">break</span> بعد الحالة الافتراضية، يمكنك ألّا تضيفها.
	</li>
	<li>
		أي بكلامٍ آخر، عبارة <span style="font-family:courier new,courier,monospace;">switch</span> هي مجموعة من عبارات <span style="font-family:courier new,courier,monospace;">if-else</span>. وتبدأ تنفيذها عند مطابقة حالة من الحالات المُعرَّفة (أو الحالة الافتراضية)، وتنتهي عند عبارة <span style="font-family:courier new,courier,monospace;">break</span> أو قوس الإغلاق "‎}‎".
	</li>
</ul>

<p dir="rtl">
	ميزة استعمال <span style="font-family:courier new,courier,monospace;">switch</span> هي أنها ستقلل من طول الشيفرة المكتوب. لنعد الآن إلى مثالنا السابق عن تقديرات الطلاب ونحاول حلّ المشكلة عبر عبارة <span style="font-family:courier new,courier,monospace;">switch</span>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_4077_19"><span class="pun">&lt;?</span><span class="pln">php

$marks </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="com">// عدِّل قيمة المتغير لتحصل على نتائج مختلفة</span><span class="pln">

</span><span class="com">// ندور العلامات إلى عدد بخانة واحدة</span><span class="pln">
$m </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$marks </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)/</span><span class="lit">10</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الدالة intval تعيد الجزء الصحيح من العدد</span><span class="pln">
</span><span class="com">// مثلًا 3.2 تصبح 3 و 3.8 تصبح 3</span><span class="pln">
</span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">intval</span><span class="pun">(</span><span class="pln">$m</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="lit">0</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"F"</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="lit">3</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"D"</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="lit">4</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"C"</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="lit">5</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"C+"</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="lit">6</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"B"</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="lit">7</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"B+"</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="lit">8</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"A"</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="lit">9</span><span class="pun">:</span><span class="pln">
    echo </span><span class="str">"A+"</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="com">// الحالة الافتراضية إن لم تُطابَق أيّة حالة</span><span class="pln">
    echo </span><span class="str">"wrong input for marks"</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">?&gt;</span></pre>

<p dir="rtl">
	من الواضح أننا لم نكتب شيفراتٍ كثيرة كما في السابق؛ لنشرح ما حدث في السكربت السابق:
</p>

<ul dir="rtl">
	<li>
		بدأنا السكربت بإنقاص الدرجات بمقدار 1 لكي يكون أول رقم (العشرات) من كل تقدير متساويًا (ما عدا التقدير F)، أي مثلًا 50 ستصبح 49 و100 ستصبح 99
	</li>
	<li>
		ثم قسمنا الدرجات على 10 لجعلها تتراوح بين ‎-0.1 و9.9؛ أي أنَّ 10 ستصبح 0.1 و67 ستصبح 6.7.
	</li>
	<li>
		الدالة <span style="font-family:courier new,courier,monospace;">intval</span> هي دالة موجودة في لغة PHP مهمتها إعادة الجزء الصحيح من العدد؛ أي أنها -مثلًا- ستعيد الرقم 3 إن كان العدد المُمرَّر إليها هو 3.4 أو 3.5 أو 3.8. باختصار، سنمرِّر الجزء الصحيح من العدد إلى العبارة <span style="font-family:courier new,courier,monospace;">switch.</span>
	</li>
	<li>
		ثم سنحاول مطابقة ذاك الرقم مع الحالات داخل عبارة <span style="font-family:courier new,courier,monospace;">switch</span>؛ وكما ذكرنا سابقًا، سيستمر تنفيذ الشيفرات التي تلي سطر مطابقة الحالي إلى أن نصادف عبارة <span style="font-family:courier new,courier,monospace;">break</span>، فلذا ستُشير الحالات 0 و 1 و 2 إلى نفس الأسطر البرمجية (تلك التي ستطبع F) لعدم وجود عبارة <span style="font-family:courier new,courier,monospace;">break</span> بينها.
	</li>
</ul>

<h2 dir="rtl">
	المعامل الثلاثي "‎?:‎"
</h2>

<p dir="rtl">
	يُمثِّل هذا المعامل صيغةً مختصرةً لجملة <span style="font-family:courier new,courier,monospace;">if-else </span>الشرطية، شكل العام كالآتي:
</p>

<pre class="html ipsCode prettyprint prettyprinted" data-pbcklang="html" data-pbcktabsize="4"><span class="pun">(</span><span class="pln">expr1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="pun">(</span><span class="pln">expr2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">expr3</span><span class="pun">)</span></pre>

<p dir="rtl">
	سيتم التحقق أولًا من القيمة المنطقية للتعبير expr1، فإن كانت TRUE فسيُنفَّذ expr2، أما لو كانت FALSE فسينفَّذ expr3. هذا مثالٌ عنه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_156_7"><span class="pun">&lt;?</span><span class="pln">php

$marks </span><span class="pun">=</span><span class="pln"> </span><span class="lit">23</span><span class="pun">;</span><span class="pln">

echo $marks </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">33</span><span class="pun">?</span><span class="pln"> </span><span class="str">'you have failed'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'you have passed!'</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">$marks </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">33</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  echo </span><span class="str">'you have failed'</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">'you have passed!'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<h2 dir="rtl">
	تمرين
</h2>

<ul dir="rtl">
	<li>
		حاول أن تعدِّل الأمثلة السابقة.
	</li>
	<li>
		اكتب برنامجًا فيه متغيرين هما x و y، يمثلان الإحداثيات الديكارتية لنقطة، واستعمل الجمل الشرطية لمعرفة إن كانت تلك النقطة في الربع الأول أو الثاني أو الثالث أو الرابع.
	</li>
</ul>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2016_02/img1.png.06c8c9358f4f5522634000f7109f4ef3.png" data-fileid="12766" data-fileext="png" rel=""><img alt="img1.thumb.png.1bfdb5e0050314477d742137f" class="ipsImage ipsImage_thumbnailed" data-fileid="12766" data-unique="wpho5eu2h" src="https://academy.hsoub.com/uploads/monthly_2016_02/img1.thumb.png.1bfdb5e0050314477d742137fde37dfd.png"></a><br clear="left">
	[مصدر الصورة: <a href="https://en.wikipedia.org/wiki/Cartesian_coordinate_system#/media/File:Cartesian_coordinates_2D.svg" rel="external nofollow">ويكيبيديا</a>]
</p>

<ul>
	<li>
		<p dir="rtl">
			فكِّر بمشاكل أخرى تتطلب "اتخاذًا للقرارات" وجربها باستخدام عبارة <span style="font-family:courier new,courier,monospace;">if</span> أو <span style="font-family:courier new,courier,monospace;">switch</span>، واسأل في التعليقات إن واجهتك أيّة صعوبات.
		</p>
	</li>
</ul>

<h2 dir="rtl">
	المصادر
</h2>

<ul dir="rtl">
	<li>
		المقال <a href="http://www.findalltogether.com/tutorial/conditional-statements-in-php/" rel="external nofollow">Conditional statements in php</a> لصاحبه Harish Kumar.
	</li>
	<li>
		صفحات <a href="http://php.net/manual/en/control-structures.if.php" rel="external nofollow">if</a> و <a href="http://php.net/manual/en/control-structures.else.php" rel="external nofollow">else</a> و <a href="http://php.net/manual/en/control-structures.elseif.php" rel="external nofollow">else-if</a> في دليل PHP وغيرها.
	</li>
	<li>
		<a href="https://academy.hsoub.com/php/" rel="">تعلم لغة PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">238</guid><pubDate>Tue, 09 Feb 2016 18:15:00 +0000</pubDate></item><item><title>&#x62A;&#x645;&#x647;&#x64A;&#x62F; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; PHP</title><link>https://academy.hsoub.com/programming/php/%D8%AA%D9%85%D9%87%D9%8A%D8%AF-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-php-r235/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_02/introduction-to-php.png.71a876862ba2139f3622992cef4a71cb.png" /></p>
<p dir="rtl" style="text-align: center;">
	<img alt="introduction-to-php.png.4ec2ee42786c7c5b" class="ipsImage ipsImage_thumbnailed" data-fileid="12595" data-unique="0pranjx0x" src="https://academy.hsoub.com/uploads/monthly_2016_02/introduction-to-php.png.4ec2ee42786c7c5b8a9d2b767a40486f.png">
</p>

<h2 dir="rtl">
	ما هي PHP؟
</h2>

<p dir="rtl">
	PHP هي اختصارٌ للعبارة PHP: Hypertext Preprocessor؛ وهي معروفةٌ كلغة سكربتات (scripting language) مُفسَّرة (interpreter) من جهة الخادوم تُستعمَل لتطوير الويب؛ وهذا يعني أنَّ <a href="https://academy.hsoub.com/php/" rel="">PHP </a>تُستعمَل على الخادوم لتوليد صفحات الويب الديناميكية. ما يُقصَد بصفحات الويب الديناميكية هي تلك الصفحات التي تُنشَأ أو تُعدَّل من الخادوم قبل إرسالها إلى العميل. إن لم تكن تعرف ما هو الخادوم وما هو العميل، فافتح لسانًا جديدًا في متصفح الويب الخاص بك واكتب فيه <a href="http://academy.hsoub.com/" rel="">academy.hsoub.com</a>، وبهذا يُصبِح متصفحك "عميلًا" (client) والمكان الذي تأتي منه صفحة الويب المطلوبة هو "الخادوم" (خادوم الويب أو web server).
</p>

<p dir="rtl">
	يمكن تضمين سكربتات PHP في مستندات HTML، وهي لغةٌ سهلة التعلم، وتشبه بنيتها كثيرًا البنية القاعدية للغات C و Java و Perl.
</p>

<h2 dir="rtl">
	التثبيت
</h2>

<p dir="rtl">
	يمكنك بسهولة تثبيت <a href="http://www.wampserver.com/en/" rel="external nofollow">WAMP</a> (على نظام ويندوز) أو <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-%D8%AD%D8%B2%D9%85-mysql-%D8%8Capache-%D8%8Clinux-lamp-%D9%88-php-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r27/" rel="">LAMP</a> (على لينُكس) أو حزمة البرمجيات <a href="https://www.apachefriends.org/download.html" rel="external nofollow">XAMPP</a> (التي تعمل على ويندوز، ولينُكس، وماك) وذلك تبعًا لنظام تشغيل حاسوبك، راجع مقال <a href="https://academy.hsoub.com/apps/web/wordpress/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%85%D8%AD%D9%84%D9%8A%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-mamp-r46/" rel="">كيفية تنصيب ووردبريس محليا باستخدام </a><a href="https://academy.hsoub.com/apps/web/wordpress/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%85%D8%AD%D9%84%D9%8A%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-mamp-r46/" rel="">MAMP</a> لمزيدٍ من المعلومات عن MAMP.
</p>

<h2 dir="rtl">
	تجربة الأمثلة
</h2>

<p dir="rtl">
	يمكنك تجربة سكربتات PHP عبر تثبيت خادم أباتشي مع دعم PHP يدويًا أو عبر تثبيت حزم جاهزة كالتي ذكرناها آنفًا، لكن توفِّر PHP لك طريقتين لتنفيذ الملفات: عبر سطر الأوامر، وعبر الخادوم المدمج مع PHP؛ وسنشرح كلا الطريقتين في هذا الدرس.
</p>

<h3 dir="rtl">
	استخدام الخادوم المدمج
</h3>

<p dir="rtl">
	وفَّرت PHP من الإصدار 5.4.0 خادومًا مدمجًا معها يُسهِّل تجربة السكربتات دون عبء تثبيت خادوم ويب كامل مثل أباتشي وضبطه؛ لكن الغرض منه هو تجربة البرامج فقط وليس مصممًا للاستعمال كخادوم إنتاجي على الشبكة.
</p>

<p dir="rtl">
	ستُخدَّم الملفات الموجودة في مجلد العمل الحالي عبر ذاك الخادوم المدمج، الذي يُشغَّل كالآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1347_15"><span class="pln">cd ~/public_html
php -S localhost:8000

PHP 5.5.9-1ubuntu4.5 Development Server started at Fri Jan 8 13:58:31 2016
Listening on http://localhost:8000
Document root is /home/user/public_html
Press Ctrl-C to quit.</span></pre>

<p dir="rtl">
	الأمر <span style="font-family:courier new,courier,monospace;">php -S localhost:8000</span> سيشغِّل الخادوم في مجلد العمل الحالي (<span style="font-family:courier new,courier,monospace;">‎~/public_html</span>) وسيكون متاحًا للوصول من الجهاز المحلي فقط، وسيعمل على المنفذ 8000؛ إن أردت أن يعمل على البطاقات الشبكية، فضع 0.0.0.0 بدلًا من localhost؛ اضغط على <span style="font-family:courier new,courier,monospace;">Ctrl+C</span> لإيقاف الخادوم.
</p>

<p dir="rtl">
	أنشِئ الملف<span style="font-family:courier new,courier,monospace;"> test.php </span>وضع فيه المحتويات الآتية لتجربه:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_10"><span class="pun">&lt;?</span><span class="pln">php
  </span><span class="com">// هذه تجربة لتنفيذ سكربتات PHP من الخادوم المدمج</span><span class="pln">
  echo </span><span class="str">"test"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	افتح الآن المتصفح وأدخِل <a href="http://localhost:8000/test.php%C2%BB" rel="external nofollow">http://localhost:8000/test.php</a> في شريط العنوان، وستحصل على نتيجة مشابهة لما يلي:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img1.png.8e713cf92389b18805a0e741f11caf3" class="ipsImage ipsImage_thumbnailed" data-fileid="12593" data-unique="oy0qnolir" src="https://academy.hsoub.com/uploads/monthly_2016_02/img1.png.8e713cf92389b18805a0e741f11caf33.png">
</p>

<p dir="rtl">
	يجدر بالذكر أنَّه بإمكانك تخديم صفحات HTML الثابتة عبر هذا الخادوم، وليس بالضرورة أن تكون الصفحة بلاحقة PHP.
</p>

<p dir="rtl">
	ملاحظة: اختر رقمًا أكبر من 1024 كرقم للمنفذ الذي سيستعمله الخادوم، كي لا تحتاج إلى امتيازات إدارية لتشغيله.
</p>

<h3 dir="rtl">
	استعمال سطر الأوامر
</h3>

<p dir="rtl">
	من البدهي أن تستطيع تنفيذ شيفرات PHP (كغيرها من لغات السكربتات) من سطر الأوامر؛ كل ما عليك فعله هو استدعاء السكربت من الأمر PHP كالآتي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="4"><span class="pln">php </span><span class="pun">~</span><span class="str">/public_html/</span><span class="pln">test</span><span class="pun">.</span><span class="pln">php</span></pre>

<p>
	<span style="line-height: 1.6;">أو يمكن تضمين ما يسمى shebang في الأنظمة الشبيهة بيونكس (كنظامَي لينُكس وماك) في بداية السكربت ليبدو كما يلي:</span>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_12"><span class="com">#!/usr/bin/php</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php
  </span><span class="com">// هذه تجربة لتنفيذ سكربتات PHP من سطر الأوامر</span><span class="pln">
  echo </span><span class="str">"test"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	وعندها تستطيع تنفيذ السكربت مباشرةً دون استدعاء مفسر PHP كما يلي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="4"><span class="pun">~</span><span class="str">/public_html/</span><span class="pln">test</span><span class="pun">.</span><span class="pln">php</span></pre>

<p>
	<span style="line-height: 1.6;"><strong>ملاحظة</strong>: لا تنسَ إعطاء الملف امتيازات التنفيذ قبل محاولة تنفيذه:</span>
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="4"><span class="pln">chmod </span><span class="pun">+</span><span class="pln">x </span><span class="pun">~</span><span class="str">/public_html/</span><span class="pln">test</span><span class="pun">.</span><span class="pln">php</span></pre>

<p>
	<span style="line-height: 1.6;">يمكن أيضًا تنفيذ الشيفرات تفاعليًا، عبر تنفيذ الأمر <span style="font-family:courier new,courier,monospace;">php -a </span>ثم كتابة الأوامر تفاعليًا كما يظهر في الصورة الآتية (لاحظ أنه بإمكانك استعمال زر tab لإكمال أسماء الدوال والأصناف وغيرها):</span>
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="img2.png.15550be977b0a65cb796b929d86c8a6" class="ipsImage ipsImage_thumbnailed" data-fileid="12594" data-unique="ezafkffma" src="https://academy.hsoub.com/uploads/monthly_2016_02/img2.png.15550be977b0a65cb796b929d86c8a62.png">
</p>

<h2 dir="rtl">
	البنية القاعدية للغة
</h2>

<p dir="rtl">
	لنأخذ مثالًا بسيطًا لنشرح فيه القواعد الأساسية للكتابة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_2166_7"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">/* author: Abd Allatif Eymsh
website: academy.hsoub.com
version: 1.0
date: 22 12 2015
*/</span><span class="pln">

</span><span class="com">// هذا تعليقٌ ذو سطرٍ وحيد</span><span class="pln">
</span><span class="com">// يتم تجاهل التعليقات من المفسِّر</span><span class="pln">

$variable </span><span class="pun">=</span><span class="pln"> </span><span class="str">'variable'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// نستعمل عبارة echo لطباعة الجمل</span><span class="pln">
echo </span><span class="str">"string"</span><span class="pun">;</span><span class="pln">
echo $variable</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	انسخ ما سبق والصقه في ملفٍ باسم<span style="font-family:courier new,courier,monospace;"> index.php</span> في مجلد <span style="font-family:courier new,courier,monospace;">htdocs</span> (في نظام ويندوز) أو <span style="font-family:courier new,courier,monospace;">www</span> (في لينُكس) أو أي مكان تريده إن كنت تستعمل الخادوم المدمج، ثم افتح ذاك الملف في متصفح الويب (بعد أن تُشغِّل الخادوم) وستحصل على النتيجة "stringvariable"، لنُقسِّم الآن الملف ولنشرح بنيته.
</p>

<ul dir="rtl">
	<li>
		تُكتَب شيفرات PHP في ملفٍ بامتداد <span style="font-family:courier new,courier,monospace;">‎.php</span>
	</li>
	<li>
		تُكتَب شيفرات PHP بين وسمَيّ البداية ‎<span style="font-family:courier new,courier,monospace;">&lt;?php</span> والنهاية <span style="font-family:courier new,courier,monospace;">‎?&gt;</span>‎
	</li>
	<li>
		وكما في لغتَيّ C أو Perl، تتطلب PHP أن تنتهي التعليمات البرمجية بفاصلة منقوطة "<span style="font-family:courier new,courier,monospace;">;</span>"
	</li>
	<li>
		يُشير الرمز <span style="font-family:courier new,courier,monospace;">$</span> إلى متغير (variable)، سنتحدث عن المتغيرات في هذا الدرس لاحقًا
	</li>
	<li>
		تكافئ علامات الاقتباس المفردة والمزدوجة بعضها (لكنها ليس لها نفس المعنى تمامًا، سنشرح الاختلاف البسيط لاحقًا)
	</li>
	<li>
		يُستعمَل الأمر <span style="font-family:courier new,courier,monospace;">echo</span> لطباعة البيانات
	</li>
</ul>

<h2 dir="rtl">
	التعليقات
</h2>

<p dir="rtl">
	التعليقات جزءٌ من البرنامج لا ينفِّذها مُفسِّر اللغة؛ وهي ملاحظاتٌ لكي يتذكر القارئ أو يفهم أمرًا برمجيًا ما لاحقًا. وهنالك نوعان من التعليقات:
</p>

<ul dir="rtl">
	<li>
		<strong>التعليقات ذات السطر الوحيد</strong>: وهذه التعليقات قصيرةٌ تمتد لسطرٍ وحيدٍ فقط، وتبدأ عادةً بالرمز "<span style="font-family:courier new,courier,monospace;">//</span>"، ولا بأس أن يكون قبلها تعليماتٌ برمجية، لكن التعليق سينتهي مع نهاية السطر؛ ويستحق أن نذكر أننا نستطيع أن نبدأ التعليقات ذات السطر الوحيد برمز المربع (<span style="font-family:courier new,courier,monospace;">#</span>) بدلًا من شرطتين مائلتين.
	</li>
	<li>
		<strong>التعليقات متعددة الأسطر</strong>: وهي تعليقاتٌ طويلة، قد تمتد لأكثر من سطر؛ وتوضع بين علامة البداية ‎<span style="font-family:courier new,courier,monospace;">/*</span>‎ وعلامة النهاية ‎<span style="font-family:courier new,courier,monospace;">*/‎</span>، ومن استعمالات هذا النوع من التعليقات أيضًا هي تعطيل جزء من الشيفرة ﻷغراض التجربة.
	</li>
</ul>

<p dir="rtl">
	يمكنك أن ترى نوعَيّ التعليقات السابقين في المثال أعلاه.
</p>

<h2 dir="rtl">
	المتغيرات
</h2>

<p dir="rtl">
	تسمح لك المتغيرات بتخزين ومعالجة البيانات في السكربتات، ويمكنك اعتبارها شبيهةً بالمتغيرات التي تستعملها في الرياضيات؛ إذ أنَّ المتغير -ببساطة- هو حاويةٌ تحوي قيمةً معيّنة؛ أُطلِقَت تسمية "المتغيرات" عليها لأنها القيمة المُسنَدة إليها قد تتغير أثناء تنفيذ السكربت، وقابلية التغير تلك تجعل من المتغيرات أداةً مفيدةً جدًا.
</p>

<p dir="rtl">
	وكما ذكرنا سابقًا، يبدأ اسم المتغير بالإشارة <span style="font-family:courier new,courier,monospace;">$</span>. هذه بعض الأمثلة عن أسماءٍ صحيحةٍ للمتغيرات:
</p>

<ul dir="rtl">
	<li>
		‎$simple
	</li>
	<li>
		‎$_start_with_underscore
	</li>
	<li>
		‎$_includes_numbers_23
	</li>
	<li>
		‎$_includes_UPPERCASE_2
	</li>
	<li>
		‎$_23_it_is_valid
	</li>
</ul>

<p dir="rtl">
	<strong>ملاحظة</strong>: لا يمكنك بدء اسم المتغير برقمٍ كالاسم الآتي ‎<span style="font-family:courier new,courier,monospace;">$2_invalid_variable_name</span>، ولا يمكن أيضًا أن تستعمل الشرطة "<span style="font-family:courier new,courier,monospace;">-</span>" في اسمه.
</p>

<h2 dir="rtl">
	أنواع البيانات
</h2>

<p dir="rtl">
	أنواع البيانات (data types) هي أنواع المتغيرات في PHP؛ وأنواعُ البياناتِ البسيطة في PHP هي:
</p>

<ul dir="rtl">
	<li>
		الأعداد الصحيحة (integers)
	</li>
	<li>
		الأعداد ذات الفاصلة (floats)
	</li>
	<li>
		السلاسل النصيّة (strings)
	</li>
	<li>
		القيم المنطقية البوليانية (صح [true] أو خطأ [false])؛
	</li>
	<li>
		وهنالك أنواع بياناتٍ أخرى مثل الكائنات (objects) والمصفوفات (arrays) سنتحدث عنها لاحقًا في هذه السلسلة.
	</li>
</ul>

<p dir="rtl">
	<strong>ملاحظة</strong>: إن كانت لديك معلوماتٌ سابقة عن إحدى لغات البرمجة التي تُحدِّد نوع البيانات المُخزَّنة في المتغيرات (أي strongly typed)، فاعلم أنَّ PHP هي لغةٌ لا تتطلب منك تحديد النوع (أي أنها loosely typed)؛ فلا تحتاج إلى أن تخبر اللغة ما نوع البيانات التي ستُخزَّن في المتغير.
</p>

<h2 dir="rtl">
	الثوابت
</h2>

<p dir="rtl">
	الثابت هو مُعرِّف (أي اسم) يحمل قيمةً معيّنة، وكما يوحي اسمه، لن تتغير قيمته أثناء تنفيذ السكربت بعد أن تُعرَّف لأول مرة، واسمه حساسٌ لحالة الأحرف، وتُستعمَل الأحرف الكبيرة فيه عادةً؛ وله نفس قواعد تسمية المتغيرات (لا يجوز أن يبدأ برقم، أو يحتوي على شرطة…)، لكن لا يوضع الرمز <span style="font-family:courier new,courier,monospace;">$</span> قبله.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_19"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">/* author: Abd Allatif Eymsh
website: academy.hsoub.com
version: 1.0
date: 22 12 2015
*/</span><span class="pln">

</span><span class="com">// هذا تعليقٌ ذو سطرٍ وحيد</span><span class="pln">

$variable </span><span class="pun">=</span><span class="pln"> </span><span class="str">'variablename'</span><span class="pun">;</span><span class="pln">

echo </span><span class="str">"string"</span><span class="pun">;</span><span class="pln">

echo $variable</span><span class="pun">;</span><span class="pln">

define</span><span class="pun">(</span><span class="pln"> </span><span class="str">"MY_CONSTANT"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"19"</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.14</span><span class="pun">);</span><span class="pln">

echo PI</span><span class="pun">;</span><span class="pln">

echo MY_CONSTANT</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	تكون <span style="font-family:courier new,courier,monospace;">PI</span> و <span style="font-family:courier new,courier,monospace;">MY_CONSTANT</span> ثوابت في المثال السابق.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: يمكن استعمال الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">const</span> لتعريف الثوابت بدلًا من الدالة<span style="font-family:courier new,courier,monospace;"> define()‎</span> في إصدار PHP 5.3 وما بعده كما يلي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_21"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="com">// تعمل في إصدار PHP 5.3</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> CONSTANT </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Hello World'</span><span class="pun">;</span><span class="pln">
echo CONSTANT</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	لكن لا يمكن تعريف الثوابت باستخدام <span style="font-family:courier new,courier,monospace;">const</span> داخل الدوال أو الحلقات، لأنها تُعرَّف في وقت التصريف (compile-time).
</p>

<h2 dir="rtl">
	المعاملات
</h2>

<p dir="rtl">
	يأخذ المعامل قيمةً أو أكثر (أو "تعبيرًا" [expressions] كما نقول في الاصطلاحات البرمجية) ويُنتِج قيمةً أخرى. يمكن أن تُجمَّع المعاملات بناءً على عدد القيم التي تأخذها، فمثلًا المعاملات الأحادية (unary operators) تأخذ قيمةً واحدةً فقط (مثل معامل الزيادة الذي شرحناها أدناه)، والمعاملات الثنائية تأخذ قيمتين مثل المعاملات الحسابية البسيطة (الجمع والطرح والضرب…) وتُصنَّف أغلبية المعاملات في PHP ضمن هذا القسم؛ وهنالك معامل ثلاثي وحيد يأخذ ثلاث قيم سنشرحه في درسٍ لاحق.
</p>

<p dir="rtl">
	هنالك عددٌ كبيرٌ من المعاملات في لغة PHP، أهمها:
</p>

<ol dir="rtl">
	<li>
		المعاملات الحسابية
	</li>
	<li>
		الإسناد
	</li>
	<li>
		معاملات الأعداد الثنائية (Bitwise)
	</li>
	<li>
		معاملات المقارنة
	</li>
	<li>
		الزيادة أو الإنقاص
	</li>
	<li>
		معامل السلاسل النصية
	</li>
</ol>

<p dir="rtl">
	المعاملات الحسابية هي تلك المعاملات التي تستعملها في الحسابات الرياضية، مثل الجمع (+)، والطرح (-)، والضرب (*)، والقسمة (/)، وباقي القسمة (%)؛ مثال:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="4"><span class="pln">$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</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"> </span><span class="com">// + هو معامل حسابي</span><span class="pln">
</span></pre>

<p>
	<span style="line-height: 1.6;">لاحظ الفرق بين المعاملين <strong>/</strong> و <strong>%</strong>، إذ أنَّ <strong>/</strong> هو معامل القسمة بينما <strong>%</strong> هو باقي القسمة؛ أي <strong>‎8 /5‎ = 1.6</strong> ‎‎، بينما ‎<strong>8 % 5 = 3</strong> (إذ أنَّ ‎8 = 5 *1 +3، فإن باقي القسمة هو 3).</span>
</p>

<p dir="rtl">
	أما معامل الإسناد، فيسند القيم إلى المتغيرات، وهو إشارة <strong>=</strong> كما في المثال الآتي: ‎<span style="font-family:courier new,courier,monospace;">$a = 4;‎</span>.
</p>

<p dir="rtl">
	تجري المعاملات الثنائية العمليات الحسابية على البتات الموجودة في الأعداد الصحيحة، وهي <strong>&amp;</strong> ‏(and)، و <strong>| </strong>‏(or)، و <strong>&gt;&gt; </strong>(الإزاحة نحو اليسار)، و<strong> &lt;&lt; </strong>(الإزاحة نحو اليمين)، و <strong>^</strong> ‏(XOR)، و <strong>~</strong> (NOR)؛ مثال على ذلك هو ‎<strong>14 &amp; 3 = 2</strong>‎، لأنَّ <strong>‎00001110 &amp; 00000011 = 00000010</strong>‎.
</p>

<p dir="rtl">
	أما معاملات المقارنة، فهي -كما يدل اسمها- تقارن بين قيمتين؛ يُظهِر الجدول الآتي معاملات المقارنة الشائعة:
</p>

<table cellpadding="4" cellspacing="0" dir="rtl" style="border: 1px solid black;" width="100%">
	<colgroup>
		<col width="85*">
		<col width="85*">
		<col width="85*">
	</colgroup>
	<tbody>
		<tr valign="top">
			<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.04in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<strong><font face="Droid Arabic Naskh"><span lang="ar-SY">المثال</span></font></strong>
				</p>
			</td>
			<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.04in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<strong><font face="Droid Arabic Naskh"><span lang="ar-SY">اسم المعامل</span></font></strong>
				</p>
			</td>
			<td style="border: 1px solid #000000; padding: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<strong><font face="Droid Arabic Naskh"><span lang="ar-SY">النتيجة</span></font></strong>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a == $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">المساواة</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">مساويًا بالقيمة إلى المتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a === $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">مطابقة</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">مساويًا المتغير ‎</span></font><font style="font-size: 12pt">$b </font><font face="Droid Arabic Naskh"><span lang="ar-SY">بالقيمة والنوع</span></font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a != $b</font>
				</p>

				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a &lt;&gt; $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">عدم مساواة</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن لم يكن المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">مساويًا للمتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a !== $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">عدم مطابقة</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن لم يكن المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">مساويًا للمتغير ‎</span></font><font style="font-size: 12pt">$b </font><font face="Droid Arabic Naskh"><span lang="ar-SY">بالقيمة أو بالنوع</span></font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a &lt; $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">أصغر من</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">أصغر تمامًا من المتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a &gt; $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">أكبر من</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">أكبر تمامًا من المتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a &lt;= $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">أصغر من أو يساوي</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western" style="text-align: center;">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">أصغر أو يساوي المتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$a &gt;= $b</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="33%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">أكبر من أو يساوي</span></font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="33%">
				<p class="western">
					<font style="font-size: 12pt">TRUE </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إن كان المتغير ‎</span></font><font style="font-size: 12pt">$a </font><font face="Droid Arabic Naskh"><span lang="ar-SY">أكبر أو يساوي المتغير ‎</span></font><font style="font-size: 12pt">$b</font>
				</p>
			</td>
		</tr>
	</tbody>
</table>

<p>
	<span style="line-height: 1.6;">تستعمل معاملات الزيادة أو الإنقاص لزيادة أو إنقاص قيمة المتغير بقيمة 1.</span>
</p>

<table cellpadding="4" cellspacing="0" dir="rtl" style="border: 1px solid black;" width="100%">
	<colgroup>
		<col width="128*">
		<col width="128*">
	</colgroup>
	<tbody>
		<tr valign="top">
			<td style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.04in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="50%">
				<p class="western" style="text-align: center;">
					<strong><font face="Droid Arabic Naskh"><span lang="ar-SY">المثال</span></font></strong>
				</p>
			</td>
			<td style="border: 1px solid #000000; padding: 0.04in" width="50%">
				<p class="western" style="text-align: center;">
					<strong><font face="Droid Arabic Naskh"><span lang="ar-SY">شرحه</span></font></strong>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="50%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">++$x;‎</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="50%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">إضافة القيمة </span></font><font style="font-size: 12pt">1 </font><font face="Droid Arabic Naskh"><span lang="ar-SY">إلى المتغير ‎</span></font><font style="font-size: 12pt">$x </font><font face="Droid Arabic Naskh"><span lang="ar-SY">ثم إعادة القيمة النهائية</span></font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="50%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$x++;‎</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="50%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">إعادة قيمة المتغير ‎</span></font><font style="font-size: 12pt">$x </font><font face="Droid Arabic Naskh"><span lang="ar-SY">ثم إضافة </span></font><font style="font-size: 12pt">1</font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="50%">
				<p class="western" style="text-align: center;">
					‎–<font style="font-size: 12pt">-$x;‎</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="50%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">إنقاص القيمة </span></font><font style="font-size: 12pt">1 </font><font face="Droid Arabic Naskh"><span lang="ar-SY">من المتغير ‎</span></font><font style="font-size: 12pt">$x </font><font face="Droid Arabic Naskh"><span lang="ar-SY">ثم إعادة القيمة النهائية</span></font>
				</p>
			</td>
		</tr>
		<tr valign="top">
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in" width="50%">
				<p class="western" style="text-align: center;">
					‎<font style="font-size: 12pt">$x–-;‎</font>
				</p>
			</td>
			<td style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0in; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in" width="50%">
				<p class="western" style="text-align: center;">
					<font face="Droid Arabic Naskh"><span lang="ar-SY">إعادة قيمة المتغير ‎</span></font><font style="font-size: 12pt">$x </font><font face="Droid Arabic Naskh"><span lang="ar-SY">ثم إنقاص </span></font><font style="font-size: 12pt">1</font>
				</p>
			</td>
		</tr>
	</tbody>
</table>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_23"><span class="pun">&lt;?</span><span class="pln">php

echo </span><span class="str">"Postincrement"</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">"Should be 5: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">++;</span><span class="pln">
echo </span><span class="str">"Should be 6: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">

echo </span><span class="str">"Preincrement"</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">"Should be 6: "</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">
echo </span><span class="str">"Should be 6: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">

echo </span><span class="str">"Postdecrement"</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">"Should be 5: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">--;</span><span class="pln">
echo </span><span class="str">"Should be 4: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">

echo </span><span class="str">"Predecrement"</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">"Should be 4: "</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">
echo </span><span class="str">"Should be 4: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $a</span><span class="pun">;</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p>
	<span style="line-height: 1.6;">معامل السلاسل النصية (.) يستعمل لجمع سلسلتين نصيتين أو متغيرين مع بعضهما بعضًا؛ انظر إلى الشيفرة الآتي:</span>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1347_25"><span class="pun">&lt;?</span><span class="pln">php

$a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
$q </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</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">$q</span><span class="pun">;</span><span class="pln"> </span><span class="com">// المتغيران $a و $b أصبحا مدمجين مع بعضهما</span><span class="pln">

echo $c</span><span class="pun">;</span><span class="pln">

$n </span><span class="pun">=</span><span class="pln"> </span><span class="str">'myname'</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">"string "</span><span class="pun">.</span><span class="pln">$n</span><span class="pun">.</span><span class="str">' $n inserted'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// دمج ثلاث سلاسل نصيّة</span><span class="pln">

</span><span class="pun">?&gt;</span></pre>

<p dir="rtl">
	حاول أن تتدَّرب على تعريف وطباعة قيمة المتغيرات الخاصة بك، وأن تستعمل مختلف المعاملات السابقة عليها.
</p>

<h2 dir="rtl">
	المصادر
</h2>

<ul dir="rtl">
	<li>
		مقال <a href="http://www.findalltogether.com/tutorial/introduction-to-php/" rel="external nofollow">Introduction to PHP</a> لصاحبه Harish Kumar.
	</li>
	<li>
		صفحة <a href="http://php.net/manual/en/language.operators.php" rel="external nofollow">Operators</a> من دليل PHP، وغيرها.
	</li>
</ul>
]]></description><guid isPermaLink="false">235</guid><pubDate>Fri, 05 Feb 2016 20:42:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; Composer &#x648;&#x644;&#x645;&#x627;&#x630;&#x627; &#x64A;&#x62C;&#x628; &#x639;&#x644;&#x649; &#x643;&#x644; &#x645;&#x637;&#x648;&#x631; PHP &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647;</title><link>https://academy.hsoub.com/programming/php/%D9%85%D8%A7-%D9%87%D9%88-composer-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%89-%D9%83%D9%84-%D9%85%D8%B7%D9%88%D8%B1-php-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r10/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/composer_480x300.png.dfbfa5998b710045b7987ecc06db4342.png" /></p>

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

<p style="text-align:center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_02/logo-composer-transparent.png.91a2a4a2d3327f2ae2f0142cb92a6513.png" rel="" data-fileid="13"><img alt="logo-composer-transparent.thumb.png.3104" class="ipsImage ipsImage_thumbnailed" data-fileid="13" src="https://academy.hsoub.com/uploads/monthly_2015_02/logo-composer-transparent.thumb.png.3104b077612a977f3a9603da5f15cca2.png"></a>
</p>

<p>
	مُطور PHP من العصر الحجري سيقوم بالتالي: سيقوم بتحميل نُسخة من إطار العمل، ومن ثم يقوم بإنشاء مُجلد يضع فيه المكتبات الإضافية التي يحتاجها ومن ثم يُحاول فهم آلية عملها ليربطها ببعضها البعض. قد تؤتي هذه الطريقة أكلها، وقد تسمح لك بتطوير مشروعك "من دون أية مشاكل"، لكن ماذا يحدث مثلا لو تم إطلاق تحديث لأي من المكتبات التي تعتمد عليها؟ هل ستقوم بإعادة تحميلها من جديد واستبدال الإصدار القديم بالجديد؟ هل يُمكن أن تفعل ذلك لو كنت تستخدم أكثر من مكتبة يعتمد بعضها على بعض؟ لست متأكدا من ذلك. لكن ما هو البديل؟ إن سبق لك أن استخدمت لُغات <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">برمجة </a>أخرى كـ javascript مع node.js أو ruby فإنه سبق لك أن تعاملت مع ما يُطلق عليه اسم مدير الحزم Package manager، حيث يتم استخدام npm مع node مثلا لتنصيب حزم وإضافات لـ node. يُمكن القول بأن موضع composer من PHP هو موضع npm من node.js، حيث يُتيح composer تحميل المكتبات التي تحتاجها في مشروعك والإبقاء عليها مُحدثة دون الحاجة إلى تحميلها ونقلها يدويا. رغم كل ذلك يُشير موقع composer الرسمي بأنه لا يُمكن أن نُطلق عليه اسم مُدير حزم بحكم أنه لا يقوم بتنصيب هذه الحزم بشكل عام على النظام global بل تتم إدارة الحزم داخل كل مشروع بشكل محلي، ولهذا يُطلق عليه وصف مُدير الاعتمادات Dependency Manager.
</p>

<h2>
	تنصيب composer
</h2>

<p>
	دعونا من الجانب النظري ولنقم بتنصيب composer ولنلق نظرة على كيفية استخدامه. بالرغم من أنه يُمكن تنصيبه بشكل محلي داخل كل مشروع إلا أنه يُفضل تنصيبه بشكل عام على النظام. على أنظمة Linux/Unix يكفي تنفيذ الأمرين التاليين لتنصيب composer:
</p>

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pln">$ curl </span><span class="pun">-</span><span class="pln">sS https</span><span class="pun">:</span><span class="com">//getcomposer.org/installer | php</span><span class="pln">
$ 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="kwd">local</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">composer</span></pre>

<p>
	قد تحتاج إلى إضافة sudo قبل الأمر الثاني إن احتجت إلى صلاحيات مدير النظام لتنفيذ الأمر.
</p>

<p>
	أما على أنظمة Windows فيكفي تحميل وتنصيب <a href="https://getcomposer.org/download/" rel="external nofollow">التطبيق الرسمي الخاص به</a>.
</p>

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

<h2>
	استخدام Composer
</h2>

<p>
	الآن وبعد أن قمنا بتنصيب composer سنحتاج إلى إنشاء ملف composer.json نقوم من خلاله بإعلام composer بالحزم التي نود إرفاقها والاعتماد عليها في مشروعنا الجديد، كما أنه يُمكن لهذا الملف أن يحتوي على بيانات أخرى سنحتاجها في بناء المشروع.
</p>

<p>
	يكون ملف composer.json في شكله الأبسط على النحو التالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pun">{</span><span class="pln">
    </span><span class="str">"require"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"monolog/monolog"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"1.0.*"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في هذا المثال فإننا نعتمد على الإصدار 1.0.* من مكتبة monolog . بطبيعة الحال يُمكن الاعتماد على أكثر من مكتبة في مشروعنا الحالي، حيث يكفي إضافة سطر جديد لكل مكتبة ما بين حاضنتي require ويتكون كل سطر من اسم المكتبة (الذي عادة ما يحتوي على اسم الجهة المُنتجة لها متبوعة باسمها، وعادة ما يكون نفس الاسم مُكررا مرتين) إضافة إلى رقم الإصدار الذي نرغب فيه.
</p>

<p>
	يُمكن إيجاد هذه المكتبات وآليات إضافتها إلى مشروعك الخاص بالبحث على موقع <a href="https://packagist.org/" rel="external nofollow">https://packagist.org/</a>.
</p>

<p>
	الآن وبعد أن حددنا المكتبات التي نرغب فيها يكفي أن نقوم بتنفيذ الأمر
</p>

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pln">composer install</span></pre>

<p>
	أو
</p>

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pln">php composer</span><span class="pun">.</span><span class="pln">phar install</span></pre>

<p>
	في حال ما إذا لم تقم بنقل composer.phar إلى مُجلد مساره موجود في مُتغير PATH الخاص بالنظام. سيقوم composer بتحميل جميع تلك المكتبات ووضعها داخل مُجلد vendor الذي سيتم إنشاؤه داخل مُجلد المشروع الحالي.
</p>

<h2>
	Autoloading
</h2>

<p>
	ولتجنيب المُطور من اللجوء إلى استدعاء هذه المكتبات واحدة واحدة لدى كتابته لمشروعه، يقوم composer بإنشاء ملف vendors/autoloader.php الذي يتولى إدارة ذلك حيث يكفي استدعاء هذا الملف لتتمكن من استخدام المكتبات التي حملتها من دون الحاجة إلى القيام بذلك يدويا:
</p>

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pun">&lt;?</span><span class="pln">php
require_once </span><span class="str">"vendors/autoloader.php"</span><span class="pun">;</span></pre>

<h2>
	تحديث المكتبات
</h2>

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

<pre class="php ipsCode prettyprint prettyprinted" style="">
<span class="pln">composer update</span></pre>

<p>
	بطبيعة الحال إن كنت قد حددت إصدارا مُعينا في ملف composer.json فإنك لن تحصل على الإصدارات الأحدث ما لم تقم بتحديد الإصدار بشكل يسمح بالترقية الآلية. بعبارة أخرى إذا كنت تستعمل مثلا إطار عمل Laravel وقمت بإضافته باستخدام السطر التاليينlaravel/framework": "4.1.* فإنه سيتم التحديث إلى إصدار في التفرع 4.1 ولن يتم المرور إلى الإصدارات 4.2 أو التي تليها.
</p>

<h2>
	Packagist
</h2>

<p>
	Packagist عبارة عن موقع يتم تجميع فيه مكتبات PHP مفتوحة المصدر المتوفر للاستعمال من طرف الجميع باستخدام composer. حسب التوثيق الرسمي لـ composer فإنه لا يُشترط في المكتبة أن تكون على Packagist ليتم استدعاؤها من طرف Composer إلا أنه يُفضل إن أردت توفير مكتبتك للجميع أن تُسجلها على هذا الموقع.
</p>

<h2>
	خلاصة
</h2>

<p>
	إن كنت مُطور PHP وكنت تود أن تتطور مع تطور هذه اللغة وأن لا تبقى حبيس الإصدارات القديمة منها (الإصدار 4؟) فإنه يجب عليك أن تتبع أسلوبا مُختلفا في التطوير عن أسلوب مُطور PHP من العصر الحجري. من بين أولى الخطوات التي ستخطوها للوصول إلى ذلك هو الاستعانة بـ composer في جميع مشاريعك التي تعمل عليها حيث يُعتبر الغراء الذي يُلصق مُكونات مشروعك بعضها ببعض ويُسهل عليك مهمة التطوير.
</p>

<p>
	للمزيد حول composer وحول مُختلف المكتبات التي يُمكن الاستعانة بها في مشروعك قم بزيارة <a href="https://getcomposer.org/" rel="external nofollow">موقعه الرسمي</a> وموقع <a href="https://packagist.org/" rel="external nofollow">Packagist</a>.
</p>
]]></description><guid isPermaLink="false">10</guid><pubDate>Sat, 14 Jun 2014 16:24:00 +0000</pubDate></item></channel></rss>
