اذهب إلى المحتوى

البدء مع PHP والتعرف على أنواع البيانات فيها


سارة محمد2

إصدارات PHP

نسخة PHP 7.x:

النسخة مدعومة حتى تاريخ تاريخ الإصدار
7.4 2021-11-28 2019-11-28
7.3 2020-12-06 2018-12-06
7.2 2019-11-30 2017-11-30
7.1 2019-12-01 2016-12-01
7.0 2019-01-10 2015-12-03

نسخة PHP 5.x:

النسخة مدعومة حتى تاريخ تاريخ الإصدار
5.6 2018-12-31 2014-08-28
5.5 2016-07-21 2013-06-20
5.4 2015-09-03 2012-03-01
5.3 2014-08-14 2009-06-30
5.2 2011-01-06 2006-11-02
5.1 2006-08-24 2005-11-24
5.0 2005-09-05 2004-07-13

نسخة PHP 4.x:

النسخة مدعومة حتى تاريخ تاريخ الإصدار
4.4 2008-08-07 2005-07-11
4.3 2005-03-31 2002-12-27
4.2 2002-09-06 2002-04-22
4.1 2002-03-12 2001-12-10
4.0 2001-06-23 2000-05-22

النسخ القديمة:

النسخة مدعومة حتى تاريخ تاريخ الإصدار
3.0 2000-10-20 1998-06-06
2.0   1997-11-01
1.0   1995-06-08

تثبيت بيئة PHP

نظام ويندوز

تنزيل وتثبيت واستخدام wamp

WampServer بيئة تطوير ويب على نظام ويندوز، يتيح لنا إنشاء تطبيقات ويب باستخدام Apache2 وPHP وقاعدة البيانات MySQL كما أنّ PhpMyAdmin يسمح لنا بإدارة قواعد البيانات بسهولة.

WampServer متوفر مجانًا (بموجب ترخيص GPML) بإصدارين مختلفين: 32 و64 بت، Wampserver 2.5 غير متوافق مع ويندوز XP وSP3 وويندوز سيرفر 2003، وتتوفر إصدارات أقدم منه في SourceForge.

توفر WampServer حاليًا:

  • Apache
  • MySQL
  • PHP

تثبيت WampServer بسيط جدًا، نزل آخر إصدار من الموقع الرسمي له WampServer، فقط نفّذ المثبت واختر الموقع ثم أنهِ، وبعدها يمكنك بدء تشغيل WampServer وسيبدأ في لوحة النظام (شريط المهام) باللون الأحمر بدايةً ثم يتغير للون الأخضر عندما يصبح الخادم جاهزًا، ويمكنك بعدها الذهاب إلى المتصفح وكتابة localhost أو 127.0.0.1 لتحصل على صفحة WAMP الرئيسية. يمكنك من الآن بدء العمل على PHP محليًا بتخزين الملفات في المسار <PATH_TO_WAMP>/www/<php_or_html_file> والتحقق من النتيجة على الرابط http://localhost/.

تثبيت PHP واستخدامها مع IIS

تحتاج بدايةً أن يكون عندك IIS (‏Internet Information Service) مثبّتًا وتنفّذه على جهازك، لا يتوفر لديك افتراضيًا إنما تحتاج أن تضيف خصائصه من: لوحة التحكم -> البرامج -> خصائص ويندوز

  • ثبّت نسخة PHP التي تريدها من هذا الموقع وتأكد من تنزيل إصدارات آمنة غير خيطية (NTS).
  • استخرج الملفات في المسار C:\PHP\‎.
  • شغّل IIS (‏Internet Information Service).
  • اختر العنصر الجذر من اللوحة اليسارية.
  • انقر مرتين على Handler Mappings.
  • انقر على Add Module Mapping في اللوحة الجانبية اليمينية.
  • اضبط القيم كالتالي:
Request Path: *.php
Module: FastCgiModule
Executable: C:\PHP\php-cgi.exe
Name: PHP_FastCGI
Request Restrictions: Folder or File, All Verbs, Access: Script
  • ثبّت vcredist_x64.exe أو vcredist_x86.exe (حزمة Visual C++ 2012 قابلة لإعادة التوزيع) من هذا الرابط.
  • اضبط ملف C:\PHP\php.ini وخاصةً extension_dir ="C:\PHP\ext"‎.
  • أعد ضبط IIS، اكتب في طرفية الأوامر DOS الأمر IISRESET.

يمكنك اختياريًا تثبيت مدير PHP من أجل IIS والذي يساعدك بشكلٍ كبير لضبط ملف ini وتتبع تسجيلات الأخطاء (لا يعمل على نظام التشغيل ويندوز 10)، وتذكر أن تضبط index.php على أنها إحدى صفحات IIS الافتراضية.

إذا اتبعت دليل التثبيت فأنت جاهز الآن لاختبار PHP.

يملك IIS مثل لينوكس هيكلية مجلدات على الخادم، جذر هذه الشجرة هو C:\inetpub\wwwroot\‎ وهنا نقطة الدخول لكل ملفاتك العامة وسكربتات PHP.?

استخدم الآن محررك الخاص أو المحرر Notepad الموجود في ويندوز واكتب التالي:

<?php
header('Content-Type: text/html; charset=UTF-8');
echo '<html><head><title>Hello World</title></head><body>Hello world!</body></html>';

احفظ هذا الملف في المسار C:\inetpub\wwwroot\index.php باستخدام الترميز UTF-8 (بدون BOM)، ثم افتح موقعك الجديد على العنوان التالي http://localhost/index.php.

تنزيل وتثبيت XAMPP

ما هو XAMPP؟ XAMPP هو بيئة تطوير PHP الأشهر، مجاني بالكامل ومفتوح المصدر وسهل لتثبيت توزيعة Apache متضمنةً MariaDB وPHP وPerl.

من أين يجب تنزيله؟ نزّل الإصدار المناسب المستقر من صفحة التنزيل، واختره بناءً على نوع نظامك التشغيل (32 بت أو 64 بت) وإصدار PHP الذي يجب أن يدعمه.

أو يمكنك اتباع الخطوات التالية: يتوفر XAMPP من أجل نظام ويندوز في 3 أشكال:

  • مثبِّت: ربما تكون صياغة ‎.‎exe أسهل طريقة لتثبيت XAMPP.
  • ZIP: (للمتخصصين: XAMPP كأرشيف عادي بصياغة ‎.zip).
  • 7zip: (للمتخصصين مع عرض حزمة أقل، XAMPP كأرشيف بصياغة ‎.7zip).

كيف أثبّته وأين يجب أن أضع ملفات PHP/html؟

التثبيت باستخدام المثبِّت الموفَّر:

  • نفّذ مثبِّت خادم XAMPP بالنقر مرتين على ملف ‎.exe المنزَّل.

التنزيل من ZIP:

  • فك ضغط الأرشيف المضغوط في المجلد الذي تختاره.
  • سيُستخلص XAMPP إلى المجلد الفرعي C:\xampp داخل المجلد الهدف المُختار.
  • افتح الآن الملف setup_xampp.bat لتعديل إعدادات XAMPP بما يناسب نظامك.

ملاحظة: إذا اخترت المجلد الجذر C‎:\‎ كمجلد هدف عندها يجب ألا تبدأ ملف setup_xampp.bat.

ما بعد التثبيت استخدم لوحة تحكم XAMPP للقيام بمهام إضافية، مثل بدء/إيقاف Apache، ‏MySQL، ‏FileZilla وMercury أو تثبيتها كخدمات.

معالجة الملف التثبيت عملية سهلة مباشرة وعندما ينتهي التثبيت يمكنك إضافة ملفات html/php لتُستضاف على الخادم في المسار XAMPP-root/htdocs/‎ ثم شغّل الخادم وافتح الرابط http://localhost/file.php في المتصفح لمشاهدة الصفحة.

ملاحظة: الجذر الافتراضي للخادم XAMPP في ويندوز هو C:/xampp/htdocs/‎.

اكتب إحدى الرابطين التاليين في المتصفح:

http://localhost/
http://127.0.0.1/

يجب أن تشاهد صفحة البدء للخادم. [01.PNG]

أنظمة لينكس/يونكس

تثبيت سطر الأوامر باستخدام APT من أجل PHP 7

سيثبّت هذا PHP فقط، إذا أردت عرض ملف PHP على الويب ستحتاج أيضًا تثبيت خادم ويب مثل Apache أو Nginx أو استخدام خادم الويب المدمج الخاص بلغة PHP (في الإصدار 5.4 وما بعده).

إذا كنت تستخدم إصدار أبونتو أقل من 16.04 وتريد استخدام PHP 7 فيمكنك إضافة مستودع Ondrej PPA بكتابة الأمر:

sudo add-apt-repository ppa:ondrej/php

تأكد من أنّ كل مستودعاتك محدَّثة:

sudo apt-get update

بعد تحديث مستودعات نظامك، ثبّت PHP:

sudo apt-get install php7.0

لنختبر التثبيت بالتحقق من نسخة PHP:

php --version

يجب أن يكون الخرج مشابهًا للتالي:

PHP 7.0.8-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.8-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

يمكنك الآن تشغيل PHP من سطر الأوامر.

التثبيت في توزيعات إنتربرايس لينكس (CentOS، ‏Scientific Linux وغير ذلك)

استخدم الأمر dnf لإدارة الحزم في أنظمة التشغيل المعتمدة على توزيعات إنتربرايس لينوكس:

dnf install php

يثبت هذا نسخة PHP محدودة متضمنةً بعض الميزات الشائعة، وإذا احتجت وحدات إضافية ستحتاج تثبيتها بشكلٍ منفصل ويمكنك استخدام dnf للبحث عن هذه الحزم:

dnf search php-*

مثال عن الخرج:

================================= Name & Summary Matched: php-* =================================
php-di-symfony2-bridge.noarch : PHP-DI integration with Symfony
php-fedora-autoloader-devel.noarch : php-fedora-autoloader devel
php-mock.noarch : PHP-Mock can mock built-in PHP functions
php-mock2.noarch : PHP-Mock can mock built-in PHP functions
php-pecl-propro-devel.x86_64 : php-pecl-propro developer files (header)
php-pecl-psr-devel.x86_64 : php-pecl-psr developer files (header)
php-pecl-raphf-devel.x86_64 : php-pecl-raphf developer files (header)
php-punic.noarch : PHP-Unicode CLDR
php-zstd-devel.x86_64 : php-zstd developer files (header)

php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php-cli.x86_64 : Command-line interface for PHP
php-common.x86_64 : Common files for PHP
php-dba.x86_64 : A database abstraction layer module for PHP applications
php-devel.x86_64 : Files needed for building PHP extensions
php-embedded.x86_64 : PHP library for embedding in applications
php-enchant.x86_64 : Human Language and Character Encoding Support
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php-imap.x86_64 : A module for PHP applications that use IMAP

لتثبيت مكتبة gd:

dnf install php-gd

تعد توزيعات إنتربرايس لينكس متحفظة دومًا بخصوص التحديثات، ولا تُحدَّث عادةً بعد الإصدار الذي تُرسل معه. توفر عدة مستودعات خارجيةمن طرف ثالث الإصدارات الحالية من PHP:

يوفر المستودعان IUS وWebtatic حزمًا بديلة بأسماء مختلفة (مثل php56u أو php56w لتثبيت PHP 5.6) بينما يوفر مستودع Remi ترقيات موضعية باستخدام نفس أسماء حزم النظام.

فيما يلي تعليمات تثبيت PHP 7.0 من مستودع Remi، هذا أبسط مثال لإلغاء تثبيت حزم النظام غير المطلوبة.

# ‫تنزيل حزم RPM، استبدل 6 بالرقم 7 في حالة استخدام EL 7
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
wget http://rpms.remirepo.net/enterprise/remi-release-6.rpm

# تثبيت معلومات المستودع
rpm -Uvh remi-release-6.rpm epel-release-latest-6.noarch.rpm

# تمكين المستودع
dnf-config-manager --enable epel --enable remi --enable remi-safe --enable remi-php70

# ‫تثبيت الإصدار الجديد من PHP
# ملاحظة: إذا كانت حزمة النظام مثبّتة بالفعل سابقًا فإنّ هذا الأمر سيحدّثها
dnf install php

خرج HTML من خادم الويب

يمكن أن تُستخدم PHP لإضافة محتوى إلى ملفات HTML. تُعالج صفحات HTML مباشرةً في متصفح الويب أما سكربتات PHP ينفذها خادم الويب ثم يرسل ملف HTML الناتج إلى المتصفح.

تحوي صفحة HTML التالية تعليمة PHP ستضيف عبارة Hello world!‎ إلى الخرج:

<!DOCTYPE html>
<html>
    <head>
        <title>PHP!</title>
    </head>
    <body>
        <p><?php echo "Hello world!"; ?></p>
    </body>
</html>

عندما تُحفظ بتنسيق ملف برمجي بلغة PHP وينفذه خادم الويب فإنّه يرسل صفحة HTML التالية إلى المتصفح:

<!DOCTYPE html>
<html>
    <head>
        <title>PHP!</title>
    </head>
    <body>
        <p>Hello world!</p>
    </body>
</html>

PHP 5.x: الإصدار 5.4 وما بعده تتميز تعليمة echo بدءًا من الإصدار 5.4 ومابعده بصياغة مختصرة تتيح لك طباعة قيمة على الفور، أما قبل الإصدار PHP 5.4.0 كانت الصياغة المختصرة تعمل فقط عند تمكين الإعداد short open tag.

مثلًا، إنّ الشيفرة التالية:

<p><?= "Hello world!" ?></p>

خرجها مطابق للخرج الناتج عن الشيفرة:

<p><?php echo "Hello world!"; ?></p>

في بيئة الإنتاج يجب أن تهرّب كل بيانات الخرج الناتجة عن سكربت PHP بشكل صفحة HTML لمنع هجمات البرمجة عبر المواقع (XSS) أو تلف النص (text corruption).

