Menu

פונקציות ב-PHP: הגדרה, return, פרמטרים וטיפוסים

מגדירים פונקציה ב-PHP עם function name($param) { return $value; }. למדו ערכי החזרה, פרמטרים עם ברירת מחדל, ארגומנטים בשם, העברה לפי הפניה, הצהרות טיפוס עם strict_types, טיפוסים nullable ו-union, ו-...$args משתנה.

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

פונקציה ב-PHP מוגדרת עם מילת המפתח function, שם, רשימת פרמטרים וגוף; return שולחת ערך בחזרה לקורא. function add(int $a, int $b): int { return $a + $b; } מגדירה אותה, ו-add(2, 3) קוראת לה ומחזירה 5.

ה-string וה-int שלפני הפרמטרים הם הצהרות טיפוס, ו-: string אחרי הסוגריים הוא טיפוס ההחזרה. שניהם אופציונליים, אבל הם תופסים טעויות מוקדם ומתעדים מה הפונקציה מצפה לקבל.

ערכי החזרה והחזרת כמה ערכים

return מסיימת את הפונקציה מיד. פונקציה בלי return, או עם return; ריק, מחזירה null; הצהירו : void כשקוראים לה רק בשביל ההשפעה שלה. פונקציה מחזירה ערך אחד, אבל הערך הזה יכול להיות מערך, שמפרקים בצד הקורא:

ראו פירוק מערכים לצורות האחרות של [...] =.

פרמטרים עם ברירת מחדל וארגומנטים בשם

פרמטר עם = value הוא אופציונלי: הקוראים יכולים להשמיט אותו. פרמטרים אופציונליים באים אחרי פרמטרי החובה. מאז PHP 8.0, ארגומנטים בשם מאפשרים לקורא להעביר כל פרמטר לפי שם, כך שאפשר לדלג על האופציונליים שלא צריך.

ארגומנטים בשם הופכים גם קריאות לפונקציות מובנות לקריאות: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). שם הפרמטר הופך לחלק מהממשק הציבורי של הפונקציה, ולכן שינוי שם של פרמטר יכול לשבור קוראים שמשתמשים בשמות.

העברה לפי הפניה

בדרך כלל PHP מעבירה עותק של כל ארגומנט, ולכן הפונקציה לא יכולה לשנות את המשתנה של הקורא. & לפני פרמטר מעביר את המשתנה עצמו. פונקציות מובנות כמו sort() עובדות כך.

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

הצהרות טיפוס ו-strict_types

כברירת מחדל PHP ממירה ארגומנטים לטיפוס המוצהר כשהיא יכולה: add("5", 3) הופכת את "5" ל-5. שימוש ב-declare(strict_types=1); בראש הקובץ ממש מכבה את זה בקריאות שנעשות בקובץ הזה, כך שטיפוס שגוי זורק TypeError במקום להיות מומר.

בלי שורת ה-declare, אותה קריאה מדפיסה 8. מחרוזות שאינן מספרים, כמו "five", זורקות TypeError בשני המצבים.

הטיפוסים שאפשר להצהיר עליהם לפרמטרים ולערכי החזרה:

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

מספר משתנה של ארגומנטים עם ...$args

...$numbers אוסף כל מספר של ארגומנטים למערך. אותו ... בצד הקורא פורס מערך לארגומנטים נפרדים.

שימוש במשתנה חיצוני בתוך פונקציה

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

<?php
$taxRate = 0.2;

function priceWithTax(float $price): float
{
    return $price * (1 + $taxRate);   // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6

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

גם מילת המפתח global עובדת, אבל היא מסתירה את התלות; טווח משתנים מסביר אותה. לפונקציות קצרות שמועברות לפונקציות אחרות, כמו callbacks ל-array_map(), ראו פונקציות אנונימיות, שיכולות ללכוד משתנים חיצוניים עם use.

שאלות נפוצות

איך מגדירים פונקציה ב-PHP?

השתמשו במילת המפתח function, בשם, בפרמטרים בסוגריים ובגוף: function add(int $a, int $b): int { return $a + $b; }. קוראים לה כ-add(2, 3). שמות פונקציות לא רגישים לרישיות, ופונקציה שהוגדרה ברמה העליונה של קובץ אפשר לקרוא לה לפני השורה שמגדירה אותה.

איך מחזירים כמה ערכים מפונקציה ב-PHP?

החזירו מערך ופרקו אותו: function minMax(array $a): array { return [min($a), max($a)]; } ואז [$min, $max] = minMax([3, 1, 4]);. לתוצאות עם שם, החזירו מערך אסוציאטיבי והשתמשו ב-['min' => $min] = ....

מה עושה declare(strict_types=1)?

היא מכבה המרת טיפוסים אוטומטית בקריאות שנעשות מהקובץ הזה, ולכן העברה של "5" לפרמטר int זורקת TypeError במקום להמיר אותו ל-5. היא חייבת להיות הפקודה הראשונה ממש בקובץ ומשפיעה רק עליו.

מה הם ארגומנטים בשם ב-PHP?

מאז PHP 8.0 אפשר להעביר ארגומנטים לפי שם הפרמטר: htmlspecialchars($s, double_encode: false). אפשר לתת אותם בכל סדר אחרי הארגומנטים לפי מיקום, והם מאפשרים לדלג על פרמטרים אופציונליים שלא רוצים לשנות.

איך מעבירים משתנה לפי הפניה ב-PHP?

שימו & לפני הפרמטר: function addOne(int &$n): void { $n++; }. הפונקציה משנה אז את המשתנה של הקורא. בלי &, PHP מעבירה עותק והמשתנה של הקורא נשאר אותו דבר.

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

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

להתחיל