RSS

لغة PHP 5 والبرمجة الغرضية التوجه

06 يونيو

إن كنت تمتهن البرمجة لفترة من الزمن، فلا بد أنك قد سمعت بمصطلح البرمجة الغرضية التوجه من قبل OOP، وربما قد تكون ق قمت فعلاً بكتابة شيفرة إحدى تلك الكائنات من قبل ومن ثم استخدمتها للحصول على الوظيفة التي تصبو إليها في برمجيتك. يعد الإصدار الخامس من لغة PHP خطوة كبيرة في اتجاه البرمجة الغرضية التوجه، فقد تم تجهيزه بنموذج كائنات جديد حقق لهذه اللغة الانسجام مع مبادئ البرمجة الغرضية التوجه المعيارية، وأتاح للمبرمجين الذين يستخدمون هذا الأسلوب كامل حزمة الأدوات التي اعتادوا استخدامها.

بعد هذه المقدمة، هل تتساءل كيف لك أن تستخدم هذه التقنية بدورك؟ حسنا، لا داعي لمزيد من الحيرة والتساؤل، فقد تم قبول رجاءك، حيث ستضع هذه الدراسة قدميك على أول الطريق.

سنلقي نظرة من خلال هذه الدراسة على إمكانيات لغة PHP الغرضية التوجه (بكلا إصداريها الرابع والخامس)، مدعمين ذلك بالأمثلة التي تستعرض وتشرح مكمن القوة التي تمنحك إياها هذه التقنية. سنقوم بتغطية معظم المبادئ من الأصناف إلى الكائنات والخصائص والطرائق إضافة إلى طائفة من المفاهيم المتقدمة من قبيل المنشئات والهادمات والطرائق أو الخصائص المعزولة إضافة إلى التوريث. فإن كانت هذه التقنية جديدة بالنسبة لك، أو كنت متهيباً مما سيتلو فلا تقلق، فأنا أعدك أن يكون الأمر أقل مشقة مما تتخيل، وعلى عكس طبيب الأسنان فأنا لا أكذب.


العودة إلى مقاعد الدراسة:

قبل أن نخطو قدماً، دعونا نتوثق من كونك تمتلك فكرة واضحة عن المفاهيم التي نحن بصددها ها هنا.

في لغة PHP، نطلق تسمية الصنف على مجموعة من التعليمات البرمجية التي تنجز مهمة بعينها. حيث يتضمن التصريح المثالي عن الصنف كلا من التوابع والمتحولات، وهو يساعد كونه القالب الذي تولد منه أمثلة بعينها من ذلك الصنف.

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

حالما يتم تعريف الصنف، تتيح لك لغة PHP إنتاج العدد الذي ترغب به من الأمثلة عن ذلك الصنف. حيث يكون كل من تلك الأمثلة كائنا تام الاستقلال، له خصائصه وطرائقه الخاصة، مما يتيح إمكانية التعامل معه بشكل مستقل عن غيره من الكائنات. إن هذه الميزة تغدو مفيدة عندما تحتاج إلى إنتاج أكثر من مثال واحد عن أحد الأصناف، فعلى سبيل المثال وجود اتصالين متواقتين مع قاعدتي بيانات مختلفتين، أو وجود سلتي تسوق في موقع تجارة إلكترونية.

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

المثال المعهود عن الحيوانات!

لكي تفهم تلك النقاط بشكل أفضل، تخيل حيواناً ما، أي حيوان. سوف أختار أنا الدب، كوني أحب الدببة. حسنا، لنسأل أنفسنا الآن، هل نستطيع التفكير مليا بالدب من وجهة نظر البرمجة الغرضية التوجه، أي على شكل كائنات؟

لم لا، ففي نهاية المطاف لكل دب خصائصه المميزة من قبيل العمر والوزن والجنس والتي يمكن مكافئتها بخصائص الكائن. وباستطاعة كل دب الإتيان بطائفة من النشاطات من قبيل الأكل أو النوم أو المشي أو حتى الركض، إن كل تلك النشاطات تكافئ طرائق الكائن.

دعونا نخطو بخيالنا خطوة أخرى إلى الأمام. فطالما أن كافة الدببة تتشارك مجموعة معينة من الخصائص، فمن الممكن تخيل وجود قالب عام للدببة سندعوه على سبيل المثال Bear، والذي سنصرح فيه عن الخصائص الأساسية والإمكانيات التي يتمتع بها كل دب على وجه البسيطة. وحالما يستخدم الصنف Bear هذا للحصول على مثال عنه أو ما اتفقنا على تسميته بالكائن bear، يغدو باستطاعتنا التعامل مع الخصائص الفردية للدب الذي استحدثناه للتو بشكل مستقل عن غيره من الدببة التي يمكن لك إنشاؤها انطلاقا من ذلك القالب.

حسنا، إن رغبنا بالتعبير عن ذلك الصنف باستخدام الإصدار الخامس من لغة PHP، فستكون الشيفرة البرمجية الناتجة لديك مشابهة لما يلي:

<?php
// PHP 5

// class definition
class Bear {
    // define properties
    public $name;
    public $weight;
    public $age;
    public $sex;
    public $colour;

    // define methods
    public function eat() {
        echo $this->name." is eating...\n";
    }

    public function run() {
        echo $this->name." is running...\n";
    }

    public function kill() {
        echo $this->name." is killing prey...\n";
    }

    public function sleep() {
        echo $this->name." is sleeping...\n";
    }
}
?>

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

<?php

// my first bear
$daddy = new Bear;

// give him a name
$daddy->name = "Daddy Bear";

// how old is he
$daddy->age = 8;

// what sex is he
$daddy->sex = "male";

// what colour is his coat
$daddy->colour = "black";

// how much does he weigh
$daddy->weight = 300;

// give daddy a wife
$mommy = new Bear;

$mommy->name   = "Mommy Bear";
$mommy->age    = 7;
$mommy->sex    = "female";
$mommy->colour = "black";
$mommy->weight = 310;

// and a baby to complete the family
$baby = new Bear;

$baby->name   = "Baby Bear";
$baby->age    = 1;
$baby->sex    = "male";
$baby->colour = "black";
$baby->weight = 180;

// a nice evening in the Bear family
// daddy kills prey and brings it home
$daddy->kill();

// mommy eats it
$mommy->eat();

// and so does baby
$baby->eat();

// mommy sleeps
$mommy->sleep();

// and so does daddy
$daddy->sleep();

// baby eats some more
$baby->eat();

?>

كما يظهر المثال السابق، فحالما يتم تعريف كائن جديد، يصبح من الممكن الولوج إلى خصائصه وطرائقه الفردية وتعديلها بشكل مستقل تماما عن غيره من الكائنات. إن هذه الحقيقة تغدو مفيدة جداً كما سيتضح لك من خلال متابعتك لبقية هذه الدراسة.

لنغص في العمق قليلا:

الآن وقد تملكت المفاهيم بشكلها الصحيح، دعونا نلق نظرة بمزيد من التمحيص على تصريح الصنف:

<?php
// PHP 5

// class definition
public class Bear {
    // define public properties
    public $name;
    public $age;

    // more properties

    // define public methods
    public function eat() {
        echo $this->name . " is eating...\n";
        // more code
    }

    // more methods
}
?>

كل تصريح عن صنف يبدأ بالكلمة class يتلوها اسم ذلك الصنف. باستطاعتك تسمية صنفك بأي اسم تشاء، طالما أن تلك التسمية لا تتعارض مع الكلمات المحجوزة في لغة PHP ذاتها كاسم تعليمة ما. بعدها تستخدم الأقواس الكبيرة للإحاطة بكافة متحولات الصنف وتوابعه، والتي تكتب بدورها بالطريقة التي اعتدت على كتابتهم بها في برامجك المعتادة.

لقد قدم الإصدار الخامس من لغة PHP مفهوم الرؤية إلى نموذج الكائن. يتحكم مفهوم الرؤية ذاك بالمدى الذي تتاح به خواص الكائن وطرائقه للتعامل معها من قبل مستدعيها، وبالتالي يلعب ذلك المفهوم دوراً كبيراً في تحديد مدى انفتاح صنفك على العالم الخارجي. هنالك ثلاثة مستويات من الشفافية تتاح لهذا المفهوم، مدرجة فيما يلي من أكثرها شفافية إلى أقلها شفافية: عامة public وخاصة private ومحمية protected. حيث تستطيع ضمن تصريح الصنف الذي تكتبه تحديد مدى شفافية الخاصة أو الطريقة من خلال استباقها بإحدى تلك الكلمات المحجوزة.