يمكن الاطلاع أيضًا على: السلاسل النصية (strings) وPSR-1‎‏، التي تصف قواعد التنسيق بما في ذلك الاستخدام الأمثل للوسوم القصيرة (<‎?= ... ?‎>).

مرحبًا بالعالم!

البنية الأكثر استخدامًا لطباعة الخرج في لغة PHP هي echo:

echo "Hello, World!\n";

ويمكن استخدام print بدلًا من ذلك:

print "Hello, World!\n";

يؤدي تنفيذ كلا التعليمتين نفس الوظيفة مع اختلافات بسيطة:

  • ترجع echo قيمة من النوع void، بينما ترجع print عددًا صحيحًا قيمته 1.
  • يمكن أن تأخذ echo عدة وسائط (لكن بدون أقواس)، بينما تأخذ print وسيطًا واحدًا.
  • echo أسرع قليلًا من print.

كل من echo وprint هي بنى لغوية، ليست دوالًا. هذا يعني أنها لا تحتاج إلى أقواس لتضم وسائطها لكن يمكن إضافة الأقواس من أجل التناسق الجمالي مع التوابع. تتوافر العديد من الأمثلة عن استخدام echo وprint في مكانٍ آخر.

الدالة printf في لغة C والدوال التابعة لها متوافرة أيضًا، كما في المثال التالي:

printf("%s\n", "Hello, World!");

يمكن ملاحظة خرج قيمة المتغير للحصول على نظرة شاملة عن خرج المتغيرات في PHP.

خرج خادم الويب ليس شيفرة HTML

قد نحتاج عند العمل مع خادم ويب في بعض الحالات تجاوز نوع المحتوى الافتراضي الذي يرسله خادم الويب، فقد نحتاج مثلًا إلى إرسال البيانات على شكل نص عادي أو بصيغة JSON أو بصيغة XML.

يمكن للدالة ‏()header‏ إرسال ترويسة HTTP خام. يمكننا إضافة الحقل Content-Type إلى الترويسة لإعلام المتصفح بنوع المحتوى الذي نرسله.

في الشيفرة التالية نسند القيمة text/plain إلى الحقل Content-Type:

header("Content-Type: text/plain");
echo "Hello World";

سينتج هذا ملفًا نصيًا عاديًا بالمحتوى التالي:

Hello World

للحصول على محتوى ‏JSON‏ نستخدم نوع المحتوى application/json بدلًا من النوع السابق:

header("Content-Type: application/json");

// P‏H‎P‎ إنشاء مصفوفة بيانات في
$data = ["response" => "Hello World"];

// نصية صحيحة JSON سيحولها إلى صيغة json_encode 
echo json_encode($data);

هذا سينتج ملفًا من النوع application/json وبداخله المحتوى التالي:

{"response":"Hello World"}

لاحظ أنّه يجب استدعاء الدالة ‏()header‏ قبل تنفيذ أية عملية خرج، وإلا سيرسل خادم الويب الترويسات للإجابة (response headers). لذا وبحسب الشيفرة التالية:

// خطأ: لا يمكننا إرسال أية عملية خرج قبل إرسال الترويسات 
echo "Hello";

// يجب إرسال كل الترويسات قبل أيّ عملية خرج
header("Content-Type: text/plain");
echo "World";

سينتج عن هذا التحذير التالي:

Warning: Cannot modify header information - headers already sent by (output started at /dir/example.php:2) in /dir/example.php on line 3

عند استعمال الدالة ‏()header‏ فإنّ خرجها يجب أن يكون أول بايت يرسل من الخادم. لهذا السبب يُعد من المهم عدم وجود أسطر فارغة أو مسافات في بداية الملف قبل وسم البداية ‎‎<?php‎ الخاص بلغة PHP. وللسبب نفسه، يعدّ تجاهل وضع وسم الإغلاق <?‎‎ الخاص بلغة PHP في نهاية الملف عادةً جيدةً (انظرPSR-2‎‏) وذلك للملفات التي تحتوي فقط PHP وكتل الشيفرة المكتوبة بلغة PHP.

يجب مشاهدة قسم الخرج في المخزن المؤقت لمعرفة كيفية "جلب" المحتوى الخاص بك ووضعه في متغيّر قبل عملية إظهاره لاحقًا، مثلًا، بعد ترويسات الإخراج.

خادم PHP مدمج

يأتي الإصدار PHP 5.4 وما بعده مع خادم تطوير مدمج يمكن استخدامه لتشغيل التطبيقات بدون الحاجة لتنصيب خادم لتزويد الـ HTTP مثل nginx أو Apache. هذا الخادم المدمج مصمم ليستعمل لأغراض التطوير والاختبار.

يمكن أن يُشغَّل باستخدام الراية S–:

php  ‎–S <host/ip>:<port>

مثال عملي

  • أنشئ ملف index.php يحتوي على ما يلي:
<?php
    echo "Hello World from built-in PHP server";
  • نفّذ الأمر php -S localhost:8080 باستخدام سطر الأوامر، بدون أن تضيف ‎http‎:‎\‎\‎. عندها يبدأ خادم الويب بالتنصت على المنفذ 8080 ويعدّ المجلد الموجود أنت فيه حاليًا المستند الجذر.
  • افتح المتصفح وانتقل إلى http://localhost:8080. ستشاهد عندها صفحتك "Hello World".

الإعدادات

إن أردت تغيير الصفحة الجذر الافتراضية (أي المجلد الحالي)، استخدم الراية t–:

php -S <host/ip>:<port>  ‎–t <directory> 

مثلًا إذا كان لديك المجلد public‎/‎ في مشروعك يمكنك تنفيذ المشروع من هذا المجلد باستخدام الأمر:

php –S localhost:8080 -t public/

السجلات

في كل مرة يُقدم فيها طلب من خادم التطوير يُكتب مدخل سجل مثل الموجود أدناه إلى سطر الأوامر.

