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

הגדרת מחלקה

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

הגדרת מחלקה (class) נעשית בצורה הבאה:

<?php
  class
/*המילה השמורה שבאמצעותה מצהירים
על הגדרת מחלקה.
*/
 class_name
/*שם המחלקה.
חייב להיות שם חוקי כשל משתנה.
*/

  {
     var $item_1;
/*משתנה מחלקה.
מוגדר באמצעות המילה השמורה var.
*/

     . . .
/*הגדרות של משתני מחלקה נוספים.*/

     var $item_n;
  
     function func_name_1($args,...)
/*פונקציית מחלקה.
הגדרתה כשל פונקציה רגילה,
אך היא חייבת להיות מוגדרת
בתוך הבלוק של הגדרת המחלקה.
*/

     {
        func_name_1_body;
     }
     . . .
/*הגדרות של פונקציות מחלקה נוספות.*/

     function func_name_m($args,...)
     {
        func_name_m_body;
     }
  }
?>

כדי להגדיר מחלקה משתמשים במילה class. בתוך הבלוק של המחלקה אנו מגדירים את הרכיבים שלה, שיכולים להיות או משתנים או פונקציות. משתנים מגדירים באמצעות המילה var, ופונקציות מגדירים באמצעות המילה function. ב-PHP חייב להגדיר את המשתנים וגם את הפונקציות בתוך הבלוק של הגדרת המחלקה (בניגוד, למי שמכיר, לצורת ההגדרה של פונקציות במחלקה ב-C++).

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

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

נביא דוגמא למחלקה שמגדירה אובייקט מסוג ספר:

<?php
  class Book
  {
     var $book_info;
/*הגדרת משתנה מחלקה.
נשתמש במשתנה זה בתור מערך,
אך אי-אפשר לאתחל את המשתנה
עם הגדרתו, לכן עלינו להשתמש
בפונקציית הבנאי כדי לאתחלו.
*/

  
     function Book($name,$author='unknown')
/*הגדרת פונקציית בנאי.
בתוך פונקציה זו נאתחל את משתני המחלקה.
*/
 //constructor
  
   {
        $this->book_info['name']=$name;
/*אתחול משתנה המחלקה $book_info.
כדי לפנות למשתנה מחלקה, משתמשים
במשתנה האוטומטי $this.
(טעות לכתוב: $this->$book_info['name']).
*/

        $this->book_info['author']=$author;
  
        $book_info['name']="no name";
/*ללא שימוש במשתנה האוטומטי $this,
לא נוכל לגשת לרכיבי המחלקה.
שורה זו מגדירה משתנה מקומי בפונקציה,
ולא משנה את ערכו של משתנה המחלקה.
*/

     }
  
     function PrintBookDetails()
/*הגדרת פונקציית מחלקה.*/

     {
        echo "<I>book:</I> <B>".$this->book_info['name']."</B>, ".$this->book_info['author'];
     }
  }
  
  $book1=new Book('20 miles under the water','Jul Vern');
/*יצירת מופע (אובייקט) של המחלקה.
חייב למלא את הארגומנטים של פונקציית הבנאי,
אחרת נקבל שגיאה.
*/

  $book2=new Book('catch 22');
/*יצירת מופע נוסף של אותה המחלקה.
כאן אנו משתמשים בערך ברירת המחדל
של פונקציית הבנאי.
*/

  $book1->PrintBookDetails();
/*כדי לגשת לרכיב של מחלקה, משתמשים
באופרטור -> שמחזירה את ערכו של הרכיב.
במקרה זה אנו מפעילים את פונקציית המחלקה
PrintBookDetails().
*/

  echo "<BR>";
  $book2->PrintBookDetails();
?>


תגובות בנושא

לא הבנתי בשביל מה השורה הזאת: 02-12-03 06:01
 יולו
#683

$book_info['name']="no name";

מה היה קורה אם לא היית רושם אותה?

השורה הזאת... 02-12-03 07:02
 אלי חן (מנהל)
#686

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

למה טוב מחלקות? 02-12-03 07:01
 [ללא שם]
#713

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

מחלקות 02-12-03 07:02
 אלי חן (מנהל)
#716

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

איך מחלקה יכולה להחזיר ארך? 02-12-03 11:01
 [ללא שם]
#721

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

מה זה OOP? 02-12-03 11:01
 [ללא שם]
#722

מה זה OOP?

OOP 02-12-03 11:01
 אלי חן (מנהל)
#724

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

פונקציית מחלקה 02-12-03 11:01
 אלי חן (מנהל)
#725

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

לגבי פונקציית הבנאי 01-12-04 01:00
 [ללא שם]
#1361

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

הגדרת משתנה בתוך מחלקה 01-12-04 10:00
 ישראל
#1377

חייבים להגדיר את המשתנים בתוך המחלקה ?
אי אפשר פשוט לכתוב $book=php ?
למה צריך את ה-VAR ?
ני רואה גם שבהמשך כתבת: $book1 וכו', בלי הגדרה באמצעות VAR

בכלל, מה ההבדל בין "משתנה מחלקה", לבין כל משתנה אחר הנמצא במחלקה ?


לדף הקודםמחלקות ואובייקטים -הקודם
לתחילת הדףלתחילת הדף
הבא- הורשהלדף הבא