تعلم PHP من الصفر: لغة الويب الأساسية للمبتدئين
كل مرة بتسجل دخول في موقع، أو بتشتري أونلاين، أو بتسيب تعليق — فيه لغة شغالة في الكواليس بتنفذ كل ده. اسمها PHP. والمقال ده هياخدك من “عمري ما كتبت سطر كود” لحد ما تبني أول تطبيق ويب حقيقي بإيدك.
اللغة اللي شغالة وراك في كل موقع بتفتحه
خليني أوفر عليك وقت كتير في النقطة دي: أنت مش محتاج “موهبة برمجية” عشان تتعلم PHP. أنت محتاج تفهم هي بتعمل إيه بالظبط، وبعدين تمشي خطوة خطوة.
فكّر في أي موقع بتستخدمه يوميًا: لما بتدخل اسمك وكلمة السر وبتدوس “دخول”، الموقع مش بيفتح صفحة جاهزة — هو بياخد البيانات دي، بيروح يتأكد منها في قاعدة بيانات، وبيبني لك صفحة مخصوصة فيها اسمك وصورتك ورسايلك. العملية دي كلها بتحصل على السيرفر قبل ما الصفحة توصلك. واللغة اللي بتنفذها في أغلب مواقع العالم هي PHP.
المشكلة إن أغلب الشروحات بتبدأ من المكان الغلط: تعريفات أكاديمية، وتاريخ اللغة، وكلام عن “البرمجة كائنية التوجه” من أول درس. هنا هنبدأ من المكان الصح: إيه اللي PHP بتعمله فعلًا؟ بتستقبل طلب، بتنفذ منطق، وبتطلع صفحة. كل درس في المقال ده هيبني على الفكرة دي، وكل مثال هتكتبه بإيدك.
HTML بيرسم الصفحة، وCSS بيجمّلها، وPHP بيشغّلها: بيقرر إيه اللي يظهر لمين، وبيحفظ البيانات، وبيتعامل مع المستخدمين.
يعني إيه PHP؟ الإجابة اللي محدش بيقولها ببساطة
PHP لغة برمجة بتشتغل على السيرفر (server-side). يعني الكود بتاعها بيتنفذ على جهاز الاستضافة مش على جهاز الزائر. الزائر بيبعت طلب، السيرفر بيشغّل كود PHP، والنتيجة اللي بترجع للمتصفح هي HTML عادي.
طيب، ليه ده مهم؟ لأن ده معناه حاجتين: الأولى إن المستخدم مش بيشوف الكود بتاعك أبدًا — بيشوف النتيجة بس. والتانية إنك تقدر تعمل حاجات المتصفح لوحده ميقدرش يعملها: تحفظ بيانات في قاعدة بيانات، تتأكد من كلمات السر، تبعت إيميلات، وتدير صلاحيات المستخدمين.
مثال عملي يوضح الفرق. صفحة HTML ثابتة بتقول للكل نفس الكلام:
<!-- HTML ثابت: نفس المحتوى لكل الزوار -->
<h1>أهلاً بيك في موقعنا</h1>
ونفس الصفحة بـ PHP بتتكلم مع كل زائر باسمه:
<!-- PHP ديناميكي: المحتوى بيتغير حسب الزائر --> <?php $name = "أحمد"; echo "أهلاً بيك يا " . $name; ?>
السطرين دول هما الفرق كله بين “صفحة” و”تطبيق ويب”. صفحة HTML ثابتة زي يافطة محل: نفس الكلام للكل. تطبيق PHP زي موظف استقبال ذكي: بيعرف أنت مين وبيتعامل معاك على هذا الأساس.
PHP ضد جافاسكربت: مين بيعمل إيه؟
سؤال بيحيّر مبتدئين كتير، والإجابة بسيطة: PHP بتشتغل على السيرفر، وجافاسكربت بتشتغل في متصفح الزائر. لما تدوس زرار “أعجبني” ويتحدث العدد من غير ما الصفحة تتحمل من جديد — دي جافاسكربت. لما تسجل دخول والموقع يفتكرك — دي PHP. الاتنين بيكملوا بعض ومش بدائل لبعض: PHP بتجهز البيانات والأمان على السيرفر، وجافاسكربت بتحسّن التفاعل في المتصفح. كمبتدئ، ركز على PHP الأول وبعدين ضيف جافاسكربت — الترتيب ده هيخليك فاهم كل طبقة بتعمل إيه بالظبط.
ملفات PHP امتدادها .php، والكود بيتكتب جوه وسمين: <?php في الأول و ?> في الآخر. أي حاجة بره الوسمين دول بتتعامل كـ HTML عادي. القاعدة دي هتفسر لك نص الحاجات اللي هتشوفها قدام.
ليه PHP بالذات؟ 6 أسباب تخليها أول لغة سيرفر تتعلمها
السؤال ده بيتسأل كتير، والإجابة الصادقة فيها شقين: شق تقني وشق عملي. خلينا في العملي الأول، عشان هو اللي هيفرق معاك فعلًا.
1. ووردبريس مبني عليها — وده سوق شغل كامل
ووردبريس بيشغّل نسبة ضخمة من مواقع الإنترنت، وهو مكتوب بالكامل بـ PHP. يعني تعلم PHP = القدرة على تعديل أي موقع ووردبريس، وبناء إضافات وقوالب، وتقديم خدمات لملايين أصحاب المواقع. دي مش معلومة نظرية — ده سوق شغل حقيقي بيطلب PHP كل يوم. وهنرجع للنقطة دي بالتفصيل في قسم ووردبريس.
2. أسهل دخول لعالم البرمجة الخلفية
مقارنة بلغات السيرفر التانية، PHP متسامحة مع المبتدئ: مش محتاج تجهيزات معقدة، والأخطاء رسايلها واضحة نسبيًا، وتقدر تشوف نتيجة أول سطر كتبه في دقايق. المنحنى التعليمي بتاعها لطيف في البداية وبيتدرج معاك.
3. بتشتغل مع HTML جنبًا لجنب
أغلب لغات السيرفر بتفصلك تمامًا عن صفحة الويب. PHP لأ — بتكتبها جوه نفس ملف الـ HTML. ده بيخلي الانتقال من “بعرف أصمم صفحة” لـ”بعرف أشغّل موقع” انتقال طبيعي مش قفزة في الهوا.
4. استضافة رخيصة ومتاحة في كل حتة
أي استضافة مشتركة رخيصة بتدعم PHP افتراضيًا. مش محتاج سيرفر مخصوص ولا إعدادات غريبة عشان تنشر أول مشروع لك. وده فرق جوهري عن لغات تانية محتاجة بيئة تشغيل خاصة.
5. مجتمع ضخم وحلول جاهزة لكل مشكلة
أي خطأ هيقابلك، حد قابله قبلك وكتب حله. أي وظيفة محتاجها، فيه دالة جاهزة بتعملها. التوثيق الرسمي على php.net من أنضف توثيقات اللغات، وكل دالة فيها أمثلة.
6. اللغة نفسها اتطورت وبقت حديثة
PHP الحديثة (الإصدارات الأخيرة) لغة مختلفة تمامًا عن الصورة النمطية القديمة: أسرع، وأنضف في الكتابة، وفيها مميزات حديثة زي التصريح بأنواع البيانات والدوال السهمية. اللي هيتعلم دلوقتي بيتعلم لغة محترمة مش “لغة قديمة”.
PHP مش الحل لكل حاجة. تطبيقات الموبايل الأصلية وأنظمة الذكاء الاصطناعي الثقيلة ليها أدوات أنسب. لكن لو هدفك مواقع وتطبيقات ويب — وهو هدف أغلب المبتدئين — فـ PHP اختيار عملي ومربح ومش هتندم عليه.
وخليني أكون صريح معاك في نقطة أخيرة: PHP مش هتخليك “مبرمج” لوحدها — اللي هيخليك مبرمج هو حل المشاكل بالكود. اللغة أداة، والتفكير المنطقي هو المهارة. وكل درس في المقال ده مصمم يعلمك الاتنين مع بعض: الأداة في إيدك، وطريقة التفكير في دماغك.
جهّز بيئة العمل في 30 دقيقة (3 طرق — اختار واحدة)
عشان تشغّل كود PHP محتاج “سيرفر محلي” على جهازك: برنامج بيحاكي بيئة الاستضافة. عندك 3 طرق، اختار اللي يناسبك وامشي بيه — متجربش التلاتة.
الطريقة الأولى: XAMPP (الأنسب للمبتدئ تمامًا)
حمّل XAMPP من الموقع الرسمي وثبّته بالخطوات الافتراضية. بعد التثبيت افتح لوحة التحكم وشغّل Apache. حط ملفات PHP في مجلد htdocs، وافتح المتصفح على http://localhost/اسم-الملف.php. الميزة: بييجي معاه MySQL وphpMyAdmin جاهزين — هتحتاجهم قدام في قسم قواعد البيانات.
الطريقة الثانية: Laragon (الأسرع على ويندوز)
بديل خفيف وسريع لويندوز: تثبيت واحد وبتاخد PHP وأباتشي وقاعدة بيانات، مع روابط محلية أنيقة زي mysite.test بدل localhost. لو جهازك ويندوز وعاوز تجربة أنضف وأسرع من XAMPP، ده اختيار ممتاز.
الطريقة الثالثة: السيرفر المدمج في PHP (للي بيحب سطر الأوامر)
لو ثبّت PHP لوحدها على جهازك، تقدر تشغّل سيرفر تطوير بأمر واحد من جوه مجلد مشروعك: php -S localhost:8000. بسيط وسريع للتجربة، لكنه مش بديل كامل لبيئة زي XAMPP لما توصل لقواعد البيانات.
توصيتي العملية: ابدأ بـ XAMPP. هتحتاج قاعدة البيانات اللي معاه بعد كام درس، فوفّر على نفسك خطوة التثبيت التانية.
لو زرار Apache مش راضي يشتغل، غالبًا فيه برنامج تاني واخد المنفذ 80 (أشهرهم سكايب أو IIS). الحل: غيّر منفذ أباتشي من الإعدادات أو اقفل البرنامج المتعارض. ولو ظهرت لك رسالة صلاحيات على ويندوز، شغّل لوحة تحكم XAMPP كمسؤول (Run as administrator). المشكلتان دول بيوقفوا مبتدئين كتير أيامًا، وحلهم دقيقتان.
اعمل ملف اسمه test.php في مجلد المشروع واكتب فيه سطر واحد: <?php phpinfo(); ?>. افتحه في المتصفح — لو شفت صفحة فيها معلومات PHP، يبقى البيئة جاهزة وممكن تكمل بثقة.
أول ملف PHP لك: اكتبه وشغّله بنفسك
وقت التطبيق الحقيقي. اعمل ملف جديد اسمه index.php واكتب فيه الكود ده بالظبط:
<!-- ملف index.php --> <!DOCTYPE html> <html dir="rtl" lang="ar"> <head><meta charset="UTF-8"><title>أول صفحة PHP</title></head> <body> <?php echo "<h1>أهلاً بيك في عالم PHP</h1>"; echo "الساعة دلوقتي: " . date("h:i"); ?> </body> </html>
احفظ الملف في مجلد المشروع وافتحه من المتصفح. هتشوف عنوان وتحته الساعة الحالية — الساعة بتتحدث كل مرة بتعمل refresh. دي أول مرة تشوف فيها الفرق بين الثابت والديناميكي بعينك: الـ HTML ثابت، والـ PHP بيتنفذ من جديد مع كل طلب.
لاحظ 3 حاجات في الكود: echo بتطبع نص في الصفحة، النقطة . بتلزق النصوص في بعض (دمج)، وdate("h:i") دالة جاهزة بترجع الوقت الحالي. الدوال الجاهزة دي كنز — PHP فيها آلاف الدوال اللي بتوفر عليك كتابة الكود من الصفر.
كل سطر في PHP بيخلص بفاصلة منقوطة ;. نسيانها هو أشهر سبب لرسائل الخطأ عند المبتدئين. لو شفت خطأ غريب، أول حاجة تدور عليها: الفواصل المنقوطة.
إزاي تقرأ رسالة الخطأ (مهارة أهم من الحفظ)
رسالة الخطأ في PHP مش عدوك — هي دليلك. بتقولك 3 حاجات: نوع الخطأ (زي Parse error يعني غلطة في كتابة الكود)، ورقم السطر اللي فيه المشكلة، واسم الملف. ابدأ دايمًا من رقم السطر المذكور وبص على السطر اللي قبله كمان — كتير من الأخطاء (زي نسيان قوس أو فاصلة منقوطة) بيكتشفها المفسر في السطر التالي مش نفس السطر. ومع الوقت هتلاقي نفسك بتقرأ الرسالة وتحل المشكلة في ثواني بدل ما تتوتر منها.
المتغيرات وأنواع البيانات (من غير حفظ ولا تلقين)
المتغير في PHP هو “علبة” بتحط فيها قيمة عشان تستخدمها بعدين. العلبة دي اسمها بيبدأ دايمًا بعلامة الدولار $:
<?php $name = "ليلى"; // نص $age = 25; // رقم صحيح $price = 99.5; // رقم عشري $is_member = true; // صح / غلط echo "الاسم: " . $name . " - العمر: " . $age; ?>
الحاجة المريحة في PHP إنك مش بتعلن نوع المتغير — اللغة بتفهم النوع من القيمة تلقائيًا. حطيت نص؟ بقى نص. حطيت رقم؟ بقى رقم. ده بيخلي البداية سهلة جدًا، لكن له تمن هندفع فاتورته في قسم الأخطاء الشائعة.
فيه تفصيلة مهمة في التعامل مع النصوص: علامات التنصيص المزدوجة " " بتفهم المتغيرات اللي جواها، والمفردة ' ' بتتعامل مع كل حاجة كنص خام:
<?php $name = "كريم"; echo "أهلاً $name"; // تطبع: أهلاً كريم echo 'أهلاً $name'; // تطبع: أهلاً $name (حرفيًا) ?>
والثوابت؟ لو عندك قيمة مش هتتغير أبدًا (زي اسم الموقع أو نسبة الضريبة)، استخدم define:
<?php define("SITE_NAME", "متجري"); echo SITE_NAME; // لاحظ: من غير علامة $ ?>
قواعد تسمية المتغيرات (عشان الكود يفضل مقروءًا)
PHP مرنة في التسمية، لكن المرونة من غير نظام بتتحول لفوضى. القواعد: الاسم بيبدأ بحرف أو شرطة سفلية (مش برقم)، وحساس لحالة الحروف — $name و $Name متغيران مختلفان تمامًا. والاتفاق الشائع: استخدم أسلوب $user_name (snake_case) أو $userName (camelCase) — المهم تثبت على واحد في المشروع كله. وسمّي المتغير باسم يوصف محتواه: $total_price أحسن من $x بمراحل لما ترجع للكود بعد شهر.
صديقك الأول في التصحيح: var_dump
لما حاجة تطلع غلط ومش عارف القيمة اللي جوه المتغير إيه، var_dump() بيطبع لك القيمة والنوع مع بعض:
<?php $price = "99.5"; var_dump($price); // string(4) "99.5" — نص مش رقم! $price = (float) $price; // تحويل صريح لرقم عشري var_dump($price); // float(99.5) ?>
المثال ده بيكشف فخًا حقيقيًا: بيانات النماذج بتوصل دايمًا كنصوص، فلو جمعت سعرين من نموذج من غير تحويل ممكن تطلع نتيجة غريبة. عادة التصحيح بـ var_dump هتوفر عليك ساعات من التخمين.
الشروط: خلّي الكود ياخد قرارات
البرنامج اللي بيعمل نفس الحاجة دايمًا مش برنامج ذكي. الذكاء بيبدأ لما الكود يقرر حسب الموقف. وده دور جملة if:
<?php $age = 20; if ($age >= 18) { echo "مسموح لك بالتسجيل"; } elseif ($age >= 13) { echo "محتاج موافقة ولي الأمر"; } else { echo "غير مسموح بالتسجيل"; } ?>
المنطق واضح زي الكلام العادي: لو الشرط الأول اتحقق نفذ اللي جواه، لو لأ جرّب اللي بعده، ولو مفيش حاجة اتحققت نفذ اللي في else. علامات المقارنة اللي هتستخدمها على طول: == يساوي، != لا يساوي، > أكبر من، < أصغر من، >= و <=.
وهنا بقى فيه فخ مشهور لازم تعرفه من دلوقتي: الفرق بين == و ===. الأولى بتقارن القيمة بس، والتانية بتقارن القيمة والنوع معًا:
<?php $x = 5; // رقم $y = "5"; // نص شكله رقم var_dump($x == $y); // true: القيمة واحدة var_dump($x === $y); // false: النوع مختلف ?>
القاعدة العملية: استخدم === دايمًا إلا لو عندك سبب واضح لغير كده. هتوفر على نفسك ساعات من البحث عن أخطاء غامضة.
الاختصار الأنيق: المعامل الثلاثي
لما يكون عندك شرط بسيط بيختار بين قيمتين، مش لازم تكتب if كاملة:
<?php $score = 75; $result = ($score >= 50) ? "ناجح" : "راسب"; echo $result; // ناجح ?>
ولما تكون الاختيارات كتير: switch
<?php $day = "الجمعة"; switch ($day) { case "الجمعة": echo "إجازة - ارتاح"; break; case "السبت": echo "يوم تحضير للأسبوع"; break; default: echo "يوم شغل عادي"; } ?>
نسيان break في الـ switch بيخلي التنفيذ “يقع” على الحالة اللي بعدها وينفذها هي كمان. لو النتيجة طلعت أغرب من المتوقع، بص على الـ break الأول.
الحلقات: خلّي الكود يكرر نفسه
تخيل عاوز تطبع أرقام من 1 لـ 100. هتكتب 100 سطر echo؟ أكيد لأ. الحلقات (loops) بتخليك تكتب الأمر مرة واحدة والكمبيوتر يكرره:
<?php // for: لما تعرف عدد المرات مسبقًا for ($i = 1; $i <= 5; $i++) { echo "رقم: $i <br>"; } // while: لما التكرار يعتمد على شرط $count = 1; while ($count <= 5) { echo "محاولة رقم $count <br>"; $countالـ
forفيها 3 أجزاء بين القوسين: البداية ($i = 1)، والشرط اللي طول ما هو متحقق الحلقة مكملة ($i <= 5)، والخطوة اللي بتحصل بعد كل لفة ($i++يعني زوّد واحد).وفيه أداتين للتحكم جوه الحلقة هتحتاجهم كتير:
<?php for ($i = 1; $i <= 10; $i++) { if ($i == 3) continue; // عدّي الرقم 3 وكمل if ($i == 7) break; // وقف الحلقة كلها عند 7 echo "$i "; } // الناتج: 1 2 4 5 6 ?>تحذير: الحلقة اللانهائيةلو الشرط عمره ما بيبقى غلط، الحلقة هتفضل شغالة للأبد وتعلق السيرفر. دايمًا اتأكد إن المتغير اللي في الشرط بيتغير جوه الحلقة. دي من أشهر أسباب تعليق سكربتات المبتدئين.
إعلانالمصفوفات: أكتر حاجة هتستخدمها في حياتك البرمجية
لو فيه مفهوم واحد لازم تتقنه في PHP فهو المصفوفات (arrays). ليه؟ لأن كل حاجة في تطبيقات الويب عبارة عن قوائم: قائمة منتجات، قائمة مستخدمين، قائمة تعليقات، بيانات نموذج. والمصفوفة هي "علبة" بتشيل أكتر من قيمة مع بعض.
النوع الأول: مصفوفة مرقمة
<?php $fruits = ["تفاح", "موز", "برتقال"]; echo $fruits[0]; // تفاح (العد بيبدأ من صفر) echo $fruits[2]; // برتقال // إضافة عنصر جديد $fruits[] = "مانجو"; echo count($fruits); // 4 ?>النوع الثاني: مصفوفة ترابطية (الأهم)
بدل الأرقام، بتسمي كل عنصر باسم (مفتاح). دي اللي بتمثل "سجل" كامل — زي بيانات مستخدم:
<?php $user = [ "name" => "سارة", "email" => "sara@mail.com", "age" => 28 ]; echo $user["name"]; // سارة echo $user["email"]; // sara@mail.com ?>ولف على المصفوفة: foreach
دي الحلقة اللي اتعملت مخصوص للمصفوفات، وهتستخدمها أكتر من
forوwhileمع بعض:<?php $products = [ ["name" => "لابتوب", "price" => 25000], ["name" => "موبايل", "price" => 12000], ["name" => "سماعة", "price" => 1500] ]; foreach ($products as $p) { echo $p["name"] . " بسعر " . $p["price"] . " جنيه<br>"; } ?>المثال ده مصغّر من اللي بيحصل في أي متجر إلكتروني حقيقي: قائمة منتجات جاية من قاعدة بيانات، و
foreachبتلف عليها وتعرض كل واحد. الفرق الوحيد في الواقع إن البيانات بتيجي من MySQL بدل ما تتكتب يدويًا — وهنوصل للنقطة دي.دوال المصفوفات اللي هتوفر عليك كتير
count()لعدد العناصر،array_push()للإضافة في الآخر،in_array()للبحث عن قيمة،array_keys()لجلب المفاتيح،sort()للترتيب. مش لازم تحفظهم — اعرف إنهم موجودين ودور عليهم لما تحتاجهم.الدوال: اكتب الكود مرة واستخدمه ألف مرة
لو لقيت نفسك بتنسخ نفس الكود في أكتر من مكان، دي إشارة إنك محتاج دالة (function): كتلة كود لها اسم، بتناديها لما تحتاجها بدل ما تعيد كتابتها:
<?php // تعريف الدالة مرة واحدة function greet($name) { return "أهلاً بيك يا $name، نورت الموقع"; } // استخدامها في أي مكان echo greet("محمد"); // أهلاً بيك يا محمد، نورت الموقع echo greet("منى"); // أهلاً بيك يا منى، نورت الموقع ?>الدالة بتاخد مدخلات (parameters) بين القوسين، وبترجع ناتج بكلمة
return. الفرق بينreturnوechoجوه الدالة مهم:echoبتطبع فورًا، لكنreturnبتسلمك القيمة عشان تستخدمها أو تخزنها أو تطبعها وقت ما تحب.وممكن تدي للمدخلات قيمًا افتراضية عشان الدالة تشتغل حتى لو المتصل نسي يبعت حاجة:
<?php function discount($price, $percent = 10) { return $price - ($price * $percent / 100); } echo discount(1000); // 900 (خصم 10% افتراضي) echo discount(1000, 20); // 800 (خصم 20%) ?>مبدأ DRY: لا تكرر نفسكاختصار لـ "Don't Repeat Yourself". أي كود بيتكرر 3 مرات يستاهل يبقى دالة. الدوال مش رفاهية تنظيمية — هي اللي بتخلي تعديل منطق واحد في مكان واحد بدل ما تدور عليه في 20 ملف.
نطاق المتغيرات: ليه الدالة مش شايفة المتغير اللي براها؟
دي من أكتر الحاجات اللي بتلخبط المبتدئين. المتغير المعرف بره الدالة مش متشاف جواها — كل دالة ليها "نطاق" خاص بيها:
<?php $site = "متجري"; function show() { echo $site; // خطأ: المتغير مش متشاف هنا } function show_ok($site) { echo $site; // صح: اتبعت كمدخل } show_ok($site); ?>القاعدة: مرر كل اللي الدالة محتاجاه كمدخلات. ده بيخلي الدالة مستقلة وقابلة لإعادة الاستخدام في أي مكان — وهي نفس الفلسفة اللي هتقابلها بعدين في البرمجة كائنية التوجه وأطر العمل.
إعلانالنماذج: إزاي تستقبل بيانات المستخدم (GET وPOST)
هنا PHP بتبدأ تبقى "حقيقية". أي تفاعل في الويب — تسجيل دخول، بحث، تعليق، طلب شراء — هو نموذج HTML بيبعت بيانات، وكود PHP بيستقبلها ويتصرف. خلينا نبني أول نموذج:
<!-- ملف form.php: النموذج والمعالجة في نفس الصفحة --> <form method="post" action=""> الاسم: <input type="text" name="username"> <button type="submit">إرسال</button> </form> <?php if ($_SERVER["REQUEST_METHOD"] === "POST") { $name = $_POST["username"]; echo "أهلاً " . htmlspecialchars($name); } ?>اللي حصل: النموذج بيبعت الاسم بطريقة
POST، وPHP بتستقبله في مصفوفة جاهزة اسمها$_POST— المفتاح فيها هو نفس اسم الحقل (name="username"). ولاحظhtmlspecialchars(): دي دالة حماية بتمنع المستخدم من حقن كود HTML خبيث في صفحتك. أي بيانات جاية من المستخدم لازم تعدي عليها قبل العرض — دي قاعدة أمنية مش اختيارية.الفرق بين GET وPOST (سؤال مقابلات شهير)
| وجه المقارنة | GET | POST |
|---|---|---|
| البيانات بتظهر فين؟ | في رابط الصفحة نفسه | مخفية في جسم الطلب |
| تصلح لكلمات السر؟ | لا — أبدًا | أيوه |
| مثال الاستخدام | البحث، الفلاتر، ترقيم الصفحات | تسجيل الدخول، التسجيل، الطلبات |
| المصفوفة في PHP | $_GET |
$_POST |
| ممكن تعمل لها bookmark؟ | أيوه — الرابط كامل | لا |
القاعدة العملية: GET للقراءة والبحث، وPOST لأي حاجة بتغيّر حاجة (تسجيل، حفظ، حذف، شراء). لو شفت نموذج تسجيل دخول بيستخدم GET، اعرف إن اللي كاتبه مبتدئ — ودلوقتي أنت مش منهم.
لو المستخدم فتح الصفحة من غير ما يبعت النموذج، $_POST["username"] مش هتكون موجودة وهتطلع تحذير. الحل: if (isset($_POST["username"])) أو $name = $_POST["username"] ?? ""; — علامة ?? بتقول "لو مش موجودة استخدم القيمة البديلة".
PHP وقاعدة البيانات: اتكلم مع MySQL بأمان
الموقع من غير قاعدة بيانات زي محل من غير مخزن: كل حاجة بتضيع لما تقفل. PHP بتتواصل مع MySQL، والطريقة الحديثة والآمنة اسمها PDO. خلينا نتصل ونقرأ بيانات خطوة بخطوة:
<?php // 1) الاتصال بقاعدة البيانات $pdo = new PDO( "mysql:host=localhost;dbname=my_store;charset=utf8mb4", "root", "" ); // 2) تجهيز استعلام آمن (prepared statement) $stmt = $pdo->prepare("SELECT name, price FROM products WHERE price < :max"); $stmt->execute(["max" => 10000]); // 3) لف على النتائج واعرضها foreach ($stmt as $row) { echo $row["name"] . " - " . $row["price"] . "<br>"; } ?>
النقطة الجوهرية هنا هي prepare + execute. بدل ما تلزق مدخلات المستخدم جوه نص الاستعلام (وهو اللي بيفتح باب الاختراق)، بتحط عنصر نائب (:max) وبعدين تبعت القيمة منفصلة. قاعدة البيانات بتتعامل مع القيمة كـ"بيانات" مش كـ"جزء من الأمر" — فحتى لو المستخدم كتب كود خبيث، هيتخزن كنص عادي مش هيتنفذ.
$pdo->query("SELECT * FROM users WHERE name = '$name'") — لزق المتغير مباشرة في الاستعلام. ده اسمه SQL Injection وهو أشهر ثغرة في تاريخ الويب. استخدم prepared statements دايمًا، من غير استثناءات ولا "دي تجربة صغيرة". العادة بتتبني من أول يوم.
والإدخال في القاعدة بنفس الطريقة:
<?php $stmt = $pdo->prepare( "INSERT INTO users (name, email) VALUES (:name, :email)" ); $stmt->execute([ "name" => $_POST["username"], "email" => $_POST["email"] ]); echo "تم الحفظ بنجاح، رقم العضو: " . $pdo->lastInsertId(); ?>
نظّم مشروعك: قسّم الكود لملفات (include وrequire)
لحد دلوقتي كل أمثلتنا في ملف واحد. وده كويس للتعلم، لكن أول ما المشروع يكبر — صفحة رئيسية، صفحة اتصل بنا، لوحة تحكم — هتلاقي نفسك بتكرر نفس الأجزاء في كل ملف: نفس الهيدر، نفس الفوتر، نفس كود الاتصال بقاعدة البيانات. الحل: اكتب الجزء المشترك مرة واحدة في ملف مستقل، واستدعيه في كل الصفحات.
PHP بتديك 4 أوامر للاستدعاء، والفرق بينهم مهم:
| الأمر | لو الملف مش موجود | لو اتستدعى مرتين | الاستخدام |
|---|---|---|---|
include |
تحذير ويكمل التنفيذ | يتضمن مرتين | أجزاء اختيارية |
require |
خطأ فادح ويقف | يتضمن مرتين | ملفات أساسية |
include_once |
تحذير ويكمل التنفيذ | يتضمن مرة واحدة فقط | مكتبات الدوال |
require_once |
خطأ فادح ويقف | يتضمن مرة واحدة فقط | الإعدادات والاتصال بالقاعدة |
القاعدة العملية اللي هتمشي عليها في كل مشاريعك: استخدم require_once لملفات الإعدادات والاتصال بقاعدة البيانات والدوال — لأن غيابها معناه إن الصفحة مش هتشتغل أصلًا، فالأفضل إنها تقف بوضوح بدل ما تكمل بنص وظائفها وتطلع نتائج غلط.
وهيكل مشروع صغير منظم بيبقى شكله كده:
my-project/
├── config.php ← الإعدادات والاتصال بقاعدة البيانات
├── functions.php ← الدوال المشتركة
├── header.php ← بداية الصفحة (القائمة العلوية)
├── footer.php ← نهاية الصفحة
├── index.php ← الصفحة الرئيسية
├── login.php ← تسجيل الدخول
└── dashboard.php ← لوحة التحكم
وكل صفحة من صفحات الموقع بتبدأ وتنتهي بنفس السطرين:
<?php require_once "config.php"; // الاتصال بالقاعدة + بدء الجلسة require_once "functions.php"; // الدوال المشتركة include "header.php"; // الشكل العلوي ?> <!-- محتوى الصفحة المميز هنا --> <?php include "footer.php"; ?>
شايف الفكرة؟ عاوز تغيّر القائمة العلوية للموقع كله؟ بتعدل ملف header.php واحد بدل 20 صفحة. عاوز تغيّر بيانات الاتصال بقاعدة البيانات؟ ملف config.php واحد. التنظيم ده هو الفرق بين "كود شغال" و"مشروع محترم".
لما المشروع يكبر وتبقى الملفات في مجلدات فرعية، المسارات النسبية بتتلخبط. الثابت السحري __DIR__ بيرجع مسار المجلد اللي فيه الملف الحالي، فبتكتب: require_once __DIR__ . "/config.php"; — وده بيشتغل من أي مكان في المشروع من غير ما تحسب كام ../ محتاج.
وفيه تفصيلة أخيرة بتفرق في المشاريع الحقيقية: افصل الإعدادات الحساسة. بيانات الاتصال بقاعدة البيانات (اسم المستخدم وكلمة السر) حطها في ملف config.php بره مجلد الموقع العام لو أمكن، أو على الأقل متشاركوش في أي مكان عام. كتير من اختراقات المواقع الصغيرة سببها ملف إعدادات اتسرب فيه باسورد القاعدة.
مشروع تطبيقي كامل: نظام تسجيل دخول مصغر
دلوقتي هنجمع كل اللي فات في مشروع واحد حقيقي: صفحة تسجيل عضوية + صفحة دخول + صفحة ترحيب محمية. المشروع ده فيه كل المفاهيم الأساسية لأي تطبيق ويب: نماذج، تحقق، تشفير كلمات سر، جلسات، وقاعدة بيانات.
الخطوة 1: جدول المستخدمين
نفذ الأمر ده في phpMyAdmin (تبويب SQL):
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL );
الخطوة 2: ملف الاتصال (db.php)
<?php $pdo = new PDO( "mysql:host=localhost;dbname=my_store;charset=utf8mb4", "root", "", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); session_start(); // تفعيل الجلسات في كل صفحة تحتاجها ?>
الخطوة 3: صفحة التسجيل (register.php)
<?php require "db.php"; ?> <form method="post"> الاسم: <input name="name" required><br> الإيميل: <input name="email" type="email" required><br> كلمة السر: <input name="password" type="password" required><br> <button>تسجيل</button> </form> <?php if ($_SERVER["REQUEST_METHOD"] === "POST") { $hash = password_hash($_POST["password"], PASSWORD_DEFAULT); $stmt = $pdo->prepare( "INSERT INTO users (name, email, password) VALUES (?, ?, ?)"); $stmt->execute([$_POST["name"], $_POST["email"], $hash]); echo "تم التسجيل بنجاح"; } ?>
لاحظ password_hash(): كلمة السر مش بتتخزن زي ما هي أبدًا — بتتحول لبصمة مشفرة مستحيل عكسها. حتى لو حد سرق قاعدة البيانات، مش هيعرف كلمات السر الأصلية. دي مش رفاهية — ده الحد الأدنى المقبول.
الخطوة 4: صفحة الدخول (login.php)
<?php require "db.php"; ?> <form method="post"> الإيميل: <input name="email" type="email" required><br> كلمة السر: <input name="password" type="password" required><br> <button>دخول</button> </form> <?php if ($_SERVER["REQUEST_METHOD"] === "POST") { $stmt = $pdo->prepare( "SELECT * FROM users WHERE email = ?"); $stmt->execute([$_POST["email"]]); $user = $stmt->fetch(); if ($user && password_verify($_POST["password"], $user["password"])) { $_SESSION["user_id"] = $user["id"]; $_SESSION["user_name"] = $user["name"]; header("Location: dashboard.php"); exit; } else { echo "بيانات الدخول غير صحيحة"; } } ?>
الخطوة 5: الصفحة المحمية (dashboard.php)
<?php require "db.php"; if (!isset($_SESSION["user_id"])) { header("Location: login.php"); exit; } echo "أهلاً " . htmlspecialchars($_SESSION["user_name"]); ?> <a href="logout.php">تسجيل خروج</a>
وملف logout.php سطرين بس: session_start(); session_destroy(); ثم تحويل لصفحة الدخول.
الجلسات ($_SESSION) هي ذاكرة السيرفر عن الزائر: بتفضل فاكرة إنه مسجل دخول وهو بيتنقل بين الصفحات. والتحقق في أول الصفحة المحمية هو "البواب" اللي بيمنع أي حد مش مسجل من الدخول. النمط ده — تحقق ثم عرض — هو أساس كل لوحات التحكم في العالم.
PHP وووردبريس: العلاقة اللي لازم تفهمها
هنا بقى النقطة اللي بتفرق مع شريحة كبيرة من القراء. ووردبريس — اللي بيشغّل ملايين المواقع والمتاجر والمدونات — مكتوب بالكامل بلغة PHP. القوالب (themes) ملفات PHP، والإضافات (plugins) ملفات PHP، وملف الإعدادات wp-config.php أشهر ملف PHP في العالم.
وده معناه حاجة عملية جدًا: كل اللي اتعلمته في المقال ده بينطبق مباشرة على ووردبريس. لما تفتح ملف قالب وتلاقي سطر زي ده، مش هتتخض:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h2><?php the_title(); ?></h2> <?php endwhile; endif; ?>
دي نفس if و while اللي اتعلمتهم — بس بدوال ووردبريس الجاهزة (have_posts، the_title). اللي فاهم أساسيات PHP بيقرأ كود ووردبريس زي ما بيقرأ عربي، واللي مش فاهمها بيتعامل مع القوالب كطلاسم.
والمسارات المهنية اللي بتتفتح هنا واضحة: تعديل قوالب جاهزة لعملاء، بناء قوالب مخصصة من الصفر، تطوير إضافات، وصيانة مواقع. كلها خدمات مطلوبة باستمرار لأن ووردبريس موجود في كل سوق. ولو عاوز تفهم الجانب العملي لتطوير مواقع ووردبريس نفسه — من التثبيت لحد التخصيص — المقال ده هيكمل لك الصورة:
نصيحة ترتيب: اتقن أساسيات PHP الأول، وبعدين ادخل عالم ووردبريس. اللي بيدخل ووردبريس من غير أساسيات بيبقى "بيركّب" مش "بيبني" — وأول مشكلة حقيقية بتقابله بتوقفه. أنت دلوقتي بتبني الأساس الصح.
بعد ما تخلص أساسيات PHP، افتح الـ Theme Developer Handbook الرسمي على موقع مطوري ووردبريس — هتلاقي رابطه في قسم المصادر تحت. بيشرح بنية القوالب والدوال الأساسية خطوة بخطوة، وهتحس إنك بتقرأ لغة تعرفها مش لغة جديدة.
7 أخطاء أمنية بيقع فيها كل مبتدئ (اتجنبها من دلوقتي)
الأمان في PHP مش موضوع متقدم تؤجله — هو عادات بتبنيها من أول سطر. الأخطاء دي شائعة لدرجة إنك هتشوفها في شروحات كتير على الإنترنت، فاعرفها عشان متقلدهاش.
1. تخزين كلمات السر كنص صريح
شفنا الحل: password_hash() عند التسجيل و password_verify() عند الدخول. أي كود بيخزن كلمة السر زي ما المستخدم كتبها كود مرفوض مهما كان سياقه.
2. لزق مدخلات المستخدم في استعلامات SQL
اتكلمنا عنه بالتفصيل: استخدم prepared statements دايمًا. مفيش "بس دي صفحة تجريبية" — التجريبية بتتحول لإنتاجية، والعادة السيئة بتفضل.
3. عرض بيانات المستخدم من غير تنظيف
أي حاجة جاية من $_POST أو $_GET أو قاعدة البيانات وتتعرض في صفحة، لازم تعدي على htmlspecialchars(). من غيرها، مهاجم يقدر يحقن سكربت خبيث يتنفذ في متصفحات زوارك (ثغرة XSS).
4. رسائل خطأ مفصلة في بيئة الإنتاج
أثناء التطوير، رسائل الخطأ التفصيلية مفيدة. لكن على موقع حي، هي خريطة مجانية للمهاجم (بتكشف بنية قاعدة البيانات والمسارات). في الإنتاج: سجّل الأخطاء في ملف واعرض صفحة خطأ عامة للزائر.
5. رفع ملفات من غير تحقق
نموذج "ارفع صورتك" من أخطر الحاجات لو اتعمل غلط: مهاجم ممكن يرفع ملف PHP متنكر كصورة وينفذه على سيرفرك. القواعد: تحقق من نوع الملف الحقيقي مش الامتداد بس، غيّر اسم الملف المرفوع، واحفظه بره مجلد الموقع العام لو أمكن.
6. نسيان التحقق من الصلاحيات
صفحة "حذف مستخدم" موجودة في لوحة التحكم مش معناها إن أي حد يعرف رابطها يقدر يستخدمها. كل صفحة حساسة لازم تتحقق في أولها: هل الزائر مسجل دخول؟ وهل دوره يسمح بالعملية دي؟ الرابط المخفي مش حماية.
7. الاعتماد على JavaScript للتحقق فقط
التحقق في المتصفح (JavaScript) تجربة استخدام حلوة، لكنه مش أمان — أي حد يقدر يتجاوزه. القاعدة: تحقق في المتصفح لراحة المستخدم، وأعد التحقق في PHP للأمان. السيرفر هو خط الدفاع الحقيقي.
لا تثق في أي بيانات جاية من المتصفح. شفّر كلمات السر. استخدم prepared statements. لو طبقت التلاتة دول بس، فأنت آمن من أغلب الهجمات الشائعة على تطبيقات المبتدئين.
خريطة طريق 60 يوم: من الصفر لأول مشروع حقيقي
بلاش تشتت. الخطة دي مبنية على ساعة لثلاث ساعات يوميًا، وكل مرحلة بتسلم للي بعدها:
بعد الـ 60 يوم، الطريق بيتفرع حسب هدفك: مسار ووردبريس (تعمق في القوالب والإضافات)، أو مسار التطبيقات (اتعلم البرمجة كائنية التوجه OOP وبعدين إطار عمل زي Laravel)، أو مسار العمل الحر (ابدأ بخدمات صغيرة: تعديل مواقع، نماذج، لوحات بسيطة).
3 مضيعات وقت تجنبها في الرحلة
الأولى: التنقل بين الكورسات — تبدأ كورس وتسيبه في النص عشان لقيت واحد "أحسن". الكورس الكامل المتوسط أحسن من 5 كورسات ناقصة. التانية: حفظ الدوال — مش مطلوب تحفظ ولا دالة؛ المطلوب تعرف الدالة موجودة وتعرف تدور عليها في التوثيق. التالتة: انتظار "الاستعداد الكامل" — مفيش لحظة هتحس فيها إنك جاهز 100%. ابني المشروع وأنت بتتعلم، والأخطاء اللي هتقابلك هي المنهج الحقيقي.
مشروع واحد تخلصه أحسن من 10 كورسات تبدأهم. البرمجة مهارة إيد مش مهارة عين — الكود اللي بتكتبه بإيدك هو اللي بيثبت، مش الفيديو اللي بتتفرج عليه.
المصادر الموثقة: 12 مصدرًا بروابطها المباشرة
كل مصدر هنا اتفتح واتأكد منه فعليًا. اختار مسار واحد عربي وواحد إنجليزي وامشي عليهم — التشتت بين المصادر هو العدو الأول.
التوثيق الرسمي: درس PHP المبسط
البداية الرسمية من موقع PHP نفسه: درس قصير ياخدك من أول صفحة لحد التعامل مع النماذج. المرجع اللي ترجع له لما تحتاج المعلومة الصح من مصدرها.
مجاني
W3Schools — PHP Tutorial
شرح مبسط جدًا مع محرر تجريبي داخل الصفحة: تقرأ المثال وتجربه فورًا من غير تثبيت أي حاجة. ممتاز لأول أسبوعين.
مجاني
PHP Tutorial — شرح حديث ومنظم
كورس مكتوب متكامل بأسلوب حديث: من التثبيت لحد بناء نظام تسجيل دخول كامل، كل درس فيه أمثلة قابلة للتجربة. من أنضف المصادر المكتوبة حاليًا.
مجاني
PHP: The Right Way
مرجع أفضل الممارسات: بيصحح المفاهيم الغلط المنتشرة وبيعلمك "الطريقة الصح" لكتابة PHP حديثة وآمنة. اقرأه بعد الأساسيات.
مجاني
Learn-PHP.org — تفاعلي
دروس تفاعلية قصيرة: كل درس شرح بسيط ثم تمرين تحله داخل المتصفح مباشرة. بيغطي الأساسيات كلها في جلسات صغيرة مركزة.
100% Free
كورس PHP بالعربي — أكاديمية الزيرو
شرح عربي مفصل من الصفر للإصدار الحديث من PHP: عشرات الدروس المرتبة مع تكليفات عملية بعد كل مجموعة دروس. القائمة الكاملة متاحة مجانًا على يوتيوب.
مجانيعربي
PHP Full Course — freeCodeCamp
كورس فيديو إنجليزي شامل من الصفر: شرح هادئ وأمثلة عملية ومشاريع صغيرة على مدار ساعات. مناسب للي مرتاح مع الإنجليزية.
مجاني
Object Oriented PHP — Net Ninja
سلسلة إنجليزية مركزة عن البرمجة كائنية التوجه في PHP: خطوتك التالية بعد الأساسيات وقبل أطر العمل. شرح واضح وأمثلة قصيرة.
مجاني
3v4l.org — جرّب الكود أونلاين
محرر PHP حقيقي داخل المتصفح: اكتب الكود وشوف النتيجة فورًا على عشرات إصدارات PHP. مفيد للتجربة السريعة ومشاركة الأكواد.
مجاني
Laragon — بيئة تطوير محلية
بيئة تطوير خفيفة وسريعة لويندوز: PHP وسيرفر وقاعدة بيانات بتثبيت واحد وروابط محلية أنيقة. البديل الأسرع لـ XAMPP.
مجاني
XAMPP — أشهر بيئة PHP
الحزمة المجانية الأشهر: Apache وPHP وMySQL وphpMyAdmin في مثبت واحد. الطريقة اللي شرحناها في قسم تجهيز البيئة.
مجاني
WordPress Theme Handbook
التوثيق الرسمي لتطوير قوالب ووردبريس: بنية القالب، الدوال الأساسية، وأفضل الممارسات. خطوتك الأولى بعد إتقان أساسيات PHP لو هدفك ووردبريس.
مجاني
نصيحة أخيرة عن المصادر: مصدر واحد تخلصه أحسن من عشرة تبدأهم. اختار كورس الزيرو (عربي) مع W3Schools أو learn-php.org للتطبيق السريع، وامشي عليهم بالتوازي مع المقال ده — كفاية جدًا للوصول لمستوى عملي حقيقي.
تحدي الـ48 ساعة
قبل ما تقفل الصفحة: ثبّت XAMPP، واعمل ملف index.php، واكتب نموذج بسيط يستقبل اسم الزائر ويرحب بيه. أول نموذج شغال بإيدك أهم من 5 ساعات قراءة. ابدأ دلوقتي — وبعد 60 يوم من الالتزام اليومي هتبص وراك وتستغرب المسافة اللي قطعتها.
الأسئلة الشائعة
هل PHP لغة ميتة ولا لسه ليها مستقبل؟
لا، مش ميتة خالص. PHP بتشغّل نسبة ضخمة من مواقع الويب حول العالم، وووردبريس وحده مبني عليها بالكامل. اللغة نفسها اتطورت كتير في إصداراتها الحديثة: أسرع وأنضف وفيها مميزات عصرية. سوق الشغل فيها مستمر — خصوصًا في تطوير ووردبريس والمتاجر الإلكترونية.
محتاج أتعلم HTML وCSS قبل PHP؟
أساسيات HTML أيوه — لأن PHP بتطلع HTML في الآخر، فلازم تفهم اللي بتطلعه. CSS مش شرط في البداية: تقدر تتعلم PHP وتنفذ المنطق كله، وتجمّل لاحقًا. الترتيب العملي: HTML أساسي، ثم PHP، ثم CSS وجافاسكربت بالتوازي مع التطبيق.
أتعلم PHP ولا بايثون لتطوير الويب؟
لو هدفك مواقع وتطبيقات ويب بسرعة مع سوق شغل مباشر (ووردبريس، متاجر، مواقع شركات): PHP — أسهل في النشر وأرخص في الاستضافة. لو هدفك أوسع (ذكاء اصطناعي، تحليل بيانات، أتمتة) مع الويب كجزء منه: بايثون. للمبتدئ اللي عاوز يشوف نتيجة سريعة ويشتغل: PHP بتكسب.
إيه الفرق بين == و=== في PHP؟
علامة == بتقارن القيمة بس من غير ما تهتم بالنوع — فالرقم 5 بيساوي النص "5". أما === فبتقارن القيمة والنوع معًا — فالرقم 5 لا يساوي النص "5". النصيحة العملية: استخدم === دايمًا إلا لو عندك سبب واضح، وهتوفر على نفسك أخطاء غامضة كتير.
ليه كود PHP مش بيشتغل لما أفتح الملف مباشرة في المتصفح؟
لأن PHP لغة سيرفر — لازم يتنفذ على سيرفر مش في المتصفح مباشرة. فتح الملف بالدبل كليك بيفتحه كملف عادي والمتصفح بيعرض الكود كنص. الحل: شغّل بيئة محلية زي XAMPP وحط الملف في مجلد المشروع وافتحه عبر الرابط المحلي.
إزاي أحمي موقعي من ثغرة SQL Injection؟
باستخدام الاستعلامات المُجهزة (prepared statements) مع PDO: بتفصل بيانات المستخدم عن نص الاستعلام، فقاعدة البيانات بتتعامل مع المدخلات كبيانات مش كأوامر. دي القاعدة الذهبية — ممنوع لزق متغيرات مباشرة جوه نص SQL تحت أي ظرف.
فين أخزن كلمات سر المستخدمين؟
مش بتتخزن أبدًا كنص صريح. استخدم دالة password_hash() عند التسجيل لتحويل كلمة السر لبصمة مشفرة، ودالة password_verify() عند الدخول للمقارنة. حتى لو اتسرقت قاعدة البيانات، المهاجم مش هيقدر يعرف كلمات السر الأصلية.
إمتى أستخدم GET وإمتى POST في النماذج؟
القاعدة البسيطة: GET للقراءة والبحث — البيانات بتظهر في الرابط وممكن حفظه كمفضلة. POST لأي عملية بتغيّر حاجة — تسجيل دخول، تسجيل عضوية، حفظ، حذف، شراء. كلمات السر والبيانات الحساسة لازم POST دايمًا، من غير أي استثناء.
هل أقدر أشتغل بـ PHP من غير ما أتعلم قواعد البيانات؟
في البداية أيوه — تقدر تبني صفحات ونماذج بسيطة من غير قاعدة بيانات. لكن أي تطبيق حقيقي (مستخدمين، منتجات، تعليقات) محتاج تخزين دائم، وهنا MySQL بتدخل. الخطة العملية: اتقن الأساسيات الأول، وبعدين ادخل قواعد البيانات — الترتيب ده اللي مشينا عليه في المقال.
إيه الخطوة بعد أساسيات PHP؟
ثلاث مسارات حسب هدفك: البرمجة كائنية التوجه (OOP) ثم إطار عمل زي Laravel لو عاوز تبني تطبيقات كبيرة، أو التعمق في تطوير ووردبريس (قوالب وإضافات) لو عاوز سوق شغل سريع، أو بناء مشاريع حقيقية صغيرة للعمل الحر. المشترك: مشروع حقيقي تطبق فيه — مش كورس تاني.
ليه بيطلع لي خطأ "Undefined variable"؟
لأنك بتحاول تستخدم متغير قبل ما يتعرف أو قبل ما ياخد قيمة — أشهر حالة: استخدام $_POST مباشرة من غير ما تتأكد إن النموذج اتبعت. الحل: عرّف المتغير بقيمة افتراضية الأول، أو استخدم isset() للتحقق، أو علامة ?? للقيمة البديلة.
أقدر أبني موقع كامل بـ PHP من غير إطار عمل؟
أيوه تمامًا — وده اللي عملناه في مشروع نظام تسجيل الدخول. أطر العمل زي Laravel بتسهل المشاريع الكبيرة وبتنظم الكود، لكنها مش شرط للبداية. بالعكس: اللي يبني مشروعًا كاملًا بـ PHP خام بيفهم إطار العمل أسرع لما يوصله، لأنه فاهم اللي بيحصل تحت الغطاء.