01-07-2009, 13:59
|
|
|
חבר מתאריך: 13.12.05
הודעות: 1,963
|
|
מה שאני אומר הוא שהפונקציה מוגדרת כחלק מקוד שרץ. למה שהיא לא תדע אילו משתנים יש בקונטקסט שבו היא נמצאת כרגע?
הרי אתה לא משתמש בפונקציה הזו באף מקום אחר, אתה משתמש בה כקוד פרטי-זמני (בלוק של קוד) במקום להגדיר פונקציה שלמה. אז למה שלא "תראה" את כל המשתנים באופן אוטומטי? אתה רוצה להשתמש, תשתמש. אתה לא רוצה, אל תשתמש.
זה פשוט עקום בצורה הזו.
בוא נגדיר פונקציה חדשה שנקראית array_each, שהיא בעצם array_walk. זאת על מנת להדגים איך אתה יוצר פונקציה משלך עם callback כזה. ואחרי זה נשתמש בה ונדגים את הבעיתיות בנושא.
קוד PHP:
function array_each(&$array, $callback) { foreach ($array as $k => $v) { $callback($k, $v); // Calling the callback function } }
עכשיו נניח שאתה רוצה להשתמש בה כדי להדפיס את הערכים של המערך.
קוד PHP:
array_each($my_array, function($k, $v) { echo $v; });
זה אומנם נראה פשוט (וקצת דבילי). אבל עכשיו אנחנו רוצים לסכום את המערך. בוא נראה איך משתמשים בזה:
קוד PHP:
$sum = 0; // Initializing a variable array_each($my_array, function($k, $v) use (&$sum) { $sum += $v; });
שים לב שהייתי חייב לשים במקום לרשום דבר כזה:
קוד PHP:
$sum = 0; // Initializing a variable array_each($my_array, function($k, $v) { $sum += $v; });
זה לא הבדל גדול כי הפונקציה הזו בעצם לא עושה יותר מידי. הבעיה היא כשיש לך יותר משתנים, או משתנים יותר מורכבים.
והבעיה היותר גדולה היא הלוגיקה שפועלת פה. הרי הפונקציה הזו היא יחידה אטומית שאף מקום אחר בקוד לא משתמש בה. היא רצה ומסיימת את החיים שלה בתוך אותו קטע קוד שרשמנו. היא אפילו מוגדרת באותו קטע קוד שרשמנו.
ההיגיון הבריא אומר שקטע הקוד הזה (הפונקציה האנונימית), צריך להכיר את כל מה שהקונטקסט המקורי מכיר.
אז למה אני צריך להגיד לה איזה משתנים היא צריכה להכיר?
|