טווח ההגדרה של משתנים

טווח ההגדרה של משתנה הוא הקונטקסט שבו המשתנה מוגדר . לכל משתני PHP יש טווח הגדרה אחד בלבד . טווח זה כולל גם קבצים מסופחים.לדוגמה :

 
$a

 
=

 
1

 
;

 
include

 
"b.inc"

 
;



המשתנה $a יהיה מוגדר גם בקובץ המסופח - b.inc . לעומת זאת , בפונקציה שהוגדרה על-ידי המשתמש קיים טווח הגדרה לוקאלי . כל משתנה בתוך הפונקציה מוגדר בטווח הפונקציה בלבד כברירת מחדל . לדוגמה :

 
$a

 
=

 
1

 
;

 
/

 
*

 
global

 
scope

 
*

 
/

 
function

 
Test(

 
)

 
{

 
echo

 
$a

 
;

 
/

 
*

 
reference

 
to

 
local

 
scope

 
variable

 
*

 
/

 
}

 
Test()

 
;



סקריפט זה לא ידפיס קלט כי פקודת ה-echo מתייחסת לגרסה הלוקאלית של המשתנה $a , ומשתנה זה לא קיבל הצבה בטווח הגדרתו . ניתן לראות שהתנהגות זו שונה במקצת מהתנהגות שפת C בכך שמשתנים גלובלים בשפת C זמינים אוטומטית גם בפונקציות אלא אם נדרסו על-ידי הגדרה לוקאלית . תתכן בעיה כאשר תכנת ינסה ללא הצלחה יתרה לשנות את ערכו של משתנה גלובלי מתוך פונקציה . משתנה גלובלי ב-PHP חייב להיות מוצהר כמשתנה גלובלי אם קיימת כוונה להשתמש במשתנה זה מתוך הפונקציה . דוגמה :

 
$a

 
=

 
1

 
;

 
$b

 
=

 
2

 
;

 
function

 
Sum(

 
)

 
{

 
global

 
$a

 
,

 
$b

 
;

 
$b

 
=

 
$a

 
+

 
$b

 
;

 
}

 
Sum()

 
;

 
echo

 
$b

 
;



הסקריפט ידפיס " 3 " . כאשר המשתנים $a ו - $b מוגדרים כגלובלים בפונקציה , כל התייחסות אליהם תתיחס לגרסה הגלובלית שלהם . אין הגבלה למספר המשתנים הגלובלים שפונקציה יכולה לשנות .

דרך נוספת לגשת טווח המשתנים הגלובלים היא בעזרת המערך המוגדר מראש - $GLOBALS . אפשר לכתוב את הדוגמה הקודמת גם בצורה הזו :

 
$a

 
=

 
1

 
;

 
$b

 
=

 
2

 
;

 
function

 
Sum(

 
)

 
{

 
$GLOBALS["b"

 
]

 
=

 
$GLOBALS["a"

 
]

 
+

 
$GLOBALS["b"]

 
;

 
}

 
Sum()

 
;

 
echo

 
$b

 
;



המערך $GLOBALS הוא מערך אסוציאטיבי באופן ששם המשתנה הגלובלי הוא המפתח לערך וערך המשתנה הגלובלי הוא הערך של תא זה במערך .

תכונה נוספת שיש לציין את חשיבותה היא המשתנה ה סטאטי . משתנה סטאטי קיים רק בטווח לוקאלי של פונקציה אך אינו מאבד את ערכו לאחר סיום הרצת הפונקציה . לדוגמה :

 
function

 
Test

 
(

 
)

 
{

 
$a

 
=

 
0

 
;

 
echo

 
$a

 
;

 
$a++

 
;

 
}



פונקציה זו היא חסרת תועלת לחלוטין כי בכל קריאה לפונקציה , מתאפס ערכו של המשתנה $a והפונקציה תדפיס " 0 " . פעולת ה - $a+ + לא משרתת שום מטרה כי לאחר היציאה מהפונקציה , המשתנה $a נעלם . כדי לייצר פונקצית ספירה שימושית אסור לנו לאבד את הערך הנוכחי של $a ולכן משתנה זה מוגדר כמשתנה סטאטי :

 
function

 
Test(

 
)

 
{

 
static

 
$a

 
=

 
0

 
;

 
echo

 
$a

 
;

 
$a++

 
;

 
}



עכשיו , בכל קריאה לפונקציה Test , יודפס ערכו של המשתנה $a ואחר-כך יוגדל ערכו .

אפשר להשתמש במשתנה סטאטי גם לצורך טיפול בפונקציות רקורסיביות . פונקציה רקורסיבית היא פונקציה שקוראת לעצמה . בכתיבת פונקציות רקורסיביות יש לשים לב בכתיבת תנאי הפסקה מתאים אחרת יווצר מצב שהפונקציה תרוץ באופן אינסופי . הפונקציה הרקורסיבית הבאה פשוט סופרת עד 10 תוך שימוש במשתנה סטאטי - $count כדי לדעת מתי לעצור :

 
function

 
Test(

 
)

 
{

 
static

 
$count

 
=

 
0

 
;

 
$count++

 
;

 
echo

 
$count

 
;

 
if

 
($count

 
10

 
)

 
{

 
Test

 
()

 
;

 
    }

 
$count--

 
;

 
}