משתנה ב-PHP הוא שם שמתחיל ב-$, ויוצרים אותו בהשמת ערך: $name = "Ada";. אין מילת מפתח להגדרה ואין טיפוס שצריך לציין, כי הערך קובע את הטיפוס. אפשר להציב ערך מטיפוס אחר מאוחר יותר.
כללים לשמות משתנים
שם משתנה מתחיל ב-$, אחריו אות או קו תחתון, ואחר כך כל אותיות, ספרות או קווים תחתונים. אותיות שאינן ASCII נחשבות אותיות, ולכן $名前 תקין, אבל שמות ב-ASCII הם הנורמה. שמות רגישים לאותיות גדולות וקטנות.
| שם | תקין? |
|---|---|
$total, $userName, $user_name | כן |
$_count, $item2 | כן |
$2items | לא, אי אפשר להתחיל בספרה |
$user-name | לא, זה $user פחות name |
$this | לא, שמור לאובייקט הנוכחי; השמה אליו היא שגיאה פטאלית |
כך ש-$city, $City ו-$CITY הם שלושה משתנים שונים. השתמשו ב-snake_case ($first_name) או ב-camelCase ($firstName), והישארו עם סגנון אחד בכל פרויקט. תקני הקוד של PSR משאירים את שמות המשתנים פתוחים בכוונה; בקוד של Laravel ו-Symfony משתמשים בעיקר ב-camelCase.
שימוש במשתנים בתוך מחרוזות
בתוך מירכאות כפולות PHP מחליפה משתנים בערכים שלהם; בתוך גרשיים בודדים היא לא. עטפו את המשתנה בסוגריים מסולסלים כשאותיות באות מיד אחריו או כשניגשים לאיבר במערך לפי מפתח מחרוזת:
עמוד המחרוזות מסביר בפירוט מירכאות, שרשור ואינטרפולציה.
משתנים לא מוגדרים וערכי ברירת מחדל
קריאה של משתנה שמעולם לא קיבל ערך נותנת null, וה-PHP שלכם מדפיסה אזהרה:
Warning: Undefined variable $discount in /home/index.php on line 3
בדקו קודם עם isset, או השתמשו באופרטור ה-null coalescing ?? כדי לספק ברירת מחדל. שתי הדרכים רצות בלי אזהרה:
$x ??= 0; היא הצורה המקוצרת של $x = $x ?? 0;. ערכים מטפסים ומכתובות URL הם המקרה הרגיל: $page = $_GET['page'] ?? 1;.
תחום משתנים בפונקציות
משתנים שהוגדרו מחוץ לפונקציה לא נראים בתוכה, ומשתנים שנוצרו בתוך פונקציה נעלמים כשהיא חוזרת. זו ההפתעה הנפוצה ביותר אצל מי שמגיע מ-JavaScript:
בלי ה-?? 0, הפונקציה הראשונה הייתה מזהירה על $taxRate לא מוגדר. העברת ערכים כפרמטרים שומרת על פונקציות צפויות וקלות לבדיקה, וזה מה שכדאי לבחור קודם. עמוד הפונקציות מסביר פרמטרים וערכים מוחזרים.
מילת המפתח global ו-$GLOBALS
כשפונקציה באמת חייבת להשתמש במשתנה גלובלי, הצהירו עליו עם global, או עברו דרך המערך $GLOBALS, שמחזיק כל משתנה גלובלי לפי שם:
משתנים גלובליים מקשים על מעקב אחרי הקוד, כי כל פונקציה יכולה לשנות אותם. הם מופיעים בקוד ישן ובתוספים של WordPress (global $wpdb;); בקוד חדש, העבירו ערכים או השתמשו במחלקה.
משתנים סטטיים שומרים על הערך שלהם
משתנה static בתוך פונקציה נוצר פעם אחת ושומר את הערך שלו בין קריאות. הוא עדיין מקומי: קוד מחוץ לפונקציה לא רואה אותו.
משתנים משתנים ($$name)
$$name משתמש בערך של $name כשם של משתנה אחר. זה עובד, אבל מערכים כמעט תמיד עושים את אותה עבודה בצורה ברורה יותר:
<?php
$field = "color";
$$field = "blue"; // creates $color
echo $color, "\n";
// The clearer way to have names chosen at runtime:
$settings = [];
$settings[$field] = "blue";
echo $settings["color"], "\n";
העתקה או הפניה
השמה של משתנה אחד לאחר מעתיקה את הערך, כולל מערכים. שימו & לפני כדי ששני השמות יצביעו על אותו ערך במקום זאת:
אובייקטים מתנהגים אחרת: השמת אובייקט מעתיקה ידית לאותו אובייקט, כך ששינויים דרך כל אחד מהמשתנים נראים דרך שניהם. השתמשו ב-clone להעתקה אמיתית.
טעות נפוצה: משתנה שמוגדר בתוך if או לולאה
ב-PHP אין תחום בלוק, כך שמשתנה שנוצר בתוך if, for או foreach עדיין קיים אחריו. זה עוזר, אבל זה מסתיר באג: כשהבלוק לא רץ, המשתנה מעולם לא נוצר.
בלי שורת ברירת המחדל, $orders ריק היה משאיר את $message לא מוגדר ומדפיס אזהרה. תנו לכל משתנה ערך לפני הבלוק שעשוי להגדיר אותו.
שאלות נפוצות
איך מגדירים משתנה ב-PHP?
מציבים ערך בשם שמתחיל ב-$: $count = 10;. ב-PHP אין מילת מפתח var או let ואין טיפוס בהגדרה; המשתנה נוצר בהשמה הראשונה ומקבל את הטיפוס של הערך שלו.
למה הפונקציה שלי לא רואה משתנה שהוגדר מחוץ לה?
לפונקציות ב-PHP יש תחום מקומי משלהן, והן לא רואות משתנים גלובליים אוטומטית. העבירו את הערך כפרמטר (האפשרות הנקייה), הצהירו global $name; בתוך הפונקציה, או קראו את $GLOBALS['name']. closures יכולים ללכוד אותו עם use ($name), ופונקציות חץ fn() לוכדות אותו אוטומטית.
מה זה משתנה סטטי ב-PHP?
משתנה מקומי שמוצהר עם static בתוך פונקציה, כמו static $calls = 0;. הוא מאותחל פעם אחת ושומר את הערך שלו בין קריאות לאותה פונקציה, וזה שימושי למונים ולמטמונים פשוטים.
האם שמות משתנים ב-PHP רגישים לאותיות גדולות וקטנות?
כן. $name, $Name ו-$NAME הם שלושה משתנים שונים. לעומת זאת, שמות של פונקציות ומחלקות ב-PHP לא רגישים לאותיות גדולות וקטנות.
איך מוחקים משתנה ב-PHP?
קראו ל-unset($name);. אחר כך isset($name) מחזירה false וקריאה שלו נותנת אזהרת "Undefined variable". השמת null משאירה את המשתנה אבל מרוקנת אותו.