Menu

פונקציות חץ ב-PHP: תחביר fn() => ודוגמאות

פונקציית חץ היא פונקציה אנונימית של ביטוי אחד שנכתבת fn($x) => $x * 2. היא משתמשת במשתנים חיצוניים אוטומטית, לפי ערך, בלי use. למדו את התחביר, איך הלכידה עובדת, טיפוסים, callbacks ל-array_map ול-usort, ומתי להשתמש ב-closure מלא במקומה.

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

פונקציית חץ היא פונקציה אנונימית קצרה: fn($x) => $x * 2. הגוף שאחרי => הוא ביטוי יחיד שהערך שלו מוחזר, וכל משתנה מהקוד שמסביב שהביטוי משתמש בו נלכד אוטומטית, לפי ערך. פונקציות חץ קיימות מאז PHP 7.4 ומשמשות בעיקר כ-callbacks.

התחביר

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

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

משתנים חיצוניים נלכדים לפי ערך

פונקציית חץ רואה כל משתנה בטווח שבו היא נוצרת. היא מעתיקה את הערכים שלהם באותו רגע. שינויים שנעשים בפנים נשארים בפנים, ושינויים שנעשים בחוץ אחרי שהפונקציה נוצרה לא נראים לה:

זה ההבדל העיקרי מ-function () use (&$count), שיכולה לשתף משתנה לפי הפניה. פונקציית חץ לא יכולה להציב מחדש משתנה חיצוני. היא עדיין יכולה לשנות אובייקט שהיא לכדה (העותק הוא ידית לאותו אובייקט), ופרמטר שמוצהר לפי הפניה עובד כמו בכל פונקציה: fn(array &$list) => $list[] = 'x'.

callbacks ל-array_map, array_filter ו-usort

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

<=> מחזיר -1, 0 או 1, בדיוק מה ש-usort() רוצה, ולכן מיון לפי שדה נכנס בשורה אחת. החליפו בין $a ל-$b כדי למיין בסדר יורד.

פונקציות חץ שמחזירות פונקציות חץ

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

שימו לב ש-array_filter() שומרת על המפתחות המקוריים, ולכן התוצאה מתחילה באינדקס 1.

fn מול function: מתי צריך closure מלא

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

fn($x) => ...function ($x) use ($y) { ... }
גוףביטוי אחדכל פקודות
החזרהאוטומטיתreturn מפורש
משתנים חיצונייםכל אלה שבשימוש, אוטומטיתרק אלה שרשומים ב-use
לכידה לפי הפניהלאכן, use (&$y)
זמינה מאזPHP 7.4PHP 5.3

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

שאלות נפוצות

מה זו פונקציית חץ ב-PHP?

פונקציה אנונימית קצרה שהוצגה ב-PHP 7.4: fn($x) => $x * 2. הגוף שלה הוא ביטוי יחיד שהערך שלו מוחזר אוטומטית, והיא יכולה לקרוא משתנים מהטווח שסביבה בלי סעיף use.

האם לפונקציית חץ ב-PHP יכולות להיות כמה שורות?

לא. הגוף אחרי => חייב להיות ביטוי אחד; אין בלוק עם פקודות. אפשר לפצל ביטוי ארוך על פני כמה שורות, אבל אם צריך if, לולאות או כמה פקודות, השתמשו במקום זאת ב-function () use (...) { ... }.

האם פונקציית חץ יכולה לשנות משתנה חיצוני?

לא. פונקציות חץ לוכדות משתנים חיצוניים לפי ערך, ולכן fn() => $count++ משנה רק את העותק שלה ו-$count בחוץ נשאר אותו דבר. כדי לשנות משתנה חיצוני, השתמשו ב-closure עם use (&$count).

מה ההבדל בין fn ל-function ב-PHP?

fn($x) => ... מחזיקה ביטוי אחד, מחזירה אותו במרומז ולוכדת לפי ערך כל משתנה חיצוני שהיא משתמשת בו. function ($x) use ($y) { ... } יכולה להחזיק כל פקודות, צריכה return מפורש, ורואה רק את המשתנים שרשומים ב-use, שאפשר ללכוד גם לפי הפניה.

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

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

להתחיל