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 | |
|---|---|---|
| מודל | הרצה חדשה לכל בקשה, בלי שום דבר משותף | תהליך ממושך אחד עם לולאת אירועים |
| המתנה ל-I/O | חוסמת את הבקשה הזו (בקשות אחרות רצות ב-workers אחרים) | לא חוסמת, async/await |
| טובה ב | אתרים שמרונדרים בשרת, מערכות ניהול תוכן, אפליקציות CRUD קלאסיות | אפליקציות בזמן אמת, websockets, הרבה חיבורים רדומים |
| אחסון | כל אחסון משותף, PHP-FPM | מנהל תהליכים ל-Node או פלטפורמה כמו Vercel |
| פריימוורקים גדולים | Laravel, Symfony, WordPress | Express, NestJS, Next.js |
| שפה אחת לפרונט ולבק | לא | כן |
המודל של PHP סלחני: באג או דליפת זיכרון משפיעים רק על בקשה אחת, וכל בקשה מתחילה נקייה. המודל של Node יכול לשמור מצב וחיבורים פתוחים, וזה מתאים לצ'אט ולדשבורדים חיים, אבל קריסה או לולאה חוסמת משפיעות על כל המשתמשים של אותו תהליך.
מה ללמוד
תצטרכו JavaScript לכל דף אינטרנט אינטראקטיבי, כי זו השפה היחידה שדפדפנים מריצים. השאלה היא מה רץ על השרת:
- למדו PHP בהמשך אם אתם רוצים לעבוד עם WordPress, עם Laravel או עם אתרי PHP הרבים שכבר קיימים, או אם אתם רוצים את הדרך הפשוטה ביותר להעלות אתר דינמי לאחסון זול. התחילו עם מה זה PHP.
- הישארו עם JavaScript (Node.js) אם אתם רוצים שפה אחת לכל המערכת או בונים יכולות בזמן אמת.
מסלול נפוץ הוא HTML ו-CSS, אחר כך JavaScript בדפדפן, ואז שפת שרת אחת. איזו שפת שרת שלא תבחרו, טפסים, סשנים, מסדי נתונים ו-API של 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 מהירה בדפים רגילים של בקשה ותגובה. ברוב האתרים צוואר הבקבוק הוא מסד הנתונים, לא השפה.