[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /

واجهة سطر أوامر PHP

يمكن أيضًا تنفيذ شيفرة PHP مباشرةً عن طريق سطر الأوامر باستخدام CLI (واجهة سطر الأوامر). واجهة سطر الأوامر CLI بشكلٍ أساسي نفس الـ PHP من ناحية خوادم الويب، باستثناء بعض الاختلافات من حيث المدخلات والمخرجات القياسية.

التشغيل

توفر واجهة سطر الأوامر في PHP أربع طرائق لتشغيل شيفرة PHP:

  • دخل قياسي (Standard input): نفذ الأمر php دون أي وسائط ولكن مع تمرير شيفرة PHP عبر أنبوب (pipe) له:
echo '<?php echo "Hello world!";' | php
  • اسم الملف كوسيط: نفذ الأمر php مع وضع اسم ملف PHP المصدري كأول وسيط:
php hello_world.php
  • الشيفرة كوسيط: استخدم الخيار r‎‎‎‎‎‎‎‎‎‎- في الأمر php، متبوعًا بالشيفرة لتنفيذها. وسم الفتح ‎<?php‎‎‎ غير مطلوب، إذ يعد كل ما هو في الوسيط شيفرة PHP:
php -r 'echo "Hello world!";'
  • الصدفة التفاعلية (interactive shell): استخدم الخيار ‎-a في الأمر php للحصول على الصدفة التفاعلية ثم اكتب (أو الصق) شيفرة PHP واضغط return:
$ php -a 
Interactive mode enabled
php > echo "Hello world!"; 
Hello world!

الخرج

كل الدوّال أو المتحكمات التي تعطي خرج HTML في خادم الويب PHP يمكن أن تستخدم لإعطاء خرج في مجرى الخرج القياسي stdout (واصف الملف 1)، وكل الأفعال التي تعطي خرجًا في سجلات الخطأ في خادم الويب PHP ستعطي خرجًا في مجرى الخطأ القياسي stderr (واصف الملف 2).

  • الملف Example.php:
<?php
    echo "Stdout 1\n";
    trigger_error("Stderr 2\n");
    print_r("Stdout 3\n");
    fwrite(STDERR, "Stderr 4\n");
    throw new RuntimeException("Stderr 5\n");
?>
Stdout 6
  • سطر أوامر الصدفة:
$ php Example.php 2>stderr.log >stdout.log;\
> echo STDOUT; cat stdout.log; echo;\
> echo STDERR; cat stderr.log\

تكون المخرجات في مجرى الخرج القياسي STDOUT:

Stdout 1
Stdout 3

وتكون المخرجات في مجرى الخطأ القياسي STDERR:

Stderr 4
PHP Notice: Stderr 2
in /Example.php on line 3
PHP Fatal error: Uncaught RuntimeException: Stderr 5
in /Example.php:6
Stack trace:
#0 {main}
thrown in /Example.php on line 6

الدخل

انظر واجهة سطر الأوامر.

فصل التعليمات

تُنهى كل تعليمة بفاصلة منقوطة، تمامًا مثل جميع اللغات التي تتبع نفس نمط اللغة C، ويُنهى السطر الأخير من كتلة شيفرة PHP بوسم الإغلاق في آخر سطر.

إذا انتهى السطر الأخير من شيفرة PHP بفاصلة منقوطة ولم يتبعه أي سطر شيفرة، فإن وسم الإغلاق اختياري، مثلًا يمكننا ألا نضيف وسم إغلاق بعد ; echo "No error"‎ في المثال التالي:

<?php echo "No error"; 
// لا حاجة لإضافة وسم إغلاق بما أنه لا يوجد شيفرة بعد هذه التعليمة 

لكن إذا وُجدت أي شيفرة بعد كتلة شيفرة الـPHP فإنّ وسم الإغلاق ليس اختياريًا.

<?php echo "This will cause an error if you leave out the closing tag"; ?>
<html>
    <body>
    </body>
</html>

يمكننا أيضًا أن نتجاهل الفاصلة المنقوطة للتعليمة الأخيرة في كتلة شيفرة PHP إذا احتوت على وسم الإغلاق:

<?php echo "I hope this helps! :D";
echo "No error" ?>

يوصى عمومًا باستخدام الفاصلة المنقوطة دائمًا، واستخدام وسم الإغلاق لكل كتلة شيفرة PHP باستثناء الكتلة الأخيرة إذا لم يتبعها أي شيفرة، لذا يمكن كتابة الشيفرة بالشكل التالي:

<?php
    echo "!هنا نستخدم فاصلة منقوطة";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon and a closing tag because more code follows";
?>

<p>Some HTML code goes here</p>

<?php
    echo "Here we use a semicolon!";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon and a closing tag because more code follows";
?>

<p>Some HTML code goes here</p>

<?php
    echo "Here we use a semicolon!";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon but leave out the closing tag";

وسوم PHP

هناك ثلاث أنواع من الوسوم للإشارة إلى كتل PHP ضمن ملف. يبحث محلل (parser) لغة PHP عن وسوم البداية ووسوم الإغلاق (إن وجدت) لتحديد الشيفرة المراد ترجمتها.

الوسوم القياسية

هذه الوسوم هي الطريقة القياسية لتضمين شيفرة PHP في ملف.

<?php
    echo "Hello World";
?>

PHP 5.x الإصدار 5.4 وما بعده

وسوم الطباعة

هذه الوسوم متوفرة في كل إصدارات الـPHP ومفعلة دائمًا بدءًا من الإصدار PHP 5.4، إذ في الإصدارات السابقة لا يمكن تفعيل وسوم الطباعة إلا بالتزامن مع الوسوم القصيرة.

<?= "Hello World" ?>

الوسوم القصيرة

يمكنك تفعيل أو تعطيل هذه الوسوم مع الخيار shortopentag.

<?
    echo "Hello World";
?>

الوسوم القصيرة:

  • غير مسموحة في جميع معايير كتابة الشيفرة الأساسية للغة PHP.
  • غير مرغوبة في التوثيق الرسمي.
  • معطلة افتراضيًا في معظم الإصدارات.
  • تتداخل مع تعليمات معالجة XML المضمنة.
  • غير مقبولة لتسليم الشيفرة في معظم المشاريع المفتوحة المصدر.

PHP 5.x الإصدار 5.6 وما بعده

وسوم ASP (صفحات الخادم النشط)

يمكن استخدام وسوم نمط لغة ASP (Active Server Pages)‎ عند تفعيل الخيار asp_tags.

<%
    echo "Hello World";
%>

هذه الوسوم غريبة ويجب عدم استخدامها وأُزيلت منذ الإصدار PHP 7.0.

موازنة النوع

يوجد نوعان للموازنة: الموازنة المتهاونة (loose comparison) باستخدام == والموازنة الصارمة (strict comparison) باستخدام ===، تضمن الموازنة العامة أنّ نوع وقيمة كِلا طرفي العامل (operator) متساويين.

// موازنة متهاونة
var_dump(1 == 1); // true
var_dump(1 == "1"); // true
var_dump(1 == true); // true
var_dump(0 == false); // true

// موازنة صارمة
var_dump(1 === 1); // true
var_dump(1 === "1"); // false
var_dump(1 === true); // false
var_dump(0 === false); // false

// لا يمكن أن يساوي أي شيء NAN استثناء يجب ملاحظته
var_dump(NAN == NAN); // false
var_dump(NAN === NAN); // false

يمكنك أيضًا استخدام الموازنة القوية (strong comparison) للتأكد من عدم تطابق النوع والقيمة باستخدام ‎!==‎‎.

المثال النموذجي الذي يعدّ فيه العامل == غير كافٍ عندما تُرجع الدوال أنواعًا مختلفة، مثل الدالة strpos التي تُرجع false إذا لم تجد المحارف التي نبحث عنها في السلسلة وإلا تُرجع عددًا صحيحًا يمثّل موقعها في السلسلة.

if(strpos('text', 'searchword') == false)
// false تُرجع strpos تعمل الموازنة == كما هو متوقع لأنّ

if(strpos('text bla', 'text') == false)
// true ‏0 هي‏==false‏ونتيجة ‏‎ ‏سترجع الدالة 0 لأنّها وجدت المطلوب في الموقع 0‏
// وهذا ليس ما تتوقعه

if(strpos('text','text') === false)
// لذا تعمل هنا كما تتوقع false ‏0 هي‏===false‏ونتيجة ‏‎ ‏سترجع الدالة 0‏

النوع Boolean (القيم المنطقية)

القيم المنطقية نوع له إحدى القيمتين true أو false، تعطي الشيفرة التالية القيمة true للمتغير ‎$foo والقيمة false للمتغير ‎$bar:

$foo = true;
$bar = false;

بما أنّ هاتين القيمتين غير حساستين لحالة الأحرف يمكننا أن نكتب TRUE وFALSE كما يمكننا أن نكتب FaLsE، لكن استخدام الأحرف الصغيرة هو الصيغة الأشهر ويُنصح بها في معظم أدلة نمط الشيفرة مثل PSR-2.

يمكن استخدام القيم المنطقية في تعليمات if كما في المثال التالي:

if ($foo) { 
// if($foo == true) نفس نتيجة
    echo "true";
}

بما أنّ PHP لغة متهاونة في تحديد النوع (weakly typed) فإذا اُستعمل المتغير ‎$foo في موضع يتوقع فيه استعمال قيمة منطقية فستتحول قيمة ذاك المتغير إلى قيمة منطقية إما true أو false.

القيم التالية نتيجتها false:

  • القيمة الصفرية: 0 (عدد صحيح)، 0.0 (عدد عشري)، '0' (سلسلة نصية).
  • السلسلة النصية الفارغة ' ' أو المصفوفة الفارغة [].
  • القيمة null (محتوى متغير لم تُسند له قيمة، أو إذا أُسندت لمتغيرٍ ما). أي قيم أخرى نتيجتها true.

يمكنك استخدام الموازنة القوية === التي توازن القيمة والنوع لتجنب الموازنة المتهاونة.

يمكنك إضافة (bool) أو (boolean) قبل النوع لتحويله إلى قيمة منطقية.

var_dump((bool) "1"); // true

أو يمكنك استدعاء الدالة boolval

var_dump( boolval("1") ); // true

تحويل القيمة المنطقية إلى سلسلة نصية (string) مع ملاحظة أنّ قيمة السلسلة الفارغة هي false:

var_dump( (string) true ); // string(1) "1"
var_dump( (string) false ); // string(0) ""

تحويل القيمة المنطقية إلى عدد صحيح (integer):

var_dump( (int) true ); // int(1)
var_dump( (int) false ); // int(0)

لاحظ أنّه يمكننا أن نقوم بالعملية المعاكسة:

var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)

