دروس PHP مع أمثلة قابلة للتشغيل
دروس ومرجع مجاني لـ PHP 8: المصفوفات وforeach ودوال النصوص والتواريخ والنماذج والأصناف والأخطاء. كل مثال يعمل داخل الصفحة، والأمثلة التي تطبع HTML تعرض الصفحة مع نماذج يمكنك إرسالها.
ابدأ رحلة موجَّهة في PHPالبداية
- ما هي PHP؟PHP لغة برمجة نصية تعمل على الخادم: يُنفَّذ ملف PHP على خادم الويب ويرسل إلى المتصفح صفحة HTML التي يبنيها. تشغّل PHP ووردبريس وLaravel وجزءًا كبيرًا من الويب، كما تشغّل السكربتات من سطر الأوامر.
- تثبيت PHPثبّت PHP بأمر واحد: winget على ويندوز، وHomebrew على macOS، وapt أو dnf على لينكس. ثم شغّل php -v في الطرفية للتأكد من أنها تعمل ومعرفة الإصدار المثبت.
- تشغيل PHPشغّل ملف PHP من الطرفية بالأمر php index.php، أو اعرض مجلدًا في المتصفح بالخادم المدمج في PHP: php -S localhost:8000. لا تحتاج إلى Apache أو XAMPP في الحالتين.
- echo وprintتطبع echo نصًا واحدًا أو أكثر: echo "Hello, $name"; أو echo $a, $b;. وهي الطريقة المعتادة لإرسال نص أو HTML إلى الصفحة. تفعل print الشيء نفسه بقيمة واحدة وتعيد 1، و<?= $x ?> هي الصيغة المختصرة داخل HTML.
- إظهار الأخطاءلإظهار كل أخطاء PHP، ضع ini_set('display_errors', '1'); وerror_reporting(E_ALL); في أعلى السكربت، أو اضبط display_errors = On وerror_reporting = E_ALL في php.ini. وفي بيئة الإنتاج، سجّل الأخطاء بدلًا من عرضها.
- PHP أم Pythonصُمّمت PHP للويب: يُنفَّذ الملف مع كل طلب ويطبع صفحة، وهي تشغّل ووردبريس وLaravel. أما Python فلغة عامة الأغراض تعمل في الويب أيضًا (Django وFlask) وتتصدر علم البيانات والأتمتة وتعلم الآلة.
- PHP أم JavaScriptتعمل PHP على الخادم وترسل HTML جاهزًا إلى المتصفح. أما JavaScript فتعمل في المتصفح، حيث تغيّر الصفحة بعد تحميلها، وعلى الخادم مع Node.js. تستخدم معظم المواقع اللغتين: PHP لبناء الصفحات وواجهات API، وJavaScript للتفاعل.
الأساسيات
- المتغيراتيبدأ متغير PHP بالرمز $ ويُنشأ بإسناد قيمة إليه: $name = "Ada";. لا توجد كلمة مفتاحية للتعريف ولا نوع ثابت. لا ترى الدوال المتغيرات الخارجية ما لم تمررها إليها أو تستخدم global أو تلتقطها، وتحتفظ static بالقيمة بين الاستدعاءات.
- أنواع البياناتفي PHP عشرة أنواع: أربعة بسيطة (int وfloat وstring وbool)، وأربعة مركبة (array وobject وcallable وiterable)، ونوعان خاصان (null وresource). تعرض var_dump($x) نوع القيمة وقيمتها، وتعيد gettype($x) اسم النوع.
- النصوصاربط نصوص PHP بعامل النقطة ("Hello, " . $name) أو ضع المتغيرات مباشرة داخل علامتي التنصيص المزدوجتين ("Hello, $name"). تطبع علامات التنصيص المفردة النص كما هو. تعلّم الربط و.= واستيفاء المصفوفات والكائنات وتغيير حالة الأحرف بـ strtoupper وstrtolower وucfirst وucwords.
- Heredoc وNowdocHeredoc في PHP نص متعدد الأسطر يبدأ بـ <<<EOT وينتهي بـ EOT، ويستبدل المتغيرات كالنص بين علامتي تنصيص مزدوجتين. أما nowdoc، <<<'EOT'، فيحتفظ بالنص كما كُتب. تعلّم الصياغة وقواعد المسافات البادئة واستيفاء المصفوفات والكائنات وقوالب HTML.
- العواملتعمل عوامل PHP على القيم: +, -, *, /, %, ** للحساب، و=, +=, .=, ??= للإسناد، و&&, ||, ! وxor للمنطق، و. لربط النصوص، و==, ===, <=> للمقارنة، و++, -- للزيادة والنقصان. تعلّم كل مجموعة بأمثلة قابلة للتشغيل، مع فخ الأولوية بين and و&&.
- عوامل المقارنةتقارن PHP القيم بـ == (متساويتان بعد تحويل الأنواع)، و=== (القيمة نفسها والنوع نفسه)، و!= و!==، و< > <= >= وعامل المركبة الفضائية <=>. تعرّف على متى تحوّل == الأنواع، وما الذي تغيّر في PHP 8، وشاهد كل مقارنة مرنة وصارمة في جدول واحد.
- العامل الثلاثيالعامل الثلاثي في PHP جملة if/else في سطر واحد: $result = $condition ? 'yes' : 'no';. تعرّف على الصيغة المختصرة ?: (عامل Elvis)، وكيف تختلف عن ??، ولماذا يحتاج العامل الثلاثي المتداخل إلى أقواس منذ PHP 8، ومتى تكون match الخيار الأنظف.
- عامل الدمج ??يعيد عامل الدمج مع null في PHP طرفه الأيسر ما لم يكن null أو غير معيَّن: $name = $_GET['name'] ?? 'Guest';. ولا يحذّر أبدًا من متغير أو مفتاح مصفوفة مفقود. تعلّم سلاسل ?? والإسناد ??= والفرق بين ?? و?: وعامل nullsafe ?->.
- تحويل الأنواعحوّل نص PHP إلى عدد صحيح بـ (int) $str أو intval($str)، فـ (int) "42" تساوي 42 و(int) "12abc" تساوي 12. تعلّم التحويل إلى int وfloat وbool وstring وarray، والنصوص الرقمية، وintval مع أساس، وsettype، وكيف تتحقق من المدخلات بدلًا من الحصول على 0 بصمت.
- الثوابتالثابت في PHP اسم لقيمة لا يمكن تغييرها: const MAX_USERS = 100; أو define('MAX_USERS', 100);. تعرّف على الفرق بين define وconst، والمصفوفات الثابتة، وثوابت الأصناف مع self::، والتحقق بـ defined()، والثوابت السحرية __LINE__ و__FILE__ و__DIR__ و__CLASS__.
- isset()تعيد isset($var) القيمة true عندما يكون المتغير موجودًا وليس null، وfalse في غير ذلك، دون أي تحذير. وتتحقق أيضًا من مفاتيح المصفوفات وخصائص الكائنات: isset($user['email']). تعلّم isset مع عدة متغيرات، والمفاتيح المتداخلة، وisset مقابل empty، وisset مقابل array_key_exists، والتحقق من إرسال النماذج.
- empty()تعيد empty($var) القيمة true عندما يكون المتغير مفقودًا أو خاطئًا منطقيًا: null أو false أو 0 أو 0.0 أو "" أو "0" أو []. ولا تحذّر أبدًا من المتغيرات أو المفاتيح غير المعرّفة. تعرّف على سبب اعتبار "0" فارغًا، وكيف تفحص النص أو المصفوفة الفارغة بدقة، وempty مقابل isset، والتحقق من مدخلات النماذج.
- الرياضيات والتقريبتقرّب round($x, 2) إلى منزلتين عشريتين، وتقرّب floor() دائمًا إلى الأسفل، وتقرّب ceil() دائمًا إلى الأعلى. وأيضًا intdiv() والعامل % و** للأسس وabs() وmax() وmin() وrandom_int() للأعداد العشوائية.
التحكم في التدفق
- if وelseif وelseتنفّذ if (condition) { ... } كتلة فقط عندما يكون الشرط صحيحًا، وتفحص elseif الشرط التالي، وتعمل else عندما لا يتحقق أي شرط. يتناول الدرس elseif مقابل else if، و&& و||، والقيم الصحيحة منطقيًا، وصيغة if: endif; لقوالب HTML.
- جملة switchتقارن switch ($value) قيمة واحدة بقائمة من وسوم case وتنفّذ الشيفرة من أول تطابق حتى break. يتناول الدرس الحالات المتعددة، والانتقال إلى الحالة التالية، وdefault، وswitch(true)، ولماذا تستخدم switch المقارنة المرنة ==.
- تعبير matchيقارن match ($x) { 1, 2 => 'low', default => 'other' } قيمة بمقارنة صارمة ===، ويعيد نتيجة أول ذراع مطابقة، ويرمي UnhandledMatchError عندما لا يتطابق شيء. يتناول الدرس match مقابل switch، وmatch(true)، وmatch مع التعدادات.
- حلقة forتنفّذ for ($i = 0; $i < 10; $i++) { ... } كتلة عددًا محددًا من المرات: قيمة بداية، وشرط يُفحص قبل كل دورة، وخطوة. يتناول الدرس المرور على مصفوفة بالفهرس، والعد التنازلي، والحلقات المتداخلة، وbreak وcontinue.
- حلقة whileتكرر while (condition) { ... } كتلة ما دام الشرط صحيحًا، وتفحصه قبل كل دورة. أما do { ... } while (condition); فتفحصه بعد الدورة، لذا تعمل مرة واحدة على الأقل دائمًا. يتناول الدرس while (true) مع break، وقراءة ملف سطرًا سطرًا، وتجنب الحلقات اللانهائية.
- حلقة foreachتزور foreach ($array as $value) كل عنصر في مصفوفة، وتعطيك foreach ($array as $key => $value) المفتاح أيضًا. يتناول الدرس الحصول على الفهرس، وتغيير القيم بالمرجع ومشكلة unset()، وbreak وcontinue، والمصفوفات المتداخلة، وlist() في foreach، وبناء HTML.
المصفوفات
- المصفوفاتالمصفوفة في PHP قائمة مرتبة من القيم، كل قيمة مخزّنة تحت مفتاح: $fruits = ['apple', 'banana']; وتُقرأ بـ $fruits[0]. تعلّم كيف تنشئ المصفوفات، وتقرأ العناصر وتغيّرها، وتمر عليها، وتطبعها، وأي دالة مصفوفات تختار.
- المصفوفات الترابطيةتخزّن المصفوفة الترابطية في PHP القيم تحت مفاتيح تسمّيها أنت: $user = ['name' => 'Ada', 'age' => 36]; وتُقرأ بـ $user['name']. تعلّم كيف تضيف الأزواج وتغيّرها وتحذفها، وتمر على المفاتيح والقيم، وتحصل على كل المفاتيح أو القيم، وتفحص مفتاحًا، وترتّب حسب المفتاح أو القيمة.
- المصفوفات متعددة الأبعادالمصفوفة متعددة الأبعاد في PHP مصفوفة عناصرها مصفوفات، وتُقرأ بزوج أقواس لكل مستوى: $grid[1][2] أو $users[0]['name']. تعلّم كيف تنشئ مصفوفات متداخلة، وتقرأ القيم العميقة وتغيّرها، وتمر بحلقات foreach متداخلة، وتبني جدول HTML، وتستخرج عمودًا، وترتّب الصفوف.
- array_push()تضيف array_push($arr, $value) قيمة أو أكثر إلى نهاية مصفوفة؛ وتفعل $arr[] = $value الشيء نفسه لقيمة واحدة وهي أسرع. تعلّم كيف تضيف إلى نهاية مصفوفة أو بدايتها أو وسطها، وتضيف مفتاحًا وقيمة، وتتجنب خطأ القيمة المعادة الشهير.
- count()تعيد count($arr) عدد العناصر في مصفوفة PHP، لذا فإن count(['a', 'b', 'c']) تساوي 3. تعلّم كيف تعدّ المصفوفات المتداخلة بـ COUNT_RECURSIVE، وعلاقة sizeof() بـ count()، وكيف تعدّ القيم المطابقة، ولماذا ترمي count(null) الخطأ TypeError منذ PHP 8.
- in_array()تعيد in_array($needle, $haystack) القيمة true عندما تكون القيمة في المصفوفة. مرّر true وسيطًا ثالثًا لفحص صارم، in_array('1', $ids, true)، فيجب أن يتطابق النوع أيضًا. تعلّم الوسيط الصارم، والبحث دون حساسية لحالة الأحرف، وفحص عدة قيم، والمصفوفات المتداخلة، وبديل isset السريع.
- array_search()تعيد array_search($value, $array) مفتاح أول عنصر يساوي $value، أو false عندما لا يوجد. ولأن المفتاح قد يكون 0، اختبر النتيجة دائمًا بـ !== false. تعلّم البحث الصارم، وإيجاد كل التطابقات، والبحث في مصفوفة متعددة الأبعاد بـ array_column، والبحث دون حساسية لحالة الأحرف.
- array_key_exists()تعيد array_key_exists('key', $array) القيمة true عندما تحتوي المصفوفة ذلك المفتاح، حتى لو كانت قيمته null. أما isset($array['key']) فأسرع لكنها تعيد false للقيمة null. تعلّم الفرق، وkey_exists()، والمفاتيح المتداخلة، وفحص عدة مفاتيح، ولماذا تحتاج الكائنات إلى property_exists().
- array_merge()تجمع array_merge($a, $b) المصفوفات في مصفوفة واحدة: تُلحق القيم ذات المفاتيح الرقمية ويُعاد ترقيمها، ومع المفاتيح النصية تفوز المصفوفة اللاحقة. تعلّم كيف تختلف array_merge عن العامل + وعن صيغة البسط [...$a, ...$b]، وكيف تدمج قائمة من المصفوفات، ومتى تناسب array_merge_recursive أو array_replace أكثر.
- array_map()تستدعي array_map($callback, $array) دالة الاستدعاء على كل عنصر وتعيد مصفوفة جديدة بالنتائج. تعلّم الدوال السهمية، والمفاتيح، والمرور على عدة مصفوفات معًا، ومتى تناسب array_walk أو foreach أكثر.
- array_filter()تُبقي array_filter($array, $callback) العناصر التي تعيد لها دالة الاستدعاء true. تعلّم كيف تحذف القيم الفارغة، وتصفّي بالمفتاح بـ ARRAY_FILTER_USE_KEY، وتعيد فهرسة النتيجة بـ array_values، وتجمع القيم بـ array_reduce.
- ترتيب المصفوفاتترتّب sort($array) قائمة في مكانها، وترتّب asort وksort مصفوفة ترابطية حسب القيمة أو المفتاح، وترتّب usort بمقارنتك الخاصة. تعلّمها كلها، ورتّب مصفوفة متعددة الأبعاد حسب عمود، وتجنّب الخطأ الكلاسيكي $sorted = sort($arr).
- الحذف من مصفوفةتحذف unset($array[$key]) عنصرًا بمفتاحه، وتحذف array_splice بالموضع وتعيد الترقيم، وتحذف array_diff بالقيمة. تعلّم كل واحدة منها، وكيف تعيد الفهرسة بعدها، وفخ array_search الذي يحذف العنصر الخطأ.
- array_slice()تعيد array_slice($array, $offset, $length) نسخة من جزء من مصفوفة دون تغيير الأصل. تعلّم الإزاحات السالبة لآخر العناصر، وpreserve_keys، وتقسيم قائمة إلى صفحات، وكيف تختلف عن array_splice.
- array_unique()تحذف array_unique($array) القيم المكررة وتُبقي أول ظهور لكل قيمة، بمفتاحه الأصلي. تعلّم كيف تعيد فهرسة النتيجة، وتحذف التكرارات متجاهلًا حالة الأحرف، وتجعل صفوف مصفوفة متعددة الأبعاد فريدة، وتعدّ التكرارات أو تجدها.
- array_column()تعيد array_column($rows, 'email') حقل البريد من كل صف في مصفوفة مسطحة. تعلّم وسيط مفتاح الفهرس، وإعادة فهرسة الصفوف بالمعرّف، واستخدامها مع الكائنات، وإيجاد صف بـ array_search.
- التفكيك وlist()تُسند [$a, $b] = $array أول عنصرين إلى $a و$b في سطر واحد، وتفعل ['name' => $name] = $user الشيء نفسه بالمفتاح. وlist() هي الكتابة الأقدم. يتناول الدرس تخطي العناصر، وتبديل المتغيرات، وإعادة عدة قيم، والتفكيك في foreach، وعامل البسط ....
السلاسل النصية
- explode()تقسّم explode(',', $string) نصًا عند كل فاصلة وتعيد الأجزاء في مصفوفة. تعلّم وسيط الحد، والتقسيم عند السطر الجديد، وتشذيب الأجزاء، ومتى تكون str_split أو preg_split الأداة الأفضل.
- implode()تضم implode(', ', $array) قيم مصفوفة في نص واحد مع فاصل بينها. تعلّم implode مع المفاتيح، والمصفوفات الترابطية، وبناء قوائم HTML، والفرق بين implode وjoin.
- str_replace()تستبدل str_replace($search, $replace, $subject) كل ظهور لـ $search بـ $replace. تعلّم مصفوفات قيم البحث والاستبدال، وعدّ مرات الاستبدال، وstr_ireplace غير الحساسة لحالة الأحرف، واستبدال الظهور الأول فقط.
- substr()تعيد substr($string, $offset, $length) جزءًا من نص. تعلّم الإزاحات السالبة، والحصول على أول المحارف أو آخرها، وmb_substr للنصوص اليابانية ونصوص UTF-8 الأخرى، وsubstr_count، واختصار النص مع علامة حذف.
- strpos()تعيد strpos($haystack, $needle) موضع أول ظهور لـ $needle، أو false إذا لم يُوجد. تعلّم فحص !== false، وstripos غير الحساسة لحالة الأحرف، وآخر تطابق بـ strrpos، وإيجاد كل مرات الظهور.
- str_contains()تعيد str_contains($haystack, $needle) القيمة true إذا ظهر $needle في أي مكان من $haystack. تعلّم النسخة غير الحساسة لحالة الأحرف، وstr_starts_with وstr_ends_with، والتحقق من عدة كلمات، ونسخة strpos لـ PHP 7.
- trim()تحذف trim($string) المسافات وعلامات الجدولة والأسطر الجديدة من طرفي نص؛ وتنظّف ltrim() وrtrim() طرفًا واحدًا. تعلّم كيف تشذّب محارف محددة، والمسافة اليابانية كاملة العرض، وكل قيمة في مصفوفة.
- strlen()تعيد strlen($string) طول نص بالبايتات؛ وتعيده mb_strlen($string) بالمحارف. تعلّم لماذا تعطي النصوص اليابانية والرموز التعبيرية إجابات مختلفة، وكيف تتحقق من النص الفارغ، وكيف تتحقق من طول المُدخلات.
- sprintf()تبني sprintf() نصًا من تنسيق وقيم: تعيد sprintf('%05.2f', 3.14159) النص "03.14". تعلّم %s و%d و%f، والحشو بالأصفار، وعدد المنازل العشرية الثابت، والمحاذاة، وترقيم الوسائط، وprintf وvsprintf.
- number_format()تعيد number_format(1234567.891, 2) النص "1,234,567.89": تقرّب إلى عدد المنازل العشرية المحدد وتضيف فاصل الآلاف. تعلّم المعاملات الأربعة، والتنسيقين الأوروبي والياباني، وكيف تقرّب، ولماذا تكون النتيجة نصًا.
- الأسطر الجديدةلطباعة سطر جديد في PHP، اكتب "\n" داخل علامتي تنصيص مزدوجتين أو استخدم PHP_EOL. في صفحة الويب لا يظهر السطر الجديد، لذا استخدم <br> أو nl2br(). تعلّم الفرق، ولماذا لا تعمل '\n' داخل علامتي التنصيص المفردتين، وكيف تقسّم فواصل الأسطر أو تحذفها.
- preg_match()تختبر preg_match($pattern, $subject, $matches) نصًا مقابل تعبير نمطي وتعيد 1 عند التطابق و0 عند عدمه. تعلّم مجموعات الالتقاط، والمجموعات المسماة، وpreg_match_all، والمرتكزات، وأنماط التحقق، والمعدّل u لنصوص UTF-8 والنصوص اليابانية.
- preg_replace()تستبدل preg_replace($pattern, $replacement, $subject) كل تطابق لتعبير نمطي: تدمج preg_replace('/\s+/', ' ', $text) المسافات البيضاء. تعلّم المراجع الخلفية مثل $1، وpreg_replace_callback، وحذف المحارف غير الأبجدية الرقمية، والحدود والعدّ.
الدوال
- الدوالعرّف دالة PHP بـ function name($param) { return $value; }. تعلّم القيم المعادة، والمعاملات الافتراضية، والوسائط المسماة، والتمرير بالمرجع، والتصريح بالأنواع مع strict_types، والأنواع القابلة لـ null والاتحادية، و...$args متغيرة العدد.
- الدوال السهميةالدالة السهمية دالة مجهولة من تعبير واحد تُكتب fn($x) => $x * 2. تستخدم المتغيرات الخارجية تلقائيًا، بالقيمة، دون use. تعلّم الصيغة، وكيف يعمل الالتقاط، والأنواع، ودوال الاستدعاء لـ array_map وusort، ومتى تستخدم دالة مغلقة كاملة بدلًا منها.
- الدوال المجهولةالدالة المجهولة (المغلقة) دالة دون اسم مخزّنة في متغير: $greet = function ($name) { return "Hi $name"; };. تعلّم الكلمة use، والالتقاط بالمرجع، والقابلات للاستدعاء، وصيغة الاستدعاء من الدرجة الأولى strlen(...)، والدوال المغلقة داخل الأصناف.
- المولّداتالمولّد دالة تستخدم yield لتعيد القيم واحدة واحدة، فتستطيع foreach المرور على مليون عنصر دون بناء مصفوفة. تعلّم yield، والمفاتيح، وتوفير الذاكرة، والتسلسلات اللانهائية، وyield from، وsend() وgetReturn().
الأصناف والكائنات
- الأصناف والكائناتالصنف في PHP مخطط يُعرَّف بـ `class Name { }`، وتنشئ `new Name()` كائنًا منه. تعلّم الخصائص، والتوابع، و`$this`، وpublic/private/protected، والخصائص ذات الأنواع وreadonly، و`__toString`، ولماذا لا ينسخ إسنادُ كائنٍ الكائن.
- البوانيالباني في PHP هو التابع `__construct()`، الذي يعمل تلقائيًا عندما تكتب `new ClassName(...)`. تعلّم ترقية خصائص الباني، والوسائط الافتراضية والمسماة، والتحقق من المُدخلات، و`parent::__construct()`، وكيف تحاكي عدة بوانٍ بتوابع مصنع ساكنة.
- الوراثةفي PHP يرث صنف من آخر بـ `class Dog extends Animal`: يحصل على الخصائص والتوابع العامة والمحمية للأب، ويستطيع إعادة تعريفها، ويظل قادرًا على استدعاء الأصل بـ `parent::method()`. تعلّم إعادة التعريف، وprotected، وfinal، وinstanceof، وفخ التوابع الخاصة.
- الواجهاتتسرد الواجهة في PHP توابع يتعهد الصنف بامتلاكها: `interface Shape { public function area(): float; }`، وعلى `class Circle implements Shape` عندها أن تعرّف `area()`. تعلّم التلميح بالأنواع مع الواجهات، وتنفيذ عدة واجهات، وثوابت الواجهات، ووراثة الواجهات، والواجهات المدمجة مثل Countable، والواجهة مقابل الصنف المجرد.
- الأصناف المجردةيُصرَّح بالصنف المجرد في PHP بـ `abstract class Name` ولا يمكن إنشاء كائن منه: وُجد ليُورث. يمكن أن يحمل خصائص وبانيًا وتوابع مكتملة، إضافة إلى توابع `abstract` دون جسم يجب على كل صنف ابن تنفيذها.
- السماتالسمة في PHP كتلة قابلة لإعادة الاستخدام من التوابع والخصائص تنسخها إلى صنف بـ `use TraitName;`. تعلّم استخدام عدة سمات، وحل تعارض الأسماء بـ `insteadof` و`as`، والأعضاء المجردة والساكنة في السمات، وأي تابع يفوز، والسمة مقابل الواجهة مقابل الصنف المجرد.
- التعداداتالتعداد في PHP (8.1 وما بعدها) نوع بقائمة ثابتة من القيم: `enum Status: string { case Active = 'active'; }`. تعلّم التعدادات الخالصة والمدعومة، و`->value` و`->name`، والتحويل بـ `from()` و`tryFrom()`، وسرد الحالات بـ `cases()`، والتوابع، والثوابت، والواجهات، والتعدادات في `match`.
- التوابع الساكنةالتابع أو الخاصية `static` ملك للصنف لا للكائن: تستدعيه بـ `ClassName::method()` وتقرؤها بـ `ClassName::$count`، دون حاجة إلى `new`. تعلّم `self::` مقابل `static::` (الربط الساكن المتأخر)، و`new static`، والمتغيرات الساكنة داخل الدوال، ومتى تكون static الأداة الخاطئة.
- فضاءات الأسماءيجمع فضاء الأسماء في PHP الأصناف والدوال والثوابت تحت بادئة: `namespace App\Models;` في أعلى ملف، ثم `use App\Models\User;` في مكان آخر للإشارة إلى الصنف باسمه القصير. تعلّم الأسماء المؤهلة كليًا، والأسماء البديلة `use ... as`، و`use function`، والشرطة المائلة العكسية البادئة للأصناف العامة، والتحميل التلقائي PSR-4.
الأخطاء والاستثناءات
- try catchفي PHP، تُوضع الشيفرة التي قد تفشل في كتلة `try { }`، وتعمل `catch (Exception $e) { }` إذا رمت شيئًا، مع السبب في `$e->getMessage()`. تعلّم التقاط عدة أنواع من الاستثناءات، و`finally`، ولماذا تفوّت `catch (Exception)` الأخطاء `TypeError` و`DivisionByZeroError` (التقط `Throwable`)، وإعادة الرمي، والمعالج العام.
- الاستثناءاتترمي استثناءً في PHP بـ `throw new Exception('message');`، ويقرؤه المستدعي بـ `$e->getMessage()` في كتلة `catch`. تعلّم أصناف الاستثناءات المدمجة، وكتابة استثناءات مخصصة، و`getCode()` و`getLine()` و`getPrevious()`، و`throw` بوصفها تعبيرًا، والأخطاء التي ترميها PHP بنفسها مثل `ValueError` و`TypeError`.
البيانات والملفات والويب
- json_encode()تحوّل json_encode($value) مصفوفة PHP أو كائنًا أو قيمة بسيطة إلى نص JSON. تصبح المصفوفات الترابطية كائنات JSON، وتصبح القوائم مصفوفات JSON، وتتحكم أعلام مثل JSON_PRETTY_PRINT وJSON_UNESCAPED_UNICODE في المخرجات.
- json_decode()تحوّل json_decode($json, true) نص JSON إلى مصفوفة ترابطية في PHP؛ ودون true تحصل على كائنات stdClass. تعلّم القيم المتداخلة، ومعالجة الأخطاء بـ JSON_THROW_ON_ERROR، وjson_validate()، ولماذا تعيد json_decode القيمة null.
- date()تعيد date('Y-m-d') تاريخ اليوم نصًا، وتنسّق date('Y-m-d', $timestamp) أي طابع زمني Unix. تعلّم time() وmktime() وstrtotime() وDateTimeImmutable، وإضافة الأيام، والفرق بين تاريخين، والمناطق الزمنية، مع أمثلة يمكنك تشغيلها.
- تنسيق التاريختنسيق التاريخ في PHP نص من حروف مثل 'Y-m-d H:i:s'، حيث Y السنة بأربعة أرقام، وm الشهر، وd اليوم، وH الساعة، وi الدقائق، وs الثواني. إليك كل محرف تنسيق مع مثال، إضافة إلى التهريب، وISO 8601، والتواريخ اليابانية، والتحويل من تنسيق إلى آخر.
- file_get_contents()تقرأ file_get_contents('notes.txt') ملفًا كاملًا وتعيده نصًا واحدًا، أو false إذا لم تستطع. وتكتب شريكتها file_put_contents() نصًا في ملف، وتعيد file() الأسطر في مصفوفة.
- fopen()تفتح fopen('data.txt', 'r') ملفًا وتعيد مقبضًا، أو false عند الفشل. اقرأ من المقبض بـ fgets() أو fread()، واكتب بـ fwrite()، وأغلقه بـ fclose(). ويحدد الوضع ('r' و'w' و'a' و'x' و'c' وصيغها مع +) ما يمكنك فعله.
- include وrequireتشغّل include 'header.php'; ملف PHP آخر في ذلك الموضع، كأن شيفرته ملصقة هناك. وتفعل require الشيء نفسه لكنها توقف السكربت بخطأ فادح عندما يكون الملف مفقودًا، بينما تكتفي include بتحذير وتواصل. وتحمّل include_once وrequire_once الملف في المرة الأولى فقط.
- النماذجيُرسل نموذج PHP إلى نفسه بـ <form method="post">، ويقرأ السكربت الحقول من $_POST['name'] حين تكون $_SERVER['REQUEST_METHOD'] مساوية لـ 'POST'. تعلّم التحقق، ورسائل الخطأ بجانب الحقول، والاحتفاظ بالقيم المُدخلة، ومربعات الاختيار والقوائم المنسدلة، وتهريب المخرجات.
- $_GET و$_POSTتحمل $_GET نص الاستعلام في الرابط (?page=2 تعطي $_GET['page']) وتحمل $_POST حقول نموذج أُرسل بـ method="post". تعلّم قراءتهما بأمان، وبناء الروابط بـ http_build_query، وفحص $_SERVER['REQUEST_METHOD']، والاختيار بين GET وPOST.
- htmlspecialchars()تحوّل htmlspecialchars($text) المحارف الخمسة التي لها معنى في HTML (& < > " ') إلى كيانات، فتُعرض مُدخلات المستخدم نصًا بدل أن تعمل وسومًا. تعلّم ENT_QUOTES، وتهريب الخصائص، والترميز المزدوج، وhtmlentities وstrip_tags.
- الجلسات وملفات تعريف الارتباطاستدعِ session_start() في أعلى كل صفحة، ثم خزّن القيم في $_SESSION['key']؛ تحتفظ بها PHP على الخادم وتتذكر الزائر عبر ملف تعريف ارتباط. وتخزّن setcookie('name', 'value', $options) قيمة صغيرة في المتصفح، تُقرأ من $_COOKIE. تعلّم تسجيل الدخول والخروج، والرسائل المؤقتة، وخيارات ملفات تعريف الارتباط، وإعدادات الأمان.
- password_hash()جزّئ كلمة المرور بـ password_hash($password, PASSWORD_DEFAULT)، وخزّن النتيجة ذات 60 محرفًا، وافحص تسجيل الدخول بـ password_verify($password, $hash). تعلّم لماذا تتغير التجزئة في كل مرة، والتكلفة، وpassword_needs_rehash، وArgon2id، ولماذا md5 وsha1 خاطئتان لكلمات المرور.
- filter_var()تعيد filter_var($value, FILTER_VALIDATE_EMAIL) القيمة إذا كانت صالحة وfalse إذا لم تكن؛ وتعمل FILTER_VALIDATE_INT وFILTER_VALIDATE_URL وFILTER_VALIDATE_BOOL وFILTER_VALIDATE_IP بالطريقة نفسها. تعلّم الخيارات (min_range وdefault)، والأعلام، ومرشحات التنقية، وفخ false مقابل 0.
- PDOPDO هي طبقة قواعد البيانات في PHP: اتصل بـ new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', $user, $pass)، ثم شغّل كل استعلام فيه قيم عبر prepare() وexecute([$value]). تعلّم الاتصال، والجمل المُعدّة، وجلب الصفوف، والإدراج، والمعاملات، وWHERE IN.
- ComposerComposer هو مدير الحزم في PHP: ينزّل composer require vendor/package مكتبة إلى vendor/، ويسجلها في composer.json، وتحمّلها require 'vendor/autoload.php'. تعلّم تثبيت Composer، وcomposer.json، وقيود الإصدارات، وinstall مقابل update، والتحميل التلقائي PSR-4 لأصنافك.
تصحيح الأخطاء والتدريب
- var_dump() وprint_r()تطبع print_r($array) مصفوفة بشكل مقروء، وتعرض var_dump($value) أيضًا كل نوع وطول، وتطبع var_export شيفرة PHP صالحة. تعلّم متى تستخدم كلًّا منها، وكيف تحصل على مخرجات print_r نصًا، وكيف تطبع بتنسيق جميل في HTML بـ <pre>.
- أسئلة المقابلات24 سؤالًا من أسئلة مقابلات PHP مع إجابات قصيرة وصحيحة لـ PHP 8، من == مقابل === وisset مقابل empty إلى المراجع في foreach، وself مقابل static، والمولّدات، وحقن SQL، وتجزئة كلمات المرور. لمعظم الإجابات شيفرة يمكنك تشغيلها وتغييرها.