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

אחד הדברים היפים ב PHP 5 הוא האפשרות לשרשר פונקציות במחלקה אחת. אפשרות זו נוספה ב PHP 5 בלבד והיא חלק בלתי נפרד מפיתוח OOP (קיצור של Object-Oriented-Programming) בעברית זה תכנות מונחה עצמים (?!). את השרשור עצמו עושים בצורה הבאה:

$object->method_a()->method_b()->method_c();

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

נקח לצורך העניין את המחלקה הבאה:

// This Person class encapsulates a couple of properties which
// a person might have: their name and age.
// We also give the Person the opportunity to introduce themselves.
class Person
{
private $m_szName;
private $m_iAge;

public function setName($szName)
{
$this->m_szName = $szName;
return $this; // We now return $this (the Person)
}

public function setAge($iAge)
{
$this->m_iAge = $iAge;
return $this; // Again, return our Person
}

public function introduce()
{
printf(
'Hello my name is %s and I am %d years old.',
$this->m_szName,
$this->m_iAge);
}
}

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

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

$vadim = new Person();

// Let's set some attributes and let me introduce myself.
$vadim->setName('Vadim');
$vadim->setAge(21);
$vadim->introduce();

הקוד למעלה ידפיס

Hello my name is Vadim and I am 21 years old.

עכשיו את אותו הדבר נתן לעשות בצורה הבאה:

$vadim = new Person();

// Let's set some attributes and let me introduce myself,
// all in one line of code.
$vadim->setName('Vadim')->setAge(21)->introduce();

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

הקוד למעלה ידפיס גם הוא:

Hello my name is Vadim and I am 21 years old.

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

$vadim = new Person();

// Let's set some attributes and let me introduce myself,
// all in one line of code.
$vadim->setName('Vadim')->setAge(21)->setName('Vadim2')->setAge(212)->introduce();

ידפיס:

Hello my name is Vadim2 and I am 212 years old.

4 Comments

  1. If you liked the concatenation of php5 you would probably fall in love with the anonymous functions option in php6, example is attached:

    Great thing IMHO.

  2. לא נוסף שום דוגמא לקוד. ולדעתי עוד מוקדם לדבר על PHP 6…5 כי 5.3 עוד לא יצא וכנראה לא יהיה הגרסא האחרונה של PHP לפני צאת PHP 6.

  3. תודה רבה, חידשת לי.

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

  4. תודה על המידע השימושי.
    פונקצייה זו (אם אני לא טועה) קיימת גם בRuby, והיא מאוד שימושית לשיפור וקיצור הקוד.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

Social

advertisement advertisement

Certificates

ZCE PHP 5 ZCE ZF ZCE PHP 5.3

Latest Posts

Latest Comments