وأيضًا القيم غير الصفرية تُرجع true:

var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)

النوع Float (الأعداد العشرية)

$float = 0.123;

ملاحظة: يُرجع التابع gettype()‎ عند استخدامه لعدد عشري القيمة "double" وليس "float" وذلك لأسباب تاريخية.

تسمح الأعداد العشرية بدقة خرج أكبر من الأعداد الصحيحة البسيطة، ويمكن استخدام الأعداد العشرية والصحيحة معًا بسبب التحويل بين أنواع المتغيرات:

$sum = 3 + 0.14;
echo $sum; // 3.14

لا تُظهر PHP العدد العشري على أنّه عدد عشري مثل اللغات الباقية، مثلًا:

$var = 1;
echo ((float) $var); 
// تُرجع 1 وليس 1.0

تحذير: دقة الفاصلة العشرية (Floating point precision)

من دليل PHP:

الأرقام العشرية ذات دقة محدودة (الدقة تعني عدد الأرقام بعد الفاصلة)، بالرغم من أنّ هذا يعتمد على النظام إلا أنّ PHP تعطي عادةً أقصى خطأ نسبي بسبب التقريب بترتيب 1.11e-16، قد تعطي العمليات الحسابية غير البسيطة أخطاءً أكبر ويجب الانتباه لانتشار الخطأ عند تفاقم العمليات المتعددة.

بالإضافة إلى ذلك فإنّ الأرقام المنطقية التي يمكن تمثيلها بأعداد عشرية بالأساس 10 مثل 0.1 أو 0.7، ليس لها تمثيل بالأعداد العشرية بالأساس 2 (ثنائية) والتي تُستخدم داخليًا بغض النظر عن حجم الجزء العشري، وبالتالي لا يمكن تحويلها إلى نظائرها الثنائية الداخلية دون فقدان بسيط للدقة، مثلًا تُرجع عادةً التعليمة floor((0.1+0.7)*10)‎ القيمة 7 بدلًا من القيمة المتوقعة 8 لأنّ التمثيل الداخلي سيكون تقريبًا 7.9999999999999991118….

لذا لا تثق بنتائج الأعداد العشرية أبدًا حتى الرقم الأخير ولا توازن الأعداد العشرية مباشرةً في المساواة، ويمكنك استخدام دوال الحساب الدقيق التعسفي (arbitrary precision math) أو دوال مكتبة GMP، إذا كانت الدقة العالية مطلوبة.

النوع Strings (السلاسل النصية)

السلسلة النصية في PHP هي سلسلة من المحارف أحادية البايت (أي لا يوجد دعم لترميز يونيكود أصلي) ويمكن تعريفها بأربعة طرق:

السلاسل ذات الاقتباس المفرد (Single Quoted)

تعرض الأشياء تقريبًا بالكامل كما هي، دون ترجمة المتغيرات وسلاسل الهروب، الاستثناء من ذلك فقط عند عرض اقتباس حرفي، يمكنك عرض خط مائل عكسي ضمنه عن طريق الهروب بخط مائل عكسي آخر:

$my_string = 'Nothing is parsed, except an escap\'d apostrophe or backslash. $foo\n';
var_dump($my_string);

/*
string(68) "Nothing is parsed, except an escap'd apostrophe or backslash. $foo\n"
*/

السلاسل ذات الاقتباس المزدوج (Double Quoted)

ستُترجم في هذه السلاسل أسماء المتغيرات البسيطة وسلاسل الهروب على عكس سلاسل الاقتباس المفرد، يمكن استخدام القوسان المعقوصان (Curly braces) (كما في المثال الأخير) لعزل أسماء المتغير المعقدة.

$variable1 = "Testing!";
$variable2 = [ "Testing?", [ "Failure", "Success" ] ];
$my_string = "Variables and escape characters are parsed:\n\n";
$my_string .= "$variable1\n\n$variable2[0]\n\n";
$my_string .= "There are limits: $variable2[1][0]";
$my_string .= "But we can get around them by wrapping the whole variable in braces:
{$variable2[1][1]}";
var_dump($my_string);

/*
string(98) "Variables and escape characters are parsed:
Testing!
Testing?
There are limits: Array[0]"
But we can get around them by wrapping the whole variable in braces: Success
*/

صيغة Heredoc

