تجرد یا abstract در PHP
تجرد یا Abstract:
تجرد یا Abstract موقعی استفاده می شود که بخواهیم کلاس یا تابعی را بدون داشتن بدنه تعریف کنیم و بخواهیم بدنه آن را بعداً تعریف کنیم.
به عنوان مثال اگر بخواهیم چندین کلاس مختلف برای کار با دیتابیس های مختلف در برنامه تعریف کنیم که در آن برخی کارها یکسان می باشد؛ میتوانیم یک کلاس abstract برای تعریف اولیه و توابع یکسان آنها تعریف کنیم و سپس به نسبت هر دیتابیس توابع مخصوص آن را فراخوانی کرد.
مزیت های استفاده از abstarct:
- کم تر شدن کدهای نوشته شده
- افزایش سرعت برنامه
- روان تر و خواناتر بودن کدها
مثال:
<?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
کلاسهایی که به صورت 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 توسعه می یابند.
تشخیص کلاس یک شئ
در برنامه نویسی توجه به این نکته که آیا شئ مورد نظر از کلاس مد نظر ما ساخته شده است یا نه نکته ای است که کاربرد های زیادی دارد.
برای این منظور می توان از دستور 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!
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 20743
دیدگاهها
منبع آموزشی خوبی به فارسی برای شیگرایی درست کردید. اگر به موارد زیر بپردازید، آموزش تان تکمیل تر خواهد شد:
1- namespace ها
2- ارث بری چندگانه در php امکان ندارد
3- geter و seter
اگر اینا را هم به آموزشهایتان اضافه کنید عالی میشود. و فقط اگر امکانش هست یک رفرنس خوب هم برای شیگرایی در php معرفی کنید.
با سلام
من هم گفته این دوستمون رو تایید میکنم.
حتما مبحث trait ها رو هم برای رفع مشکل ارث بری چندگانه قرار بدین
اینطوری آموزشتون کامل تر میشه
یا علی
سلام، پیشنهاد می کنم برای پیاده سازی یک پروژه کاملا شیءگرا، از فریم ورک لاراول استفاده کنید.
اطلاعات بیشتر در لینک زیر:
beyamooz.com/product/laravel/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%85%D8%AD%D9%88%D8%B1-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84
اول یه تشکر کنم از آموزش خوبتون .
میخواستم بدونم حالا که من این آموزشو تموم کردم باید در ادامه چه مبحثیو بخونم و ممنون میشم اگه منبع مناسبی برای آموزش سراغ دارین بگین .
ابتدا به شما دوست عزیز بابت فراگیری PHP تبریک می گم و برای ادامه پیشنهادی که براتون دارم مشاهده فیلم آموزش ساخت فروشگاه در PHP است.
www.beyamooz.com/product/eshop
البته می توانید آموزش jQuery را در کنار فیلم بالا مطالعه فرمایید.
خدا خیرتون بده
من تا این مرحله مرجعم فقط بیاموز بود.
دستتون درد نکنه انشالله جبران کنیم
خسته نباشید
سلام با تشکر از آموزش خوبتون ...
فکر می کنم در بخش Abstract متغییر id را به اشتباه private نوشته شده
سلام
خیر متغیر id باید بصورت private باشد.
سلام خسته نباشید من درست نفهمیدم چرا یک بار باید تابع بدونه بدنه و یکبار با بدنه تعریف شود
اگر اینجوری نشه چی میشی.؟ فقط ارزش مفهومی داره؟
سلام
اتفاقا بسیار کاربردی است. بعنوان مثال در یک بازی فوتبال تصور بفرمایید که وظایف دروازه بان را بصورت کتبی به افرادی که قرار است در این پست فعالیت کنند ابلاغ کنیم...! ابتدا نفر اول با روش های مربوط به خودش Document ارائه شده را مطالعه می کند و در پست خود قرار میگیرد اما وی کاملا مختار است که در برخی از مواقع بعنوان مدافع و یا حتی گل زن، ظاهر شود و این کار را انجام می دهد. حالا نفر دوم بعد از مطالعه Document پشت دروازه قرار می گیرد اما تشخیص وی این است که از هرگز پست خود را برای دفاع یا گل زدن ترک نکند.
در اینجا Document ارائه شده به دروازه بان حکم بدنه تابع ما را دارد و نحوه ی انجام وظیفه توسط دروازه بان، حکم پیاده سازی تابع را دارد...!
البته در مطلب بالا کاربرد واقعی Abstract گفته شد. در واقع اگر برنامه ای شما، امکان اتصال به پایگاه داده های مختلف را داشته باشد، قسمت Insert و Update و ... برای هر کدام از پایگاه داده ها، متفاوت خواهد بود. اما اگر بخواهیم اصولی پیش برویم باید یک کلاس Abstract تعریف کنیم و کلیه متدهای مورد نیاز برای کار با پایگاه داده را در آن تعریف کنیم و در ادامه به ازای هر پایگاه داده یک کلاس دیگر تعریف کنیم و شروع به پیاده سازی متدها کنیم.
سپاس از آموزش خوبتون.
آموزش php mvc توی برنامه تون نیست؟
فعلاً بدلیل مشغله زیاد، آموزش PHP MVC امکان پذیر نیست، اما ان شا الله در آینده انجام خواهد شد.
متشکر
عالیییییییییییی یی
ممنون ، عالی بود