بشكل تلقائي تعتبر خصائص الصنف وطرائقه عامة public، وهو ما يتيح للبرنامج الذي يستدعيها من الوصول إلى داخل أمثلة الكائنات ومعاملتها مباشرة. فإن لم تكن راغباً في إتاحة ذلك القدر من التطفل، فيمكنك تصنيف بعض الخصائص أو الطرائق على أنها خاصة private أو محمية protected، تبعا لمدى التحكم بمكنونات الكائن الذي ترغب بالتنازل عنه (سوف نتناول هذا الأمر بمزيد من التفصيل قريبا).

نتيجة لعدم دعم نموذج الكائنات في الإصدار الرابع من لغة PHP لمفهوم الرؤية سابق الذكر، فإن الصنف المصرح عنه أعلاه لن يعمل على ذلك الإصدار الرابع من هذه اللغة. عوضاً عن ذلك عليك استخدام التصريح التالي لذات الصنف السابق:

<?php
// PHP 4

// class definition
class Bear {
    // define properties
    var $name;
    var $weight;
    var $age;
    var $sex;
    var $colour;

    // define methods
    function eat() {
        echo $this->name . " is eating...\n";
    }

    function run() {
        echo $this->name . " is running...\n";
    }

    function kill() {
        echo $this->name . " is killing prey...\n";
    }

    function sleep() {
        echo $this->name . " is sleeping...\n";
    }
}
?>

مما يتضح أعلاه أن كافة الخصائص والطرائق ضمن الإصدار الرابع من لغة PHP تعتبر عامة public دوماً، ولا يوجد هنالك ما تستطيع فعله لتحاشي تلك الحقيقة!

من أجل الحصول على مثال جديد من صنف ما، عليك استخدام الكلمة المحجوزة new لإسناد الكائن المنشئ حديثا إلى متحول PHP:

<?php
    $daddy = new Bear;
?>

وبلغة محكية يمكن وصف عمل التعليمة السابقة بالعبارة “أنشئ كائناً جديداً من الصنفBear ومن ثم قم بإسناده إلى المتحول daddy”

باستطاعتك الآن الولوج إلى كافة الطرائق والخصائص التابعة لهذا الصنف من خلال هذا المتحول، فعلى سبيل المثال تفحص التعليمة التالية:

<?php
    $daddy->name = "Daddy Bear";
?>

والتي تعني “أسند القيمة Daddy Bear إلى المتحول الذي يدعى name لهذا المثال من الصنف Bear”، فيما التعليمة التالية:

<?php
    $daddy->sleep();
?>

ستعني “نفذ التابع sleep لهذا المثال بالتحديد من الصنف Bear”.

لاحظ بأن الرمز -> يستخدم للربط ما بين الكائن وبين خصائصه وطرائقه، وحقيقة إغفال الرمز $ عند الولوج إلى خصائص مثال صنف ما.

من هنا وهناك

في حال رغبتك في الولوج إلى توابع أو متحولات الصنف ضمن تصريح الصنف ذاته، فإن كلا من الإصدار الرابع و الخامس من لغة PHP يتيح الكلمة المحجوزة this لهذه الغاية، والتي تستخدم للإشارة إلى “هذا” الصنف. وحتى ترى كيفية عملها، دعنا نعدل الطريقة eat بعض الشيء حتى تتقبل عدد وحدات الطعام، ومن ثم إضافة ذلك إلى وزن الدب.

<?php
// PHP 5

// class definition
class Bear {
    // define properties
    public $name;
    public $weight;

    // define methods
    public function eat($units) {
        echo $this->name . " is eating " . $units . " units of food...\n";
        $this->weight += $units;
    }
}
?>

في هذه الحالة، تحدد البادئة this أن المتحول المراد تعديله موجود ضمن ذات الصنف، أو بقول آخر “أضف المقدار الممرر للتابع eat إلى المتحول weight ضمن هذا الكائن”. وبالتالي تؤمن البادئة this طريقة ملائمة للولوج إلى المتحولات والتوابع المحلية في الصنف.

فيما يلي مثال يدلل على طريقة عملها:

<?php
    // create instance
    $baby = new Bear;

    $baby->name   = "Baby Bear";
    $baby->weight = 1000;

    // now create another instance
    // this one has independent values for each property
    $brother = new Bear;

    $brother->name   = "Brother Bear";
    $brother->weight = 1000;

    // retrieve properties
    echo $baby->name . " weighs " . $baby->weight . " units\n";
    echo $brother->name . " weighs " . $brother->weight . " units\n";

    // call eat()
    $baby->eat(100);
    $baby->eat(50);
    $brother->eat(11);

    // retrieve new values
    echo $baby->name . " now weighs " . $baby->weight . " units\n";
    echo $brother->name . " now weighs " . $brother->weight . " units\n";
?>

إن خرج هذا البرنامج سوف يقرأ على الشكل التالي:

Baby Bear weighs 1000 units

Brother Bear weighs 1000 units

Baby Bear is eating 100 units of food…

Baby Bear is eating 50 units of food…

Brother Bear is eating 11 units of food…

Baby Bear now weighs 1150 units

Brother Bear now weighs 1011 units

خلال البناء

من الممكن أيضا تنفيذ تابع ما بشكل آلي عندما يتم إنشاء مثال أو كائن عن صنف ما. وهو ما يشار له باسم المنشئ constructor، ولكي تستخدمه،  فعلى تصريح الصنف الذي تكتبه باستخدام الإصدار الخامس من لغة PHP أن يتضمن تابع ذي تسمية خاصة هي construct

فعلى سبيل المثال، إن رغبت بجعل كافة الدببة التي تولد تزن 100 وحدة، فبإمكانك إضافة ما يلي إلى تصريح الصنف الخاص بك:

<?php
// PHP 5

// class definition
class Bear {
    // define properties
    public $name;
    public $weight;
    public $age;
    public $colour;

    // constructor
    public function __construct() {
        $this->age    = 0;
        $this->weight = 100;
        $this->colour = "brown";
    }

    // define methods
}
?>

أما في الإصدار الرابع من لغة PHP فعليك استخدام ذات اسم الصنف للتابع الذي ترغب أن تجعله تابعاً منشئاً في ذلك الصنف. فيما يلي الشيفرة البرمجية المكافئة للمثال السابق مكتوبة للإصدار الرابع من لغة PHP:

<?php
// PHP 4

// class definition
class Bear {
    // define properties
    var $name;
    var $weight;
    var $age;
    var $colour;

    // constructor
    function Bear() {
    $this->age    = 0;
    $this->weight = 100;
    $this->colour = "brown";
    }

    // define methods
}
?>

لنقم الآن بمحاولة إنشاء واستخدام مثال عن ذلك الصنف:

<?php
    // create instance
    $baby = new Bear;

    $baby->name = "Baby Bear";

    echo $baby->name . " is " . $baby->colour;
    echo " and weighs " . $baby->weight . " units at birth";
?>

حيث يقوم المنشئ ها هنا بتعيين القيم الافتراضية للخصائص بشكل تلقائي كلما استخرج كائن مثال من ذلك الصنف. لذا فحين تنفذ الصنف المذكور أعلاه، سوف ترى العبارة التالية:

Baby Bear is brown and weighs 100 units at birth

أبعد أيدي المتطفلين

كما سبق وأوضحنا سابقا، أتاح الإصدار الخامس من لغة PHP جعل خصائص وطرائق الأصناف تعامل على أنها خاصة private، وهو ما يعني عدم إمكانية التعامل معها أو إظهارها خارج حدود الصنف. إن هذه الإمكانية مفيدة في حماية آلية العمل الداخلية لصنفك من أن يتم تناولها من قبل الكائنات الأمثلة المشتقة منه. لنفترض المثال التالي، والذي يستعرض هذه الفكرة من خلال إضافة متحول خاص جديد إلى الصنف Bear سندعوه lastUnitsConsumed:

<?php
// PHP 5

// class definition
class Bear {
    // define properties
    public  $name;
    public  $age;
    public  $weight;
    private $_lastUnitsConsumed;

    // constructor
    public function __construct() {
        $this->age    = 0;
        $this->weight = 100;

        $this->_lastUnitsConsumed = 0;
    }

    // define methods
    public function eat($units) {
        echo $this->name . " is eating " . $units . " units of food...\n";
        $this->weight += $units;

        $this->_lastUnitsConsumed = $units;
    }

    public function getLastMeal() {
        echo "Units consumed in last meal were ";
        echo $this->_lastUnitsConsumed . "\n";
    }
}
?>

الآن وطالما أن المتحول lastUnitsConsumed قد تم التصريح عنه على أنه خاص private، فأي محاولة لتعديله من خلال الكائنات المشتقة من هذا الصنف ستبوء بالفشل. وفيما يلي مثال على ذلك:

<?php
    $bob = new Bear;

    $bob->name = "Bobby Bear";
    $bob->eat(100);
    $bob->eat(200);

    echo $bob->getLastMeal();

    // the next line will generate a fatal error
    $bob->_lastUnitsConsumed = 1000;
?>

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

وسع من نفسك

هنالك ميزتين رائعتين في البرمجة الغرضية التوجه، سواء تلك المتعلقة بالإصدار الرابع أو الخامس من لغة PHP، وهما قابلية التوسع والتوريث. فببساطة شديدة، تعني تلك العبارة أنه باستطاعتك إنشاء صنف جديد يقام على ركائز صنف آخر موجود، يضيف له مزايا جديدة (سواء كانت خصائص أم طرائق)، ومن ثم تستطيع إنشاء كائنات مشتقة من ذلك الصنف الجديد. حيث ستتضمن تلك الكائنات كافة مزايا الصنف الأبوي الأصلي، مضافا لها المزايا الجديدة للصنف الابن.

وكمثال على ذلك، لنفترض الصنف PolarBear والذي يمثل دب القطب، والذي ما هو إلى توسعة لمفهوم صنف الدب Bear مضافا له طريقة جديدة:

<?php
// PHP 5

// class definition
class Bear {
    // define properties
    public $name;
    public $weight;
    public $age;
    public $sex;
    public $colour;

    // constructor
    public function __construct() {
        $this->age    = 0;
        $this->weight = 100;
    }

    // define methods
    public function eat($units) {
        echo $this->name . " is eating " . $units . " units of food...\n";
        $this->weight += $units;
    }

    public function run() {
        echo $this->name . " is running...\n";
    }

    public function kill() {
        echo $this->name . " is killing prey...\n";
    }

    public function sleep() {
        echo $this->name . " is sleeping...\n";
    }
}

// extended class definition
class PolarBear extends Bear {
    // constructor
    public function __construct() {
        parent::__construct();
        $this->colour = "white";
        $this->weight = 600;
    }

    // define methods
    public function swim() {
        echo $this->name . " is swimming...\n";
    }
}
?>

تستخدم الكلمة المحجوزة extends بهدف توسعة الصنف الأب إلى الصنف الابن. حيث تصبح كافة التوابع والمتحولات الخاصة بصنف الأب آنياً متاحة لصنف الابن. وهو ما يتضح بجلاء من خلال المثال التالي:

<?php
    // create instance of Bear()
    $tom = new Bear;
    $tom->name = "Tommy Bear";

    // create instance of PolarBear()
    $bob = new PolarBear;
    $bob->name = "Bobby Bear";

    // $bob can use all the methods of Bear() and PolarBear()
    $bob->run();
    $bob->kill();
    $bob->swim();

    // $tom can use all the methods of Bear() but not PolarBear()
    $tom->run();
    $tom->kill();
    $tom->swim();
?>

في هذه الحالة، سيفشل الاستدعاء tom->swim ويتسبب بظهور خطأ، وذلك نظرا لعدم امتلاك الصنف Bear للطريقة swim.

على كل حال، لن يفشل أي من الاستدعائين bob->run أو bob->kill وذلك نظرا لكون الصنف PolarBear كابن للصنف Bear سوف يرث كافة خصائص وطرائق والده.

لاحظ كيف تم استدعاء منشئ الصنف الأب ضمن منشئ الصنف الابن PolarBear، فمن المستحسن القيام بذلك مما يمكن كافة التهيئات اللازمة لصنف الأب من التنفيذ عندما يتم إنشاء مثال عن صنف الابن. بعد ذلك يمكن سرد أي عمليات تهيئة خاصة بصنف الابن ذاته ضمن المنشئ الموجود في صنف الابن. سيتم استدعاء منشئ الصنف الأب تلقائياً فقط في حينما لا يملك الصنف الابن منشئا خاصا به.

يمكنك تحقيق هذا ضمن الإصدار الرابع من لغة PHP كذلك الأمر. فيما يلي النسخة الخاصة بالإصدار الرابع من لغة PHP الخاصة بالتصريح عن الصنف PolarBear:

<?php
// PHP 4

// extended class definition
class PolarBear extends Bear {
    // constructor
    function PolarBear() {
        parent::Bear();
        $this->colour = "white";
        $this->weight = 600;
    }

    // define methods
    function swim() {
        echo $this->name . " is swimming...\n";
    }
}
?>

لمنع صنف ما أو إحدى طرائقه من أن يتم توريثها، نستخدم الكلمة المحجوزة final وذلك قبل اسم الصنف أو الطريقة (هذه الإمكانية جديدة ومتاحة فقط ضمن الإصدار الخامس من لغة PHP وبالتالي لا يمكن استخدامها في الإصدارات الأقدم). فيما يلي مثال نحيل فيه الصنفBear() إلى صنف غير قابل للتوريث:

<?php
    // PHP 5

    // class definition
    final class Bear {
        // define properties

        // define methods
    }

    // extended class definition
    // this will fail because Bear() cannot be extended
    class PolarBear extends Bear {
        // define methods
    }

    // create instance of PolarBear()
    // this will fail because Bear() could not be extended
    $bob = new PolarBear;
    $bob->name = "Bobby Bear";
    echo $bob->weight;
?>

ملاحظات الإنهاء

تماما كما هي حال المنشئات، هنالك أيضا الهادمات destructors. تعتبر الهادمات عبارة عن طرائق للكائن يتم استدعاؤها عندما يتم تدمير آخر إشارة إلى الكائن ضمن الذاكرة، وعادة ما تقوم تلك الطرائق بمهام التنظيف، من قبيل إغلاق الاتصال بقاعدة البيانات أو إغلاق الملفات المفتوحة، إضافة إلى تدمير متحولات الجلسة session وغيرها. إن الهامات متاحة فقط ضمن الإصدار الخامس من لغة PHP ، حيث يجب تسميتها destruct، وإليك المثال التالي:

<?php
    // PHP 5

    // class definition
    class Bear {
        // define properties
        public $name;
        public $weight;
        public $age;
        public $sex;
        public $colour;

        // constructor
        public function __construct() {
            $this->age    = 0;
            $this->weight = 100;
            $this->colour = "brown";
        }

        // destructor
        public function __destruct() {
            echo $this->name . " is dead. It was " . $this->age . " years old ";
            echo " and " . $this->weight . " units heavy. Rest in peace! \n";
        }

        // define methods
        public function eat($units) {
            echo $this->name . " is eating " . $units . " units of food...\n";
            $this->weight += $units;
        }

        public function run() {
            echo $this->name . " is running...\n";
        }

        public function kill() {
            echo $this->name . " is killing prey...\n";
        }
    }

    // create instance of Bear()
    $daddy = new Bear;

    $daddy->name = "Daddy Bear";
    $daddy->age  = 10;

    $daddy->kill();
    $daddy->eat(2000);
    $daddy->run();
    $daddy->eat(100);
?>

وهنا، حالما ينتهي تنفيذ البرنامج، لن تبقى أي إشارة إلى الكائن daddy، مما يتسبب في مناداة الهادم تلقائيا. وسيكون الخرج ظاهرا على الشكل التالي:

Daddy Bear is killing prey…

Daddy Bear is eating 2000 units of food…

Daddy Bear is running…

Daddy Bear is eating 100 units of food…

Daddy Bear is dead. It was 10 years old and 2200 units heavy. Rest in peace!

استكشاف أمور جديدة

يأتي كل من الإصدارين الرابع والخامس من لغة PHP مع حزمة من التوابع التي صممت خصيصا لتمكينك من استكشاف طرائق وخواص الكائنات، إضافة للتعرف على أي الأصناف ينتمي لها كائن ما معطى. إن أول تابعين من هذه الحزمة هما التابعين get_class و get_parent_class، واللذين يخبرانك بأسماء الأصناف التي أنتج منها تابع معين. فلنفترض أن لدينا الصنف التالي:

<?php
// PHP 5

// base class
class Bear {
    public $name;
    public $weight;

    // constructor
    public function __construct() {
    }

    // define methods
    public function eat() {
    }

    public function run() {
    }

    public function sleep() {
    }
}

// derived class
class GrizzlyBear extends Bear {
    public function kill() {
    }
}
?>

والآن، افترض أن لديك البرنامج التالي، والذي نستخدم فيه كلاً من التابعين get_class و get_parent_class لاستعادة اسم الصنف انطلاقا من المثال المنشئ عنه:

<?php
    $joe = new GrizzlyBear;

    $joe->name   = "Joe Bear";
    $joe->weight = 1000;

    echo "Class: " . get_class($joe);
    echo "Parent class: " . get_parent_class(get_class($joe));
?>

يمكنك كذلك الأمر استعراض كافة الخصائص المتاحة من قبل الصنف باستخدام التابعget_class_vars إضافة إلى كافة الطرائق المتاحة من قبل ذلك الصنف وذلك باستخدام التابع get_class_methods. أما إن رغبت في استعراض خصائص كائن بعينه، فعليك استخدام التابع get_object_vars عوضاً عن التابع get_class_vars. وفيما يلي مثال عن كل ذلك:


<?php

// create instance
$joe = new GrizzlyBear;
$joe->name = "Joe Bear";
$joe->weight = 1000;

// get class name
$className = get_class($joe);

// get class properties
echo "Class properties:\n";
print_r(get_class_vars($className));

// get class methods
echo "\nClass methods:\n";
print_r(get_class_methods($className));

// get this instance's properties
echo "\nInstance properties:\n";
print_r(get_object_vars($joe));

?>

وفيما يلي مثال عن الخرج الناتج:

Class properties:

Array

(

[name] =>

[weight] =>

)

Class methods:

Array

(

[0] => kill

[1] => __construct

[2] => eat

[3] => run

[4] => sleep

)

Instance properties:

Array

(

[name] => Joe Bear

[weight] => 1000

)

كما يلاحظ من أحد المقاطع السابقة في هذه الدراسة، يسمح التابع print_r لك بالنظر إلى داخل أي متحول PHP، ضمنا الكائنات. إنه تابع مفيد للغاية عند إجراءك لعمليات التنقيح وفحص الشيفرة البرمجية، لذا سجل هذه المعلومة لديك.

 
4 تعليقات

Posted by في 6 يونيو 2010 in PHP

 

الأوسمة: ,

4 responses to “لغة PHP 5 والبرمجة الغرضية التوجه

  1. ibnkamal

    6 يونيو 2010 at 9:55 صباحًا

    شكرا جدا على الموضوع القيم جدا

     
  2. tabosho

    6 يونيو 2010 at 2:42 مساءً

    كلماتك تركت أثرا في طريقي

    وأغنت موسوعتي البسيطة

    وأضافت شيئاً لمكتبتي

    اشكرك
    ساتابع باهتمام

    اخوك🙂

    عبود

    * لكن هلا اختصرت قليلا جدا طويل

     
    • خالد الشمعة

      7 يونيو 2010 at 10:48 صباحًا

      بصراحة تم إضافة هذه التدوينة بناء على طلب الأخ ibnkamal حيث كان يسأل عن مدخل جيد إلى البرمجة غرضية التوجه، فاخترت أن أشارك هذا الدرس مع الجميع وهو أحد الدروس التي أعطيها في دورة PHP عادة، لذا عذرا إن كنت تراه طويلا كتدوينة

       
  3. khaled touma

    20 ديسمبر 2010 at 6:31 مساءً

    الله يعطيك ألف عافية وشكراً كتير على معلوماتك القيمة

     

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

 
%d مدونون معجبون بهذه: