الدرس الثاني - Object-Oriented PHP) Key OOP Concepts) | مايندز | علم ينتفع به
الأتصال بنا 61109-264-012

السبت، 30 نوفمبر 2013

الدرس الثاني - Object-Oriented PHP) Key OOP Concepts)

Object-Oriented PHP




بين يدك اخي القارئ الدرس الثاني من البرمجة الموجهة للأشياء في الـ PHP .

في هذا الجزء نتعرف على مفاهيم اساسية في البرمحة الموجهة للأشياء مع بعض الامثلة .


الكلاسات Classes::

    بيئتنا المحيطة مكونة من عدد كبير ( ﻻ تستطيع ان تعده ان لكن يحصيه ربنا ) من الكائنات سواء حية او غير حية ( النباتات المباني الناس السيارات ... الخ ) كل كائن من هذه الكائنات يعرف ( نتعرف عليه ) بصفات وتصرفات محددة فريدة تخصه وحده هذه الصفات تحدد ما هو هذا الكائن .


مثال:: السيارة يمكن تعريفها :

    بخصائص ( chracteristics) ( لون، عدد اطارات، سرعة، الشركة، موديل ..)

    بسلوكيات او تصرفات ( behaviors ) ( سيرإلى الامام، سير إلى الخلف، الالتفاف ...)

   في ال OOP القالب الذي يجسد الكائن بتعريف صفاته وتصرفاته يسمى الكﻻس لذلك يمكن ان نقول بأن الكﻻس يعبر عن الأشياء التي تريد معالجتها او التعامل معها في التطبيق المحدد.

مثال:: إذا أردت أن تنشئ تطبيق ﻹدارة مكتبه مثﻻ فهنالك كائنات تمثل الأشياء ( الكﻻسات ) المكونة للمكتبه فتحتاج لكﻻسات لعرض الكتب والمجﻻت والموظفين وغيرها من مكونات المكتبه. فكل هذه الاشياء تجسدها خواص وتصرفات محددة في ال OOP نسمي الخاصية او الصفة property والسلوك او التصبرف method .الصورة العامة لتكوين الكﻻس على النحو التالي:




class ClassName {
        // Property declarations defined here
        // Method declarations defined here
}
class Employee // إسم الكﻻس{
      private $name;       //
      private $title;         // هذه الثﻻث خواص او صفات الموظف
      protected $wage;  //

       // إحدى النشاطات التي يقوم بها الموظف هي تسجيل الحضور
      protected function clockIn() {
           echo "Member $this->name clocked in at ".date("h:i:s");
      }       
    // إحدى النشاطات التي يقوم بها الموظف هي تسجيل الخروج 
     protected function clockOut() {
          echo "Member $this->name clocked out at ".date("h:i:s");
     }
}
    هذا الكﻻس يعرف ثﻻث خواص name, title, and wage وأيضا يعرف نشاطين او تصرفين clockIn and clockOut ﻻ تقلق حيال الكﻻس السابق سيتم شرح كيفة تعريف الخواص والنشاطات.

النموذج Objects:
 
   الكﻻس يمثل الصيغة الاساسية ( القالب الأساسي ) والذي يتم على اساسه إنشاء النموذج (instance) وهذا النموذج يسمة الـ Object.
مثال::  موظف عبارة عن كﻻس او قالب لكائن نستطيع منه استدعاء او تصنيع نماذج مثل محمد، احمد، سارة... والصيغة العامة لعمل نموذج او نسخة من الكﻻس هي:
$employee = new Employee();

    عند إنشاء نموذج يمتلك نفس الخصائص والتصرفات التي عرفناها في القالب (الكﻻس) وهي الاسم والعنوان والأجرة بالاضافة إلى تسجيل الحضورة الانصراف. ولكن كيف يتم إعطاء القيم للـ Object هذا الامر سنناقشة في العناوين التالية.

الخواص Properties::

     وهي صفة تمثل جانب من مواصفات الكﻻس او الكائن. وهي مشابهة لحد ما للمتغيرات في الـ PHP لكن هنالك فروقات بسيطة ستعرفها في الوقت المناسب.

تعيين او تعريف الخاصية Declaring Properties::
     قواعد تعريف الـ Property مشابهة ايضا لقواعد تعريف النتغيرات من حيث التسمية :
يبدأ ب $ - وﻻ يأتي بعد $ إلا _ و حروف انجليزية - يمكن استخدام الارقام في تسمية المتغير لكن ﻻ تأتي بعد ال $.

     بالاضافة لذلك يسبق الاسم أحد الكلمات  التالية ( public - private - protected - final - static)  سنشرحها ﻻحقا لكن يجب ان تعرف بداية انها تسبق اسم الخاصية وإليك المثال التالي.

class Employee
{
    public $name = "John";  // هنا تم وضع قيمة ابتدائية للمتغير
    private $wage;        // هنا لم يتم وضع قيمة ابتدائية للمتغير
}

     يمكن ان يتم وضع قيمة افتراضية او ابتدائية للخاصية كما يمكن ان تترك خالية اي بدون تعريف القيمة.

استدعاء الخاصية Invoking Properties::

      تذكر دائما للتعامل مع الكﻻس انه يجب استدعاء الكﻻس او نسخ الكﻻس او تكوين نموذج من الكﻻس

$employee = new Employee();
     وللتعامل مع الخواص في التي اكتسبها النموذج نستخدم المعامل <- وهذا ايضا احد الفروقات بين خواص الكائن والمتغيرات العادية وايضا ﻻ نستخدم $ عند كتابة الصفة عند التعامل مع النموذج اي عند استدعاء الخاصية 
$object->property
وعند تطبيق هذه القاعدة على المثال السابق للموظف نستطيع الوصول للخاصية او استدعاءها كالتالي..
$employee->name
$employee->title
$employee->wage

ولكن مهﻻ ماذا إذا اردت ان استخدم احدى الخواص من داخل الكﻻس ؟ الاجابه هي انك تستخدم نفس الصيغة لكن تستبدل اسم النموذج وهو $object بكلمة أخرى وهي this فتصبح صيغة استدعاء الخاصية داخل الكﻻس نفسه ( وليس من النموذج )  كالتالي:

function setName($name)
// الدالة  التي استدعينا داخلها الخاصية والتي هي جزء من نفس الكﻻس
{
    $this->name = $name; //<===
}

نطاق (مدى) الخاصية Property Scopes::

تدعم الـ PHP خمس نطاقات للخواص وهي public, private, protected, final, and static:
نتناول الاربعة الاوائل من اليسار  ( static سيأتي دورها فيما بعد).

النطاق عام Public::

class Employee
{
public $name;
// Other property and method declarations follow...
}

يمكن ان تصل إليها وتغير في قيمتها عن طريق الـObject المعرفة ضمن قالبه

$employee = new Employee();
$employee->name = "Mary Swanson";
$name = $employee->name;
echo "New employee: $name";

سيكون الخرج عند التنفيذ  >>> New employee: Mary Swanson <<< .

     وهذا النوع مكروه في الـOOP ﻷنه يتيح وصول للنموذج والتعديل على الداتا فيه بدون تحقق وبدون مراعاة الشروط المطلوبة ولتتضح الرؤية بهذا الخصوص نعط مثال :

$employee->name = "12345";

     عند تغير البيانات بهذا الاسلوب تحص مشكلة كبيرة فبدلا من ان تكون القيمة حرفية اصبحت نص لكن ادخلت به بيانات تالفة او خطأ وهذا غير مقبول في البرامج.
والحل لهذه المشكلة هو تغليف ( encapsulating ) البيانات في ال Object فﻻ تكون متاح إلا عبر واجهة ( interface ) محددة public methods والبيانات المغلفة بهذه الطريقة تسمى private data والحل الاخر هو تعريف البيانات نفسها ك private وهذا سيناقش تاليا.

النطاق الخاص Private::

    وهذا النوع من البيانات لا يمكن الوصول إليه إﻻ من داخل الكﻻس نفسه

class Employee
{
    private $name;
    private $telephone;
}
الخاصية التي تعرف كخاص (private) ﻻ يمكن الوصول إليها من خﻻل النموذج وﻻ يمكن الوصول إليها من النماذج الكﻻسات الوارثة للخاصية من كﻻس اب او مورَّث ﻻ تقلق سيناقش هذا الامر ﻻحقا ( وهذه الان مشكلة تم حلها بنطاق اخر وهو pretected )  ركز في النطاق الخاص والذي يجب ان تعلم جديا ان الخواص في هذا النطاق ﻻ يمكن الوصول إليها إﻻ من خﻻل واجهة ( دالة ) من داخل الكﻻس نفسه وهذا المفهوم الذي تحدثنا عنه سابقا ( التغليف encapsulation ).

مثال::
class Employee
{
    private $name;
    public function setName($name) {
        $this->name = $name;
    }

    $employee = new Employee;
    $employee->setName("Mary");
}
    بهذه الطريقة يتحكم المبرمج للكﻻس في من يجب ان يصل لخاصية ما وهذا ما يسمى الصﻻحيات على سبيل المثال يمكن عمل دالة setName تقوم بالتأكد من المدخﻻت هل هي حرفية والتحقق من ان الخاصية القيمة ﻻ تساوي null  وهذا بالطبع افضل من ان يقدم لنا المستخدم بيانات غير صحيحة او غير ضارة بالنظام.

الناطاق المحمي Protected::

      وهذا النطاق خليط بين العام والخاص وفالخواص والدوال ﻻ تستخدم إلا من قبل الكﻻس نفسه + يستطيع المستخدم الوصول إلى الخواص والدوال من كﻻس أخر إذا ورثها من اب ( مورث ) وايضا سنأخذ هذه النقاط بالتفصيل في الدروس القادمة إن شاء الله ، مثال على النطاق المحمي:

class Employee
{
    protected $wage;
}

النطاق Final::

    وهذا النطاق بنفس مواصفات السابق إلا ان الفرق بينهما هو ان الكﻻس الوارث للخاصية ﻻ يستطيع ان يعمل overridden اي استبدال القيمة الموجودة ( قراءة فقط ) فﻻ يمكن تغيير القيمة هنا إلا من الكﻻس نفسه الذي تنتمي إليه الخاصية.

class Employee
{
final $ssn;
}
إلى هذه النقطة نكون قد وصلنا إلى نهاية درس اليوم موعدنا يوم السبت من الاسبوع القادم ان شاء الله