تُحلّل أسماء المتغيرات وسلاسل الهروب في السلاسل ذات الصيغة Heredoc بطريقة مشابهة لسلاسل الاقتباس المزدوج، ومع ذلك فإنّ الأقواس غير متاحة لأسماء المتغير المعقدة. تُحدّد بداية السلسلة بـ مُعرّف >>>، وتنتهي بمُعرّف والمعرّف هو أي اسم PHP صحيح، يجب أن يظهر معرّف النهاية على سطر لوحده، ولا يُنصح بوجود مسافة بيضاء قبل أو بعد المُعرّف على الرغم من أنّه يجب إنهاؤه بفاصلة منقوطة نفس أي سطر في PHP.

$variable1 = "Including text blocks is easier";
$my_string = <<< EOF
Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. $variable1; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends.
EOF;
var_dump($my_string);

/*
string(268) "Everything is parsed in the same fashion as a double-quoted string,
but there are advantages. Including text blocks is easier; database queries and HTML output
can benefit from this formatting.
Once we hit a line containing nothing but the identifier, the string ends."
*/

صيغة Nowdoc

تشبه سلاسل الصيغة nowdoc نسخة سلاسل الاقتباس المفرد من الصيغة heredoc بالرغم من أنّ معظم سلاسل الهروب الأساسية لا تُقيَّم، ويُحتوى معرّف بداية السلسلة باقتباس مفرد.

PHP 5.x: الإصدار 5.3 وما بعده

$my_string = <<< 'EOF'
A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)
EOF;
var_dump($my_string);

/*
string(116) "A similar syntax to heredoc but, similar to single quoted strings,
nothing is parsed (not even escaped apostrophes \' and backslashes \\.)"
*/

قابلية الاستدعاء

يمكن إطلاق صفة قابلية الاستدعاء على أي شيء يمكن أن يُستدعى رد نداء (callback)، الأشياء التالية يمكن أن نسميها رد نداء:

  • الدوال مجهولة الاسم
  • دوال PHP القياسية (وليس بنى اللغة)
  • الأصناف الساكنة
  • الأصناف غير الساكنة (باستخدام صيغة بديلة)
  • الكائن المعرّف/ توابع الصنف
  • الكائنات، مادام الكائن موجود عند الموقع 0 من المصفوفة

مثال لمرجعية كائن كمصفوفة عناصر:

$obj = new MyClass();
call_user_func([$obj, 'myCallbackMethod']);

يمكن أن تدل ردود النداء على النوع القابل للاستدعاء بدءًا من PHP 5.4:

$callable = function () {
    return 'value';
};

function call_something(callable $fn) {
    call_user_func($fn);
}

call_something($callable);

الموارد

المورد هو متغير خاص يحمل مرجعيةً إلى مورد خارجي مثل ملف أو مقبس (socket) أو مجرى (stream) أو صفحة أو اتصال.

$file = fopen('/etc/passwd', 'r');

echo gettype($file);
# resource

echo $file;
# Resource id #2

يوجد أنواع وأنواع فرعية مختلفة للموارد، يمكنك الحصول على نوع المورد باستخدام الدالة getresourcetype()‎:

$file = fopen('/etc/passwd', 'r');
echo get_resource_type($file);
# stream

$sock = fsockopen('www.google.com', 80);
echo get_resource_type($sock);
# stream

يمكنك إيجاد قائمة كاملة من أنواع الموارد المدمجة هنا.

التحويل بين الأنواع

تُقدّر PHP بشكلٍ عام نوع البيانات الذي تنوي استخدامه بشكلٍ صحيح من السياق الذي اُستخدمت به، لكن من المفيد أحيانًا أن تفرض نوع ما يدويًا. يمكنك القيام بذلك بأن تبدأ التصريح بإضافة اسم النوع المطلوب بين قوسين:

$bool = true;
var_dump($bool); // bool(true)

$int = (int) true;
var_dump($int); // int(1)

$string = (string) true;
var_dump($string); // string(1) "1"

$string = (string) false;
var_dump($string); // string(0) ""

$float = (float) true;
var_dump($float); // float(1)

$array = ['x' => 'y'];
var_dump((object) $array); // object(stdClass)#1 (1) { ["x"]=> string(1) "y" }

$object = new stdClass();
$object->x = 'y';
var_dump((array) $object); // array(1) { ["x"]=> string(1) "y" }

$string = "asdf";
var_dump((unset)$string); // NULL

لكن يجب أن تكون حذرًا إذ لا تعمل كل عمليات التحويل بين البيانات كما تتوقع:

// (PHP_INT_MAX=2147483647) لدينا 3 تعليمات في أنظمة 32 بت حيث
// سيحوّل تلقائيًا إلى عدد عشري PHP_INT_MAX أي عدد صحيح قيمته أكبر من
var_dump( 999888777666 ); // float(999888777666)

// سيؤدي إلى الطفحان (int) التحويل القسري إلى
var_dump((int) 999888777666 ); // int(-838602302)

// PHP_INT_MAX لكن إذا حولنا القيمة على أنها سلسلة نصية ستُرجع لنا قيمة
var_dump((int) "999888777666"); // int(2147483647)

var_dump((bool) []); // bool(false) (empty array)
var_dump((bool) [false]); // bool(true) (non-empty array)

التعامل مع الأنواع

PHP هي لغة متهاونة في تحديد النوع، لا تطلب التصريح عن نوع المتغير عند تعريفه لأنه نوعه يُحدَّد حسب السياق الذي سيستخدم هذا المتغير فيه:

$a = "2"; // string

$a = $a + 2; // integer (4)

$a = $a + 0.5; // float (4.5)

$a = 1 + "2 oranges"; // integer (3)

Null

إذا كانت القيمة null في php مسندة إلى متغير، فيعد ذاك المتغير عديم القيمة وهي تشبه نوعًا ما المؤشر إلى فراغ (null pointer) في لغة C أو القيمة NULL في SQL.

إسناد القيمة null للمتغير:

// إسناد مباشر
$nullvar = null;

// هذه الدالة لا ترجع شيئًا
function doSomething() {}

// $nullvar إلى null لذا أُسنِدت 
$nullvar = doSomething();

التحقق فيما إذا أُسندت القيمة null لمتغيرٍ ما:

if (is_null($nullvar)){ 
    /* null قيمة المتغير هي */ 
}

if ($nullvar === null) { 
    /* null قيمة المتغير هي */ 
}

القيمة null مقابل المتغير غير المعرّف (undefined variable)

إذا لم يُعرّف المتغير أولم تُسند قيمة له فعندها أي تحقق من عدم كونه null سيكون ناجحًا وسيُظهر لك الرسالة Notice: Undefined variable: nullvar:‎

$nullvar = null;
unset($nullvar);

if ($nullvar === null) {
    // صحيح لكن ستُطبع رسالة أيضًا
}
if (is_null($nullvar)) {
    // صحيح لكن ستُطبع رسالة أيضًا
}

لذا يجب التحقق من القيم غير المعرّفة بالدالة isset:

if (!isset($nullvar)) {
    // أو غير معرّف null المتغير قيمته
}

الأعداد الصحيحة

يمكن وصف الأعداد الصحيحة في PHP بالأساس 2 (ثنائي) أو بالأساس 8 (ثماني) أو بالأساس 10 (عشري) أو بالأساس 16 (ست عشري).

$my_decimal = 42;
$my_binary = 0b101010;
$my_octal = 052;
$my_hexadecimal = 0x2a;

echo ($my_binary + $my_octal) / 2;  //42
// الخرج دائمًا بالقيمة العشرية

طول الأعداد الصحيحة إما 32 بت أو 64 بت ويعتمد ذلك على المنصة، يُعبّرالثابت PHP_INT_SIZE عن طول العدد الصحيح مقدّرًا بالبايت، ومتوفرة الثوابت PHP_INT_MAX وPHP_INT_MIN (منذ الإصدار PHP 7.0) أيضًا.

printf("Integers are %d bits long" . PHP_EOL, PHP_INT_SIZE * 8);
printf("They go up to %d" . PHP_EOL, PHP_INT_MAX);

تُنشأ القيم الصحيحة تلقائيًا وفقًا للحاجة من الأعداد العشرية والقيم المنطقية والسلاسل النصية. ويمكن عند الحاجة إلى التحويل بين الأنواع استخدام (int) أو (integer):

$my_numeric_string = "123";
var_dump($my_numeric_string);
// string(3) "123"

$my_integer = (int)$my_numeric_string;
var_dump($my_integer);
// int(123)

سيُعالَج طفحان العدد الصحيح (Integer overflow) بالتحويل إلى float (عدد عشري):

$too_big_integer = PHP_INT_MAX + 7;
var_dump($too_big_integer);
// float(9.2233720368548E+18)

لا يوجد عامل تقسيم صحيح في PHP، لكن يمكن محاكاته باستخدام التحويل الضمني بين الأنواع الذي يقرّب دائمًا بالتخلص من الجزء العشري، أُضيفت دالة التقسيم الصحيح بدءًا PHP من الإصدار 7.

$not_an_integer = 25 / 4;
var_dump($not_an_integer);
// float(6.25)

var_dump((int) (25 / 4)); 
// int(6)

var_dump(intdiv(25 / 4)); // PHP7 كما في
// int(6)

لاحظ أنّنا نحتاج الأقواس الزائدة حول ‎ (25 / 4)‎لأنّ أولوية التحويل بين الأنواع (int) أعلى من أولوية القسمة.

التعليقات

التعليقات المكونة من سطرٍ واحدٍ

تبدأ التعليقات المكونة من سطرٍ واحد بـ // أو #، سيتجاهل مترجم PHP كل ما يأتي إلى يمين هاتين العلامتين.

// هذا تعليق
# هذا أيضًا تعليق
echo "Hello World!"; // // هنا يوجد تعليق أيضًا بدءًا من العلامة

التعليقات المكونة من عدة أسطر

تُستخدم التعليقات المكونة من عدة أسطر للتعليق على كتل شيفرة كبيرة، تبدأ بـ ‎/*‎ وتنتهي بـ ‎*/‎‎:

/* هذا تعليق متعدد الأسطر
يمتد على عدة أسطر
هذا السطر أيضًا من ضمن التعليق
*/

PSR

إنّ PSR ‏(PHP Standards Recommendation) سلسلة من التوصيات التي جُمعت من قِبل FIG ‏(Framework Interop Group).

اقتباس

الفكرة من وراء المجموعة هي أن يتحدث ممثلو المشروع عن القواسم المشتركة بين مشاريعنا ويجدوا الطرق التي يمكننا بها العمل معًا. الأسئلة الشائعة في FIG

يمكن أن تكون PSR في إحدى الحالات: مقبولة أو قيد المراجعة أو مسودة أو مهملة.

PSR-4: المحمِّل التلقائي (Autoloader)

PSR4 هي توصية مقبولة تحدد معيار أصناف التحميل التلقائي عبر أسماء الملفات، ويوصى بها كبديل للتوصية السابقة (والمهملة حاليًا) PSR-0.

يجب أن يطابق اسم الصنف المؤهل بالكامل المتطلب التالي:

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
  • يجب أن يحتوي على فضاء اسم المورد (vendor) العالي المستوى (مثل Alphabet).
  • قد يحتوي على فضاء اسم فرعي واحد أو أكثر (مثل Google\AdWord).
  • يجب أن يحتوي على اسم الصف النهائي (مثل KeywordPlanner).

وبالتالي يكون اسم الصنف النهائي Alphabet\Google\AdWord\KeywordPlanner، ويجب أن يُترجم اسم الصنف المؤهل بالكامل إلى مسار ملف ذو معنى لذا يوجد Alphabet\Google\AdWord\KeywordPlanner في الملف ‎[path_to_source]/Alphabet/Google/AdWord/KeywordPlanner.php.

بدءًا من الإصدار PHP 5.3.0 يمكننا تعريف دالة محمِّل تلقائي مخصصة لتحميل ملفات بالاعتماد على نمط المسار واسم الملف الذي تعرفه.

// ‫عدّل شيفرة php لتضمين صنف بشكلٍ مشابه للتالي
spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php';});

استبدل الموقع ('classes/') ولاحقة اسم الملف ('.class.php') بالقيم التي تناسب الهيكلية الخاصة بك.

يدعم مدير حزمة المُنشئ PSR-4 مما يعني أنّه إذا اتبعت المعيار فإنّه يمكنك تحميل الأصناف في مشروعك بشكلٍ تلقائي باستخدام المحمّل التلقائي لمورد المُنشئ.

// ‫عدّل ملف composer.json للتضمين
{
    "autoload": {
        "psr-4": {
            "Alphabet\\": "[path_to_source]"
        }
    }
}

أعد توليد ملف المحمِّل التلقائي:

$ composer dump-autoload

يمكنك بعدها أن تكتب الشيفرة التالية:

<?php
require __DIR__ . '/vendor/autoload.php';
$KeywordPlanner = new Alphabet\Google\AdWord\KeywordPlanner();

PSR-1: معيار التشفير الأساسي

PSR-1 توصية مقبولة وتحدد توصية المعيار الأساسية التي يجب أن تُكتب بها شيفرة PHP.

  • تحدد اصطلاحات التسمية للأصناف والتوابع والثوابت.
  • تجعل تبنّي توصيات PSR-0 وPSR-4 مطلبًا.
  • تُشير إلى وسوم PHP التي يجب أن تُستخدم ‎<?php و‎‎<?=‎ وليس ‎<?‎.
  • تحدد نمط ترميز الملف الذي يجب أن يُستخدم (UTF8).
  • وتنص أيضًا على أنّ الملفات يجب إما أن تصرّح عن رموز جديدة (أصناف، دوال، ثوابت…) ولا تسبب تأثيرات جانبية أو تنفّذ منطق ما مع تأثيرات جانبية ولا تعرّف رموز لكن تفعل كليهما.

أداة PHPDoc

