تجرد یا abstract در PHP

چاپ

تجرد یا Abstract:

Wiki

تجرد یا Abstract موقعی استفاده می شود که بخواهیم کلاس یا تابعی را بدون داشتن بدنه تعریف کنیم و بخواهیم بدنه آن را بعداً تعریف کنیم.

به عنوان مثال اگر بخواهیم چندین کلاس مختلف برای کار با دیتابیس های مختلف در برنامه تعریف کنیم که در آن برخی کارها یکسان می باشد؛ میتوانیم یک کلاس abstract برای تعریف اولیه و توابع یکسان آنها تعریف کنیم و سپس به نسبت هر دیتابیس توابع مخصوص آن را فراخوانی کرد.

مزیت های استفاده از abstarct:

  1. کم تر شدن کدهای نوشته شده
  2. افزایش سرعت برنامه
  3. روان تر و خواناتر بودن کدها

مثال:

<?php
abstract class Base_DB{
    private $id; 
    abstract function update($data,$id); 
    abstract function insert($data);
    function save($data){
        if(is_null($this->id)){
            $this->insert($data);
        }else{
            $this->update($data,$this->id);
        }
    }
}
class MySQL_DB extends Base_DB{
    function update($data,$id)
    { 
        // کدهای مربوط به ویرایش 
    }
    function insert($data)
    {
        // کدهای مربوط به درج کردن 
    }
}
class Oracle_DB extends Base_DB{ 
    function update($data,$id)
    { 
        // کدهای مربوط به ویرایش 
    }
    function insert($data)
    {
        // کدهای مربوط به درج کردن 
    } 
}
؟>

با کمک کلاس های MySQL_DB و Oracle_DB که در بالا تعریف شد می توان با تابع save و یا هر تابع دیگری کارهای مربوطه را انجام داد؛ توجه داشته باشید که توابع update و insert که در کلاس Base_DB به صورت abstract تعریف شده اند باید در کلاسهایی که از آن سرچشمه می گیرند تعریف شده باشند.


interface

Wiki

کلاسهایی که به صورت interface تعریف می شوند تقریباً همانند کلاس هایی هستند که به صورت abstract تعریف می شوند اما نحوه تعریف و استفاده آنها متفاوت می باشد.

مثال:

<?php
interface class Base_DB {
    public function update($data,$id);
    public function insert($data);
}

class MySQL_DB implements Base_DB{ 
    function update($data,$id)
    { 
        // کدهای مربوط به ویرایش 
    }
    function insert($data)
    {
        // کدهای مربوط به درج کردن 
    }
}
class Oracle_DB implements Base_DB{ 
    function update($data,$id)
    { 
        // کدهای مربوط به ویرایش 
    }
    function insert($data)
    {
        // کدهای مربوط به درج کردن 
    }

؟>

توجه داشته باشید که کلاسهایی که به صورت interface تعریف می شوند نباید شامل بدنه یک تابع باشند؛ در صورتی که کلاس های abstract می توانستند ادغامی از توابع معمولی و توابع abstract شوند.
به این نکته نیز توجه داشته باشید که کلاسهای interface بجای extends با implements توسعه می یابند.


تشخیص کلاس یک شئ

Wiki

در برنامه نویسی توجه به این نکته که آیا شئ مورد نظر از کلاس مد نظر ما ساخته شده است یا نه نکته ای است که کاربرد های زیادی دارد.

برای این منظور می توان از دستور instanceof استفاده کرد؛

instanceof همچنین برای کلاس هایی که از یک کلاس دیگر ارث بری کرده اند نیز استفاده می شود؛

مثال:

<?php 
class Parent
{
    // ...
}

class PLUS extends Parent
{
    // ...
}

$test = new PLUS();
if($test instanceof PLUS)
{
    echo "test comes from PLUS....<br />";
}
if($test instanceof Parent)

    echo "test comes from Parent....<br />";

?>

خروجی کد بالا:

test comes from PLUS....
test comes from Parent....

همانطور که در مثال بالا دیده میشود test$ هم از نوع PLUS است و هم از نوع Parent!