קבוע הוא שם לערך שאף פעם לא משתנה בזמן שהסקריפט רץ. מגדירים אותו עם const MAX_USERS = 100; או define('MAX_USERS', 100);, ואז משתמשים בשם עצמו, בלי $.
לפי המוסכמה, שמות קבועים נכתבים ב-UPPER_SNAKE_CASE. הם גלובליים: קבוע שהוגדר בראש קובץ גלוי בתוך כל פונקציה בלי global.
define() מול const
שניהם יוצרים קבוע, אבל הם פועלים בזמנים שונים. const נפתר כש-PHP מהדרת את הקובץ, define() רצה כמו כל קריאה לפונקציה.
const | define() | |
|---|---|---|
בתוך if, לולאות, פונקציות | לא | כן |
| שם שנבנה ממשתנה | לא | כן |
| קבועי מחלקה | כן | לא |
| הערך יכול להיות ביטוי | כן, של קבועים וליטרלים | כן, כל ערך |
| מקבל namespace אוטומטית | כן | לא (תנו את השם המלא) |
השתמשו ב-const כברירת מחדל, כי הוא קצר יותר ונבדק בזמן הידור. השתמשו ב-define() כשהקבוע תלוי בתנאי או בשם מחושב.
אי אפשר לשנות קבועים
הצבה לקבוע היא שגיאת תחביר:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
הגדרה של אותו קבוע פעמיים היא לא שגיאה, אבל PHP מדפיסה אזהרה ושומרת את הערך הראשון:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
כשערך אולי כבר מוגדר (למשל בקובץ הגדרות שנטען יותר מפעם אחת), בדקו קודם עם defined():
מערכים קבועים
קבוע יכול להכיל מערך. אפשר לקרוא אותו עם NAME[key], לעבור עליו בלולאה ולהעביר אותו הלאה, אבל לא לשנות אותו.
קבועי מחלקה
בתוך מחלקה, const מגדיר קבוע ששייך למחלקה. קוראים אותו עם ClassName::NAME מבחוץ ועם self::NAME או static::NAME מבפנים. לקבועי מחלקה יכולה להיות רמת גישה, הם יכולים להיות final, ומאז PHP 8.3 הם יכולים להצהיר על טיפוס.
קבוצה של קבועי מחלקה קשורים כמו STATUS_NEW ו-STATUS_PAID עדיף לעיתים קרובות לכתוב כ-enum, שגם מונע העברה של ערכים לא תקינים.
קבועי קסם: LINE, FILE, DIR ועוד
קבועי קסם משנים את הערך שלהם לפי המקום שבו הם מופיעים. הם מתמלאים בזמן הידור.
הנפוץ ביותר הוא __DIR__, התיקייה של הקובץ הנוכחי. בניית נתיבי include ממנו גורמת להם לעבוד לא משנה מאיזו תיקייה הסקריפט הופעל: require __DIR__ . '/config.php';. ראו include ו-require לדפוס המלא.
קבועים מובנים שכדאי להכיר
PHP מגדירה הרבה קבועים משלה. אלה עולים כל הזמן:
PHP_EOL הוא סוף השורה של המערכת ש-PHP רצה עליה ("\n" ב-Linux וב-macOS, "\r\n" ב-Windows). הוא מיועד לטקסט שנכתב לקבצים ולטרמינל; בפלט HTML ירידת שורה לא נראית, אז השתמשו שם ב-<br>.
שאלות נפוצות
מה ההבדל בין define() ל-const ב-PHP?
const הוא מבנה שפה שנפתר כשהקובץ מהודר: הוא עובד ברמה העליונה ובתוך מחלקות, אבל לא בתוך if, לולאות או פונקציות. define() היא פונקציה שנקראת בזמן ריצה, ולכן היא עובדת בכל מקום ואפשר לבנות את השם ממשתנה, אבל אי אפשר להגדיר איתה קבועי מחלקה.
האם קבוע ב-PHP יכול להיות מערך?
כן. גם const COLORS = ['red', 'green']; וגם define('COLORS', ['red', 'green']); עובדים, וקוראים איבר עם COLORS[0]. אי אפשר לשנות את המערך אחר כך.
איך בודקים אם קבוע מוגדר ב-PHP?
השתמשו ב-defined('NAME'), שמקבלת את השם כמחרוזת ומחזירה true או false. דפוס נפוץ הוא if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. לקבועי מחלקה העבירו 'ClassName::NAME'.
מה הם קבועי קסם ב-PHP?
קבועים שהערך שלהם תלוי במקום שבו הם כתובים: __LINE__ (השורה הנוכחית), __FILE__ (הנתיב המלא של הקובץ), __DIR__ (התיקייה שלו), __FUNCTION__, __CLASS__, __METHOD__ ו-__NAMESPACE__. כותבים אותם עם שני קווים תחתונים מכל צד, והם לא רגישים לאותיות גדולות וקטנות.