وصف متغير

يمكن استخدام الكلمة المفتاحية ‎@var لوصف نوع واستخدام:?

  • خاصيّة صنف
  • متغير محلي أو عالمي
  • ثابت صنف أو عالمي
class Example {
    // ‫‎@var سلسلة نصية تبقى ثابتة
    const UNCHANGING = "Untouchable";

    // ‫‎@var سلسلة نصية ما
    public $some_str;

    // ‫‎@var المتغير ‎$stuff مصفوفة? فيها مجموعة أشياء
    // ‫‎@var المتغير ‎$nonsense مصفوفة أيضًا
    private $stuff, $nonsense;
    
}

يمكن أن يكون النوع إحدى أنواع PHP المضمنة أو اسم صنف معرَّف من قِبل المستخدم متضمنًا فضاءات الأسماء، ويجب أن يُضمَّن اسم المتغير لكن يمكن تجاوزه إذا طُبِّقت صيغة docblock على عنصر واحد فقط.

إضافة بيانات وصفية إلى الدوال

تساعد التوصيفات على مستوى الدالة بيئات التطوير المتكاملة (IDEs) في تحديد القيم المعادة أو الشيفرة التي يحتمل أن تكون خطيرة.

/**
* إضافة رقمين إلى بعضهما
* ‎@param Int $a المعامل الأول في الإضافة
* ‎@param Int $b المعامل الثاني في الإضافة
* ‎@return Int
*/
function sum($a, $b)
{
    return (int) $a + $b;
}

/**
* ‫لا تنفّذني! سأرمي استثناء دائمًا
* @throws Exception Always
*/

function dangerousCode()
{
    throw new Exception('Ouch, that was dangerous!');
}

/**
* يجب إهمال الهياكل القديمة حتى تعرف الناس أنه لا يجب استخدامها
* @deprecated
*/
function oldCode()
{
    mysql_connect(/* ... */);
}

وصف المعاملات

/**
*
* المعاملات
* @param int $int
* @param string $string
* @param array $array
* @param bool $bool
*/
function demo_param($int, $string, $array, $bool)
{
}

/**
* المعاملات - اختيارية / افتراضية
*
* @param int $int
* @param string $string
* @param array $array
* @param bool $bool
*/
function demo_param_optional($int = 5, $string = 'foo', $array = [], $bool = false)
{
}

/**
* المعاملات - مصفوفات
*
* @param array $mixed
* @param int[] $integers
* @param string[] $strings
* @param bool[] $bools
* @param string[]|int[] $strings_or_integers
*/
function demo_param_arrays($mixed,$integers, $strings, $bools, $strings_or_integers)
{
}

/**
* المعاملات - مركبة
* @param array $config
* <pre>
* $params = [
* 'hostname' => (string) DB hostname. Required.
* 'database' => (string) DB name. Required.
* 'username' => (string) DB username. Required.
* ]
* </pre>
*/
function demo_param_complex($config)
{
}

المجموعات (collections)

تقترح PSR-5 شكل تدوين معمّم للمجموعات.

الصيغة المعمّمة

Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>

قد تكون القيم في مجموعة إما مصفوفة أخرى أو حتى مجموعة أخرى.

Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>

أمثلة

<?php
/**
* @var ArrayObject<string> $name
*/
$name = new ArrayObject(['a', 'b']);

/**
* @var ArrayObject<int> $name
*/
$name = new ArrayObject([1, 2]);

/**
* @var ArrayObject<stdClass> $name
*/
$name = new ArrayObject([
    new stdClass(),
    new stdClass()
]);

/**
* @var ArrayObject<string|int|stdClass|bool> $name
*/
$name = new ArrayObject([
    'a',
    true,
    1,
    'b',
    new stdClass(),
    'c',
    2
]);

/**
* @var ArrayObject<ArrayObject<int>> $name
*/
$name = new ArrayObject([
    new ArrayObject([1, 2]),
    new ArrayObject([1, 2])
]);

/**
* @var ArrayObject<int, string> $name
*/
$name = new ArrayObject([
    1 => 'a',
    2 => 'b'
]);

/**
* @var ArrayObject<string, int> $name
*/
$name = new ArrayObject([
    'a' => 1,
    'b' => 2
]);

/**
* @var ArrayObject<string, stdClass> $name
*/
$name = new ArrayObject([
    'a' => new stdClass(),
    'b' => new stdClass()
]);

إضافة بيانات وصفية إلى الملفات

تُطبَّق البيانات الوصفية من مستوى الملف على كامل شيفرة الملف ويجب أن تُكتب في أعلاه:

<?php
/**
* @author John Doe (jdoe@example.com)
* @copyright MIT
*/

وراثة البيانات الوصفية من هياكل الآباء

إذا ورث الصنف صنفًا آخر وكان يستخدم نفس البيانات الوصفية فيمكن أن نضيف له ‎@inheritDoc ليستخدم نفس التوثيق، إذا ورث عدة أصناف صنفًا أساسيًا فيجب تغيير الصنف الأب فقط حتى يتأثر كل الأصناف الأبناء.

abstract class FooBase
{
    /**
    * ‎@param Int $a المعامل الأول في الإضافة
    * ‎@param Int $b المعامل الثاني في الإضافة
    * ‎@return Int
    */
    public function sum($a, $b) {}
}

class ConcreteFoo extends FooBase
{
    /**
    * @inheritDoc
    */
    public function sum($a, $b)
    {
        return $a + $b;
    }
}

خادم PHP المدمج

العمود التفاصيل
‎-S ‫تخبر php بأننا نريد خادم ويب
 <hostname>:<port> اسم المضيف ورقم المنفذ الذي نريد استخدامه
‎-t المجلد العام
 <filename> سكربت التوجيه

تشغيل الخادم المدمج

php -S localhost:80

PHP 7.1.7 Development Server started at Fri Jul 14 15:11:05 2017
Listening on http://localhost:80
Document root is C:\projetos\repgeral
Press Ctrl-C to quit.

هذه أبسط طريقة لبدء خادم PHP يستجيب للطلبات المرسلة إلى المضيف المحلي (localhost) على المنفذ 80.

يخبر ‎-S أننا نبدأ خادم ويب، أما localhost:80 يشير إلى المضيف الذي يجيب على الطلبات والمنفذ، يمكنك أن تستخدم تراكيب أخرى مثل:

mymachine:80 - will listen on the address mymachine and port 80;
127.0.0.1:8080 - will listen on the address 127.0.0.1 and port 8080;

خادم مدمج مع مجلد محدد وسكربت موجِّه

php -S localhost:80 -t project/public router.php

PHP 7.1.7 Development Server started at Fri Jul 14 15:22:25 2017
Listening on http://localhost:80
Document root is /home/project/public
Press Ctrl-C to quit.

ترجمة -وبتصرف- للفصول [-installing a PHP environment on Windows - Installing on Linux/Unix Environments- Getting started with PHP - Types - Comments - PHPDoc - PSR - PHP Built in server] من كتاب PHP Notes for Professionals book.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...