פונקציות בשפת PHP

פונקציות בשפת PHP

  • פרסומת

פונקציות בשפת PHP (ולמעשה בכל שפת תכנות), נועדו בשביל לאגד מספר הוראות לכדי הוראה אחת ובכך למנוע חזרות של קטעי קוד ולאפשר כתיבה של קוד בצורה שיותר תואמת את המציאות. בשפת PHP ישנן פונקציות מובנות (כחלק מספריית הפונקציות) ופונקציות מוגדרות-משתמש, שהן למעשה פונקציות שהמשתמש כותב בעצמו. שימוש בפונקציות מאפשר שימוש חוזר של הוראות מבלי הצורך לכתוב את אותן ההוראות מספר פעמים. בניגוד לקוד הכתוב מחוץ לפונקציה, פונקציות לא פועלות באופן אוטומטי כאשר הדף נטען. בשביל להפעיל פונקציה, יש "לקרוא" לה על ידי שימוש בשם שלה.

קוד חוזר

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

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

<?php 
$fn1 = 'John'; 
$ln1 = 'Doe'; 
$fn2 = 'Benjamin'; 
$ln2 = 'Franklin'; 
$fn3 = 'Frank'; 
$ln3 = 'Roosevelt'; 
$fn4 = 'Harry'; 
$ln4 = 'Truman'; 

echo "The first name is $fn1, the last name is $ln1"; 
echo "The first name is $fn2, the last name is $ln2"; 
echo "The first name is $fn3, the last name is $ln3"; 
echo "The first name is $fn4, the last name is $ln4";

שימו לב שהקוד שמייצר את הפלט (זה שמדפיס את השם הפרטי ואת שם המשפחה) חוזר על עצמו 4 פעמים, פעם בשביל כל שם ברשימה. הפלט של הקוד הנ"ל הוא:

The first name is John, the last name is doe
The first name is Benjamin, the last name is Franklin
The first name is Frank, the last name is Roosevelte
The first name is Harry, the last name is Truman

אופס… משהו כאן לא מסתדר. מסתבר שהקוד הראשוני שכתבנו לא מייצר את הפלט שקיווינו לו. נראה שצריך להוסיף <br /> בשביל להפריד בין השורות. בשביל לתקן את הקוד, יש לעבור שורה שורה ולשנות את הקוד ב-4 מוקדים שונים. כך הקוד ייראה לאחר התיקון:

<?php
$fn1 = 'John';     $ln1 = 'Doe';
$fn2 = 'Benjamin'; $ln2 = 'Franklin';
$fn3 = 'Frank';    $ln3 = 'Roosevelt';
$fn4 = 'Harry';    $ln4 = 'Truman';

echo "The first name is $fn1, the last name is $ln1<br/>";
echo "The first name is $fn2, the last name is $ln2<br/>";
echo "The first name is $fn3, the last name is $ln3<br/>";
echo "The first name is $fn4, the last name is $ln4<br/>";

עכשיו הפלט נראה טוב יותר:

The first name is John, the last name is doe
The first name is Benjamin, the last name is Franklin
The first name is Frank, the last name is Roosevelte
The first name is Harry, the last name is Truman

טוב, אז לתקן את הטעות הטכנית הזו לא היה קשה מדי. מדוע, אם כך, כל כך חשוב להימנע מחזרה של קוד? נסו לדמיין מה היה קורה אם במקום 4 שמות, היו לנו 100? מה אם הפרוייקט שאנחנו עובדים עליו הוא פרוייקט גדול המשתרע על עשרות קבצי PHP שונים? במצב כזה, לא רק שהתיקון היה לוקח זמן רב, אך בנוסף לכך היינו צריכים למצוא את כל המקומות שבו נעשה שימוש בקטע הקוד הנ"ל. הסיכוי לפספס כאן הוא גבוה, וכך הסיכוי לתקלות גובר.

לפני שנתקדם, הנה פתרון לבעיה על ידי שימוש בפונקציות. שימו לב שתיקון במקרה זה יתבצע רק במוקד אחד:

<?php
$fn1 = 'John';     $ln1 = 'Doe';
$fn2 = 'Benjamin'; $ln2 = 'Franklin';
$fn3 = 'Frank';    $ln3 = 'Roosevelt';
$fn4 = 'Harry';    $ln4 = 'Truman';

function print_name( $fn, $ln )
{
    echo "The first name is $fn, the last name is $ln<br/>";
}

print_name( $fn1, $ln1 );
print_name( $fn2, $ln2 );
print_name( $fn3, $ln3 );
print_name( $fn4, $ln4 );

כתיבת פונקציות

פונקציות בשפת PHP מתחילות במילה function שלאחריה מגיע שם הפונקציה. שם הפונקציה יכול להכיל אותיות קטנות וגדולות, מספרים וקו תחתי. אין להתחיל שם של פונקציה עם ספרה. לאחר שם הפונקציה, יש לשים סוגריים (), ובתוכם ניתן לשים ארגומנטים (הסבר בהמשך). את תוכן הפונקציה, שהוא למעשה רשימה של הוראות, שמים בתוך סוגריים מעוגלים {}. להלן מבנה בסיסי של פונקציה:

<?php 
function function_name() 
{ 
    // code to be executed 
}

בשביל להריץ את הפונקציה, יש לכתוב את שם הפונקציה עם הסוגריים. לדוגמה, הפונקציה הבאה כותבת את הטקסט Hello World!:

<?php 
function say_hello() 
{ 
    echo 'Hello World!';
}

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

<?php say_hello(); ?>

ארגומנטים

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

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

<?php
function say_hello( $name )
{
    echo "Hello $name!";
}

say_hello( "Abraham" ); // Echoes "Hello Abraham!"

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

<?php
function set_name( $name )
{
    $name = 'John Doe';
}

$name = null;
set_name( $name );
echo $name; // Doesn't print anything - $name is null

עם זאת, קיימת דרך לשנות את הערך של משתנים חיצוניים מתוך הפונקציה על ידי העברה של ״הפניה״ (reference) של אותו משתנה אל הפונקציה. ניתן לעשות זאת על ידי שימוש בתו & לפני המשתנה. טכניקה זו נקראת pass by reference. פונקציה שעושה שימוש בהפניות שכאלה נחשבת לפונקציה שיש לה ״תופעות לוואי״ (side effects) – משום שהיא גורמת לשינוי כלשהו לאחר שהסתיימה הרצתה. אם כך, ניתן ״לתקן״ את הדוגמה הקודמת באופן הבא:

<?php
function set_name( &$name ) // Passing by reference here
{
    $name = 'John Doe';
}

$name = null;
set_name( $name );
echo $name; // Echoes "John Doe"

ערך ברירת מחדל

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

<?php
function say_hello( $name = 'Abraham' )
{
    echo "Hello $name!";
}

say_hello( "Abraham" ); // Echoes "Hello Abraham!"
say_hello(); // Also echoes "Hello Abraham!"

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

 

<?php
function say_hello( $fname, $lname = 'Lincoln' ) { } // Works
function say_hello( $fname = 'Abraham', $lname ) { } // Doesn't works - PHP error

השבת ערכים

דרך נוספת להעביר מידע אל מחוץ לפונקציה (מלבד הפניות – pass by reference) היא השבת ערכים. על ידי שימוש במילה return ניתן לשלוח מידע חזרה בתום הרצת הפונקציה:

<?php
function add( $a, $b )
{
    return $a + $b;
}
$c = add( 3, 4 ); // $c = 7
echo $c; // Echoes 7

ספריית הפונקציות המובנית

אחד היתרונות הבולטים של שפת PHP היא ספריית הפונקציות המובנית שלה, המכילה מעל ל-1000 פונקציות במגוון של תחומים. בין היתר, הספרייה מכילה פונקציות למניפולציה של מחרוזות (strings), כלים מתמטיים, כלים לעבודה עם מערכים (arrays), כלים לעבודה עם מסדי נתונים ועוד. להלן מספר דוגמאות:

פירוק מחרוזות

<?php
$str = "This is a php string";
$arr = explode( ' ', $str ); // $arr = ['This','is','a','php','string'];
echo implode( '-', $arr ); // Echoes "This-is-a-php-string"

מציאת אורך מחרוזת

<?php echo strlen( "abcdefghij" ); /* Echoes 10 */ ?>

אותיות גדולות/קטנות

<?php echo strtoupper( "hello world!" ); /* Echoes "HELLO WORLD" */ ?>