تعمل PHP على الخادم: تبني الصفحة، وترسل HTML الجاهز، ثم تتوقف. أما JavaScript فتعمل في متصفح الزائر، حيث تتفاعل مع النقرات وتغيّر الصفحة بعد تحميلها، ومع Node.js يمكنها العمل على الخادم أيضًا. لذا فاللغتان شريكتان أكثر من كونهما متنافستين: يستخدم الموقع المعتاد PHP (أو Node.js) على الخادم وJavaScript في المتصفح.
هذا الكود بلغة PHP يعمل على الخادم. لا يستقبل المتصفح إلا ما يطبعه، ويعرض تبويب Page تلك النتيجة:
انظر إلى تبويب Output: لم يبقَ فيه أي PHP، بل HTML فقط. والقائمة نفسها مبنية بـ JavaScript في المتصفح تبدو هكذا:
const products = [
{ name: "Keyboard", price: 49 },
{ name: "Mouse", price: 19 },
{ name: "Monitor", price: 189 },
];
const ul = document.querySelector("#cart"); // an empty <ul id="cart"> in the HTML
for (const p of products) {
const li = document.createElement("li");
li.textContent = `${p.name}: $${p.price}`;
ul.append(li);
}
ترسل نسخة PHP صفحة كاملة، تقرؤها محركات البحث والهواتف البطيئة فورًا. أما نسخة JavaScript فتستطيع تحديث القائمة لاحقًا دون إعادة تحميل، مثلًا عندما يحذف الزائر عنصرًا.
أين تعمل كل لغة
| PHP | JavaScript | |
|---|---|---|
| تعمل في | خادم الويب (أو الطرفية) | المتصفح، وعلى الخادم مع Node.js أو Deno أو Bun |
| ترى | الملفات وقواعد البيانات والبيئة والأسرار | الصفحة (DOM) والنقرات وتخزين المتصفح |
| مدة الحياة | تشغيل واحد لكل طلب | ما دامت الصفحة مفتوحة (المتصفح)، أو عملية واحدة طويلة (Node.js) |
| العمل المعتاد | بناء الصفحات ومعالجة النماذج وواجهات API والتعامل مع قاعدة البيانات | التفاعل والتحديثات الحية وتطبيقات الصفحة الواحدة وخوادم Node.js |
| هل يستطيع الزائر قراءة الكود | لا | نعم، في المتصفح |
الصف الأخير مهم للأمان: كل ما في JavaScript المتصفح مرئي للزائر، لذا مكان كلمات المرور ومفاتيح API والتحقق من الأسعار هو الخادم.
الصياغة جنبًا إلى جنب
تتشابه اللغتان لأن كلتيهما تقتبس من C: الأقواس المعقوصة وif وfor وwhile وfunction وreturn. والفروق في التفاصيل:
| المهمة | PHP | JavaScript |
|---|---|---|
| متغير | $name = "Ada"; | let name = "Ada"; |
| ثابت | const MAX = 10; | const MAX = 10; |
| ربط النصوص | "Hi " . $name | "Hi " + name |
| نص قالب | "Hi $name" | `Hi ${name}` |
| قائمة | ["a", "b"] | ["a", "b"] |
| مفتاح/قيمة | ["id" => 1] | { id: 1 } |
| الطول | count($list), strlen($s) | list.length, s.length |
| حلقة | foreach ($list as $item) | for (const item of list) |
| دالة سهمية | fn($x) => $x * 2 | (x) => x * 2 |
| الطباعة | echo "Hi"; | console.log("Hi"); |
هذه دالة مع دالة رد نداء (callback) بلغة PHP:
وبلغة JavaScript، حيث map وfilter دوال تابعة للمصفوفة:
const prices = [12.5, 8, 30, 4.25];
const withTax = prices.map((p) => Math.round(p * 1.2 * 100) / 100);
const cheap = withTax.filter((p) => p < 15);
console.log(withTax.join(", "));
console.log("Under 15: " + cheap.join(", "));
العامل +: الفخ الكلاسيكي
في JavaScript يجمع + الأعداد ويربط النصوص معًا، لذا فإن وجود نص في أي مكان يحوّل الجمع إلى ربط. أما PHP فتفصل بينهما: + يجمع دائمًا و. يربط دائمًا.
console.log("10" + 5); // "105"
console.log("10" - 5); // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false
ولدى اللغتين أيضًا المساواة المرنة == والصارمة ===. والنصيحة واحدة في الاثنتين: استخدم === ما لم تقصد المقارنة بين أنواع مختلفة.
تمرير البيانات من PHP إلى JavaScript
تعمل PHP أولًا، لذا تستطيع كتابة البيانات مباشرة في الصفحة لتستخدمها JavaScript في المتصفح. تحوّل json_encode مصفوفة PHP إلى JavaScript صالحة:
يعرض تبويب Output السكربت المولَّد والبيانات مملوءة فيه. يهرّب الخيار JSON_HEX_TAG المحرفين < و>، فلا تستطيع قيمة تحتوي على </script> إنهاء السكربت مبكرًا. المزيد عن الخيارات في json_encode.
والاتجاه الآخر يمر عبر HTTP: تستدعي JavaScript في المتصفح fetch("/api/cart.php")، فيُنفَّذ سكربت PHP ويجيب بـ JSON:
<?php
// api/cart.php
header('Content-Type: application/json');
echo json_encode(['items' => 3, 'total' => 257]);
const res = await fetch("/api/cart.php");
const cart = await res.json();
console.log(cart.total); // 257
PHP مقابل Node.js على الخادم
عندما تعمل JavaScript على الخادم عبر Node.js، تصبح المقارنة اختيارًا حقيقيًا.
| PHP | Node.js | |
|---|---|---|
| النموذج | تشغيل جديد لكل طلب دون مشاركة أي شيء | عملية واحدة طويلة مع حلقة أحداث |
| انتظار الإدخال والإخراج | يحجب ذلك الطلب (الطلبات الأخرى تعمل في عمّال آخرين) | غير حاجب، async/await |
| تبرع في | المواقع المولّدة على الخادم وأنظمة إدارة المحتوى وتطبيقات CRUD التقليدية | التطبيقات الآنية وwebsockets والاتصالات الخاملة الكثيرة |
| الاستضافة | أي استضافة مشتركة، PHP-FPM | مدير عمليات Node أو منصة مثل Vercel |
| أطر العمل الكبرى | Laravel وSymfony وWordPress | Express وNestJS وNext.js |
| لغة واحدة للواجهة والخلفية | لا | نعم |
نموذج PHP متسامح: الخطأ البرمجي أو تسرب الذاكرة لا يؤثر إلا في طلب واحد، وكل طلب يبدأ نظيفًا. أما نموذج Node فيستطيع إبقاء الحالة والاتصالات مفتوحة، وهذا يناسب الدردشة ولوحات المتابعة الحية، لكن الانهيار أو الحلقة الحاجبة يؤثران في كل مستخدمي تلك العملية.
أيهما تتعلم
ستحتاج إلى JavaScript في أي صفحة ويب تفاعلية، لأنها اللغة الوحيدة التي تشغّلها المتصفحات. والسؤال هو ما الذي يعمل على الخادم:
- تعلّم PHP بعد ذلك إذا أردت العمل مع ووردبريس أو Laravel أو مواقع PHP الكثيرة الموجودة، أو إذا أردت أبسط طريقة لوضع موقع ديناميكي على استضافة رخيصة. ابدأ بـ ما هي PHP.
- ابقَ مع JavaScript (Node.js) إذا أردت لغة واحدة للمنظومة كلها أو كنت تبني ميزات آنية.
المسار الشائع هو HTML وCSS، ثم JavaScript في المتصفح، ثم لغة خادم واحدة. وأيًا كانت لغة الخادم التي تختارها، فالنماذج والجلسات وقواعد البيانات وواجهات JSON تعمل على أفكار HTTP نفسها، لذا تنتقل المعرفة معك.
الأسئلة الشائعة
هل يمكن أن تحل JavaScript محل PHP؟
على الخادم، نعم: تؤدي Node.js (مع Express أو Next.js أو ما يشبههما) الأعمال نفسها التي تؤديها PHP. أما في المتصفح فلا تستطيع PHP أن تحل محل JavaScript إطلاقًا، لأن المتصفحات لا تشغّل إلا JavaScript. لهذا تستخدم مواقع كثيرة PHP أو Node على الخادم وJavaScript في المتصفح.
كيف أمرّر متغير PHP إلى JavaScript؟
اطبعه في الصفحة بصيغة JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. تُنتج json_encode كود JavaScript صالحًا للنصوص والأعداد والمصفوفات والكائنات، ويمنع JSON_HEX_TAG أي </script> داخل البيانات من إغلاق الوسم.
هل تستطيع JavaScript استدعاء دالة PHP؟
ليس مباشرة، لأن PHP تعمل على الخادم وJavaScript في المتصفح. ترسل JavaScript طلب HTTP عبر fetch('/api.php?id=3')، فيُنفَّذ سكربت PHP ويطبع استجابة (عادةً JSON)، ثم تقرؤها JavaScript.
هل PHP أسرع من Node.js؟
يعتمد ذلك على نوع العمل. تتعامل Node.js جيدًا مع اتصالات بطيئة متزامنة كثيرة (الدردشة وwebsockets) بفضل حلقة الأحداث. وPHP 8 مع OPcache سريعة في صفحات الطلب والاستجابة العادية. وفي معظم المواقع تكون قاعدة البيانات هي عنق الزجاجة، لا اللغة.