یکی از خصوصیاتی که زبان php در قالب شی گرایی از آ« بهره مند میباشد،خاصیت Abstract می باشد.
خاصیت Abstract زمانی استفاده می شود که بخواهیم کلاس یا متدی را بدون داشتن بدنه تعریف کنیم و بخواهیم بدنه آن را بعداً تعریف میکنیم.به عنوان مثال اگر بخواهیم چندین کلاس مختلف برای کار با بانک های اطلاعاتی مختلف در برنامه تعریف کنیم که در آن برخی کارها یکسان می باشد. در این زمان متد یا کلاس های آن بانک ها را خارج از بدنه تعریف و در مکان مشخص بدنه ی مربوط به توابع و کلاس هارا تعریف مینماییم. میتوان یک کلاس abstract و توابع یکسان آنها را تعریف کنیم و سپس به نسبت هر بانک اطلاعاتی که در برنامه استفاده شده است یا هر قطعه از برنامه توابع مخصوص آن را فراخوانی کرد و از آن توابع و کلاس هایی که خارج از بدنه ایجاد شده استفاده نماییم.
برای مثال به کد زیر توجه کنید:
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 تعریف شده اند باید در کلاسهایی که از آن سرچشمه می گیرند تعریف شده باشند.
مزیت های استفاده از abstract :
- کم تر شدن کدهای نوشته شده
- افزایش سرعت برنامه
- روان تر و خواناتر بودن کدها
توجه کنید که کلاسهایی که به صورت interface تعریف می شوند تقریباً همانند کلاس هایی هستند که به صورت abstract تعریف می شوند اما نحوه تعریف و استفاده آنها متفاوت می باشد.
به مثال زیر توجه کنید:
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 تعریف میشوند:
- کلاسهایی که به صورت interface تعریف می شوند نباید شامل بدنه یک متد باشند. در صورتی که کلاس های abstract می توانستند ادغامی از توابع معمولی و توابع abstract شوند.
- کلاسهای interface بجای extends با implements توسعه می یابند.
در برنامه نویسی شی گرا توجه به این نکته که آیا شئ مورد نظر از کلاس مد نظر ما ساخته شده است یا نه نکته ای است که میتواند کاربرد های بسیاری برای توسعه دهنده یا برنامه نویس داشته باشد.
برای این منظور می توان از دستور instanceof استفاده کرد.
از دیگر استفاده هایی که از instanceof صورت میگیرد میتوان به کلاس هایی که از یک کلاس دیگر ارث بری کرده اند اشاره نمود.
به کد زیر توجه کنید:
class Parent
{
// ...
}
class PLUS extends Parent
{
// ...
}
$test = new PLUS();
if($test instanceof PLUS)
{
echo "test comes from PLUS..
";
}
if($test instanceof Parent)
{
echo "test comes from Parent..
";
}
خروجی کد بالا به صورت زیر می باشد:
test comes from PLUS..
test comes from Parent..
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید