טווח ההגדרה של משתנה הוא הקונטקסט שבו המשתנה מוגדר. לכל משתני PHP יש טווח הגדרה אחד בלבד. טווח זה כולל גם קבצים מסופחים.לדוגמה:
המשתנה $a יהיה מוגדר גם בקובץ המסופח-b.inc. לעומת זאת, בפונקציה שהוגדרה על-ידי המשתמש קיים טווח הגדרה לוקאלי. כל משתנה בתוך הפונקציה מוגדר בטווח הפונקציה בלבד כברירת מחדל. לדוגמה:
$a = 1; /* global scope */ function Test() { echo $a; /* reference to local scope variable */ } Test(); |
סקריפט זה לא ידפיס קלט כי פקודת ה-echo מתייחסת לגרסה הלוקאלית של המשתנה $a, ומשתנה זה לא קיבל הצבה בטווח הגדרתו. ניתן לראות שהתנהגות זו שונה במקצת מהתנהגות שפת C בכך שמשתנים גלובלים בשפת C זמינים אוטומטית גם בפונקציות אלא אם נדרסו על-ידי הגדרה לוקאלית. תתכן בעיה כאשר תכנת ינסה ללא הצלחה יתרה לשנות את ערכו של משתנה גלובלי מתוך פונקציה. משתנה גלובלי ב-PHP חייב להיות מוצהר כמשתנה גלובלי אם קיימת כוונה להשתמש במשתנה זה מתוך הפונקציה. דוגמה:
הסקריפט ידפיס "3". כאשר המשתנים $a ו- $b מוגדרים כגלובלים בפונקציה, כל התייחסות אליהם תתיחס לגרסה הגלובלית שלהם. אין הגבלה למספר המשתנים הגלובלים שפונקציה יכולה לשנות.
דרך נוספת לגשת טווח המשתנים הגלובלים היא בעזרת המערך המוגדר מראש- $GLOBALS. אפשר לכתוב את הדוגמה הקודמת גם בצורה הזו:
המערך $GLOBALS הוא מערך אסוציאטיבי באופן ששם המשתנה הגלובלי הוא המפתח לערך וערך המשתנה הגלובלי הוא הערך של תא זה במערך.
תכונה נוספת שיש לציין את חשיבותה היא המשתנה הסטאטי. משתנה סטאטי קיים רק בטווח לוקאלי של פונקציה אך אינו מאבד את ערכו לאחר סיום הרצת הפונקציה. לדוגמה:
פונקציה זו היא חסרת תועלת לחלוטין כי בכל קריאה לפונקציה, מתאפס ערכו של המשתנה $a והפונקציה תדפיס "0". פעולת ה- $a++ לא משרתת שום מטרה כי לאחר היציאה מהפונקציה, המשתנה $a נעלם. כדי לייצר פונקצית ספירה שימושית אסור לנו לאבד את הערך הנוכחי של $a ולכן משתנה זה מוגדר כמשתנה סטאטי:
עכשיו, בכל קריאה לפונקציה Test, יודפס ערכו של המשתנה $a ואחר-כך יוגדל ערכו.
אפשר להשתמש במשתנה סטאטי גם לצורך טיפול בפונקציות רקורסיביות. פונקציה רקורסיבית היא פונקציה שקוראת לעצמה. בכתיבת פונקציות רקורסיביות יש לשים לב בכתיבת תנאי הפסקה מתאים אחרת יווצר מצב שהפונקציה תרוץ באופן אינסופי. הפונקציה הרקורסיבית הבאה פשוט סופרת עד 10 תוך שימוש במשתנה סטאטי- $count כדי לדעת מתי לעצור: