Menu

משתנים ב-PHP: הגדרה, תחום, global ו-static

משתנה ב-PHP מתחיל ב-$ ונוצר בהשמה: $name = "Ada";. אין מילת מפתח להגדרה ואין טיפוס קבוע. פונקציות לא רואות משתנים מבחוץ אלא אם מעבירים אותם, משתמשים ב-global או לוכדים אותם; static שומרת ערך בין קריאות.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

משתנה ב-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 משאירה את המשתנה אבל מרוקנת אותו.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל