php / שיעור 3 / פונקציות

שיעור 3


פונקציות


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

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

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

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

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

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

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

<html>


<body>

<?php

function addnum($first, $second) {

$newnum = $first + $second;

return $newnum;

}

echo addnum(4,5);

?>

</body>

</html>


זהו זה! קודם, יצרנו את הפונקציה שלנו. שימו לב איך הגדרנו שני משתנים חדשים, בשם first$ ו-second$. כאשר אנו קוראים לפונקציה, כל משתנה מקבל ערך בהתבסס על הסדר בו הוא הופיע ברשימה, 4 הולך ל-first$ ו-5 ל-second$. אז פשוט חברנו את שני המספרים יחד והחזרנו את התוצאה. פירוש "return" כאן הוא פשוט שליחת התוצאות חזרה. בסוף הסקריפט נדפיס את הספרה 9.

בואו ניצור משהו שהוא יעיל יותר עבור יישום מאגר המידע שלנו. מה לגבי משהו שמתמודד עם שגיאות בחינניות? נסו את זה:

<html>


<body>

<?php

function do_error($error) {

echo "Hmm, looks like there was a problem here...<br>";

echo "The reported error was $error.\n<br>";

echo "Best you get hold of the site admin and let her know.";

die;

}

if (!$db = @mysql_connect("localhost","user", "password")) {

$db_error = "Could not connect to MySQL Server";

do_error($db_error);

}

?>

</body>

</html>


לפני שתריצו את זה, נסו לסגור את MySQL או להשתמש בשם משתמש או סיסמא בדויים. תקבלו הודעת שגיאה יפה ומסודרת. קוראים חדי אבחנה ישימו ודאי לב לסימן @ לפני ()mysql_connect. זה מדחיק את הודעות השגיאה כל שתקבלו מידע רק מהפונקציה. תוכלו גם לראות שהיינו יכולים להעביר משתנה לתוך הפונקציה, שהוגדרה במקום אחר.

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

<html>


<body>

<?php

function db_query($sql) {

global $db;

$result = mysql_query($sql,$db);

return $result;

}

$sql = "SELECT * FROM mytable";

$result = db_query($sql);

?>

</body>

</html>


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

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

מבולבלים? לדוגמא, כאשר אתם מתחברים למאגר מידע, אתם כמעט תמיד מתחברים לאותו שרת ורוב הסיכויים שגם תשתמשו באותו שם משתמש וסיסמא.
אבל לפעמים תרצו להתחבר למאגר מידע אחר. בואו נעיף מבט.

<html>


<body>

<?php

function db_connect($host = "localhost", $user="username", $pass="graeme") {

$db = mysql_connect($host, $username, $password);

return $db;

}

$old_db = db_connect();

$new_host = "site.com";

$new_db = db_connect($new_host);

?>

</body>

</html>


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

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

עכשיו כל שנותר לעשות הוא להעניק לכם מספר מלות חוכמה.


עמוד הבא: עצות לסיום>>




הקדמה
שעור 1
הקדמה PHP ו-MySQL
התקנת MySQL
התקנת PHP
הסקריפט הראשון שלכם
הטענת מאגר המידע
שליפה מחדש
שעור 2
לולאות
השארו מיודעים
קישור חכם
הוסיפו כמה טפסים
הפיכת טפסים לחכמים
כולם יחד
שעור 3
מקום לכל דבר
אימות פשוט
אמות לא כל כך פשוט
פונקציות >
עצות לסיום