الخميس، 21 أغسطس 2014



تطرقنا في ألتدوينه السابقة إلى موضوع  oop وقلنا انه أسلوب برمجي لوضع مجموعة من الخصائص والمهام في كائنات class ويساعدنا ذالك في إعادة استخدام الكود وتفادي التكرار وابقي في ذهنك قاعدة (don't repeat yourself (DRY  وألان سنتناول المفهوم في لغة php.


إذن الكائن هو الذي نجمع فيه الخصائص المتشابه في مسمى واحد في صفحة الكود يسمى كلاس وعندما ننشى من عنصر يسمى اوبجيكت لاحظ الكود التالي

<?php  
 Class car{ 
 Public  $CarName; 
     Public $CarColor; 
 Public function speedup(){ 
 Echo "run"; 
 } 
 } 
 ?> 

 سنتطرق ل public لاحقا دعونا في الكود السابق عرفنا class أسمه carعرفنافيه CarName$ إسم السيارة وCarcolor$ لون السيارة لم نقم بشيء جديد هنا 

 <?php   
 $toyta =new car();  
 ?>  





في الكود السابق أنشأنا  object أسمه تويوتا من النوع car ولان نريد الوصول إلى خصائص object او السيارة نصل إلى العناصر الخاصة  بالobject عن طريق الكتابة <– ثم اسم العنصر سوأ كان خاصية أو دالة سوأ أردت إعطائه قيمة للخاصية أو أردت استرجاعها  أو عرضها كما في الكود التالي


 $toyta->CarName;  

الآن أريد أن أعطي للسيارة لون  وأسم


 $toyta->CarName="camre";  

في الكود السابق قمنا باستدعاء الخاصية Carname وخزنا فيها أسم السيارة كامري  وألان أريد عرض إسم السيارة

 echo $toyta->CarName;  

النتيجة
 camre  

functions

الدوال هي بلوك يوضع الكود البرمجي داخلها ليتم استعماله في عدة مناطق و بأشكال مختلفة فقط بمجرد كتابة أسم الدالة  و يتم تعريف الدالة كألتالي



 Function functionname (){  
 Function body  
 }  



 وبالطريقة التالية يتم استدعاء الدالة  Functionname   أسم الدالة
functionname ();
و إليك المثال
 Function sayehello(){  
 Echo "  hello  ";  
 }  
 Hi ahmad sayehello(); hi ali sayehello();  

النتيجة
 Hi ahmad hello hi ali hello  



parameters


هي المتغيرات التي يمكن تمريرها للدالة أثنا التنفيذ وتنفيذ الكود على أساسها  ويجب تعريفها عند تعريف الدالة


 Function sayehello($name){  
 Echo ”hello ”. $name;  
 }  



كما ترى قمنا بتعريف برميتر في أقواس الدالة  و استخدمناه داخل الكود البرمجي ولان كل ما نكتبه في المتغير  name$ سيقوم بعرضه إلى جانب كلمة hello طبعا في php يتم دمج النصوص باستخدام النقطة.



 $name=”ahmad”;  
 sayehello($name);  


 او كتابة القيمة مباشرة


  sayehello('ahmad' );  

النتيجة


 Hello ahmad  

يمكن تمرير أكثر من برميتر


 <?php  
 Function sayehello($name,$name2,$name3){  
 Echo ' hello '.$name;  
 Echo ' hello '.$name2;  
 Echo ' hello '.$name3;  
 }  
 sayehello("musta","ahmade","ali");  
 ?>  


النتيجة

 hello musta hello ahmade hello ali  

أما إذا  أردنا  أن يكون البرميتر في حالة عدم تمريره فارغ فعليك تعريفه فارغ وإلا سيحدث خطأ


 Function sayehello($name=null){  
 echo 'hello '. $name;  
 }  



  null تعني فارغ بهذه الطريقة يمكنك تمرير قيمة أثنا التنفيذ أو تركها فارغة
كما يمكنك تعريف عدد غير متناهي من البرميترات وذالك بتمرير مصفوفة  كما سنأخذ في الدروس القادمة
بعد أن قمنا بشرح الدوال نأتي  استخدامها داخلclass
بنفس طريقة المتغيرات يمكن استدعاء الدوال  من الobject و  يتم تنفيذ الدوال فور استدعائها
أنظر الكلاس car هنالك دالة بداخله تقوم بطباعة كلمة run على الشاشة

 $toyta->speedup();  

النتيجة
Run

 وبنفس الطريقة  يمكن كتابة متغيرات داخل الدالة  لنعد تعريف الدالة بحيث تستقبل متغيرات


 <?php   
  Class car{   
  Public $CarName;   
    Public $CarColor;   
  Public function speedup($speed){   
  Echo " run ".$speed;   
  }   
  }   
  ?>   

النتيجة

Run 100
 

الوراثة (Inheritance):


نأتي لواحدة من أهم مفاهيم الoop وهي الوراثة وهي ببساطة تعني نسخ جميع خصائص و دوال الكلاس إلى كلاس أخر وتتم الوراثة 
 بالطريقة التالية



 <?php  
 Class a{  
 }  
 Class b extends a{  
 }  
 ?>  

الكلاس a هو  الكلاس الاب والكلاس b هوالكلاس الابن أو المورث وللان يتم نقل كل ما يوجد داخل الكلاس الى الكلاس ببساطة  وألان لنطبق على الكلاس car



 <?php  
 Class toyto extends car{  
 Public $Companyname;  
 Public function getCompanyname(){  
 echo 'toyta';  
 }  
 }  
 ?>  




لقد قلنا أن أننا ننسخ جميع الدوال والخصائص من الكلاس الاب الى الكلاس الاإبن وألان جرب



 $newcar= new toyto();  
 $newcar->speedup('200');  



النتيجة
run 200

لاحظ أن الدالة speedupغير موجودة فى الكلاس toyto  ولأكن يتم تنفيذها عند إستعائها  من الكلاس  بسبب الوراثة تم نسخها إلى الكلاس toyto
اعتقد ان الصورة قد وضحت

public , protected , private


 ولان نأتي لكلمة public إنظر المثال التالي



 Class car{  
 Public $CarName='camre';  
 }  




 ولنفترض انك لا تريد أن يتم الوصول إلى الخاصية بهذه الطريقة
 $toyta=new car()  
 echo $toyta->CarName;  

لأنه بهذه الطريقة   يمكن تغير قيمة  بكل سهولة

 $toyta->CarName='anothername';  

إذن فالوصول إلى هذه القيمة بهذه الطريقة غير امن
حتى عند الوراثة عندما يرث أي كلاس من الكلاس كار يمكن للكلاس الوارث  إستخدام  الخاصية و التعديل عليها بكل سهولة أنظر الكود التالي



 Class toyto extends car{  
 Public $combanyname;  
 Public function getcombanyname(){  
 Echo 'toyta';  
                   }  
       }  
 $newcar =new toyto();  
  echo $newcar->carname;  



النتيجة
Run
إذن بالتاي كلمة ببليك تعنى أن الجميع يمكنهم استخدام هذه الخاصية أو الدالة خارج الكلاس ,هل يمكن تقيد الوصول إلى الخواص والدوال داخل الكلاس
 بالطبع ولان أكتب كلمة  protected   بدل ببليك 





 <?php  
 Class car{  
 protected $CarName;  
     Public $CarColor;  
 public function speedup(){  
 echo 'run ';  
 }  
 }  
  ?>  
النتيجة
  Fatal error: Cannot access protected property car::$CarName in C:\xampp\htdocs\tesr\index.php on line 17  

ولان جرب استخدامها خارج الكلاس الموروث نحصل على نفس النتيجة
إذن خاصية بروديكن تعني انه لا يمكن استخدام خارج الكلاس سوأ كان الأب أو الابن
ولنفترض انك تريد أن تستخدمها داخل الكلاس فقط وألا تورث إذن عليك استخدام private

عندما نكتب برنامج حقيقي يجب عليك استخدام private او protected  حسب الاحتياج  والدوال عادة ما تكون public
س:إذا كنت تريد استخدام احد الخصائص المحمية خارج الكلاس ماذا افعل

Setter & Getter

كما قلنا سابقا عندما تعمل على مشروع فليس من الحكمة ان تعطى لمتغير خاصية public ولاكن ماذا إذا أردت أن تستخدم متغير محمي  خارج الكلاس  ببساطة أستخدم دالة public
أنظر إلى الكود التالي


 <?php   
  Class car{   
  private $CarName='camrey';   
    public $CarColor;   
  public function getcarname(){   
  Return $this->CarName;   
  }   
  public function speedup(){   
  echo 'run ';   
  }   
  }   
  ?>   


خلينا من this$ والآن في الدالة getcarname طلبنا منه إرجاع المتغير CarName جرب تنفيذ الدالة
 النتيجة
camrey

لقد كتبنا داله ترجع لنا قيمة المتغير المحمي من دون تعريضه للخطر وهذه احد أهم مفاهيم الoop وهو التغليف أي اننا جعلنا التعامل مع المتغير من خلال دالة
ولأكن ماذا إذا كنا نريد  أن نسند لها قيمة من خارج الكلاس
 بنفس الطريقة  أكتب دالة تستقبل برميتر يتم إعطائه للدالة



 <?php   
  Class car{   
  private $CarName;   
    public $CarColor;   
  public function getcarname($name){   
  Return $this->CarName=$name;   
  }   
  public function speedup(){   
  echo 'run ';   
  }   
  }   
  ?>   


 لاحظ ستعدنا الدالة و أسنادنا قيمة إليها لذالك سمية دوال الستر والجتر


this$


نأتي إلى ال ذيس
إذا كنت تكتب داخل دالة داخل كلا س وأردت استخدام carname ماذا تفعل
ببسطة أستخدم this ثم إسم الدالة يعنى this  تمكننا من استخدام محتويات الكلاس الذي نحن فيه أو تعني الكلاس نفسه.

دالة التمهيد أو دالة البناء
يوجد في أي كلاس دالة تسم  Constructor تستدعى عند إنشاء الابجيكت  تبقى فارغة إذا  لم تكتبها
تكتب في Constructor ما تريد تنفيذه أثنا إنشاء الابوجيكت تاخذ دالة  Constructor نفس إسم الكلاس او __construct() تفضل الاخير لانع ربما تحتاج لتغير إسم الكلاس وعنداه تحتاج لتغير إسم الكونستركت
دعونا نكتب Constructor للكلاس كار
 <?php  
 Class car{  
 private $CarName;  
 function __construct($carname){  
 $this->CarName=$carname;  
 }  
 Public function getcarname(){  
 Return $this->CarName;  
 }  
 }  
 $toyta= new car('camrey');  
 echo $toyta->getcarname();  
 ?>  


في المثال السابق
طلبنا من Constructor إسناد القيمة التي سنمررها عند إنشاء الاوبجيكت  لcarname
 قد يبدو بدون قائده ولأكنه مفيد جدا ولنفترض ان بيانات السيارات مخزنة في قاعدة بيانات كرقم السيارة و لون والماركة
إذا أردة إنشاء الاوبجيكت بطريقة اوتماتيكية  كل ما عليك هو تمرير ال ip إلى Constructor و سيقوم بستخراج خصائص السيارة و إسنادها إلى المتغيرات 
س: في حالة الوراثة كيف يتم نسخ Constructor
ببساطة يمكنك استخدام Constructorالاب وإعادة إستخدامه داخل Constructor الجديد بالطريقة التالية


 <?php  
 Class newcar extends car{  
 Function car(){  
 parent::__construct();  
 echo “new constract”;  
 }  
 }  
 ?>  


destruct

كما ان الكونستركت  يستدعا عند إنشاء الاوبجيكت فأن  destruct  يستدعا عند إنها الاوبجيكت
إليك المثال


 <?php  
 Class car{  
 private $CarName;  
 Function __constrcontr($carname){  
 $this->CarName;  
 }  
 Public function getcarname(){  
 Return $thist>CarName;  
 }  
 Function __destrcontr($carname){  
 $this->CarName=null;  
 Echo ‘finsh job’;  
 }  
 }  
 ?>  



كما ترى قمنا بتفريغ المتغيرات  وطباعة finsh job  تستخدم دالة الهدم لمساعدة php لتفرغ القيم كما إنهاء مهمة في حالة فتح اتصال مع قاعدة البيانات يمكنك إغلاق الاتصال بقاعدة البيانات في destruct

Static


الخاصية ستاتيك تستخدم عندما تريد أن تشارك المتغير مع اي ابوجيكت تنشئه من الكلاس ركز معي  ستاتيك تعنى انه ثابت وليس غير قابل للتغير حيث أنه يمكن تغير قيمته

  أنظر الكود التالي


 Class car{  
 Public static companyName='toyota';  
 }  

يتم استدعائه القيمة بدون إنشاء اوبجيكت  بهذه الطريقة
 Echo car:: companyName;  
وإذا تغيرة قيمة المتغير ستاتيك  في أي مكان ستتغير في بقية الاوبجيكت وهذا ما تعنيه مشاركة.


كما يمكننا جعل المتغيرات ثابتة يمكننا جعل دوال ثابتة ولأكن أنتبه عندما نكتب دالة ستاتيك لانكتب this بداخلها لأنه لا يوجد  object بداخلها فهي تستدعى من دون إنشاء اوبجيكت ستفهم فائدتها عندما تفهم معنا  كلمة  "قوانين ثابتة" مثل قانون مساحة الدائرة آو قانون مساحة المربع
وفي كلاس السيارة مثلا قد نحتاج لقانون مثلا لحساب سرعة السيارة

 <?php  
 Class car{  
 private $CarName;  
 static function carspeed($Distance,$time){  
 return $Distance/$time  
 }  
 }  
  Echo Car:: carspeed(122,333);  
 ?>  


كانت هذه التدوينة تلخيص لمفهوم الoop بلغة php ولايزال هنالك مفاهيم متقدم فى ال oop سنناقشها في تدوينات قادمة نلتقى في تدوينة اخرى إنشاء الله.

0 التعليقات