آموزش مفاهیم شی گرایی OOP در PHP


آموزش مفاهیم شی گرایی (OOP) در PHP – ساخت کلاس، آبجکت، متد، property

برنامه نویسی شی گرا، به اختصارOOP، یک روش یا سبک برنامه نویسی است که در آن توسعه دهنده تمامی متغیرها و توابعی که در کنار هم عملیاتی را انجام می دهند را در قالب یک کلاس واحد سازمان دهی می کند. لازم به توضیح است که تکنیک برنامه نویسی شی گرا به مراتب کارا و پیچیده تر از سبک برنامه نویسی مبتنی بر تابع (procedural) است. در شرح علت برتری آن به روش مذکور می توان به دلایل زیر اشاره کرد:

  1. قابلیت سازمان دهی بهینه تر کد
  2. قابلیت تقسیم برنامه به برنامه های کوچک تر اما مستقل. برنامه ی اصلی به صورت یک exe در می آید که دیگر قسمت های مستقل برنامه را فراخوانی می کند (modularity).
  3. عدم نیاز به نوشتن کدهای تکراری و قابلیت هایی که قبلا پیاده سازی شده اند و صرف جویی در استفاده از منابع.

با این وجود، بسیاری از توسعه دهندگان سعی می کنند در پروژه های کوچک و ساده خود از سبک برنامه نویسی مبتنی بر تابع (procedural) بهره بگیرند.

اما همین که پروژه بزرگتر می شود، بهتر است به منظور نوشتن یک برنامه ی کارامد و رقم زدن تجربه ی کاربری بهینه، از تکنیک برنامه نویسی شی گرا برای ساخت و توسعه ی پروژه استفاده شود.

>

در طول این سری آموزشی، اولین گام های خود را در عرصه ی برنامه نویسی با تکنیک شی گرا برمی داریم. ابتدا با مفاهیم ساده و تشکیل دهنده ی تکنیک برنامه نویسی OOP آشنا می شویم:

  • مفهوم کلاس
  • مفهوم آبجکت (object یا شی)
  • مفهوم متد
  • مفهوم property یا فیلدهای خصوصی یک کلاس
  1. با نحوه ی ایجاد کلاس آشنا می شوید.
  2. با نحوه ی افزودن property های جدید به کلاس آشنا شوید.
  3. با نحوه ی ساخت آبجکت از روی کلاس آشنا می شوید.
  4. با نحوه ی بازیابی مقدار property و تنظیم مقدار آن آشنا می شوید.
  5. با نحوه ی افزودن متد به کلاس آشنا می شوید.

شرح چگونگی ایجاد کلاس در PHP

اولین قدم در تعریف یک کلاس، این است که تمام کدهایی که با همکاری هم یک وظیفه ی واحد را انجام می دهند، داخل کلاسی واحد بگنجانیم. برای مثال، می توان کدهایی که کاربران یک وبلاگ را مدیریت می کند، داخل یک کلاس، کدهایی که کار انتشار پست ها و نوشته ها در وبلاگ را بر عهده دارند در کلاسی دیگر و کدی یا منطقی که نظرات و کامنت های کاربران را اداره می کند در کلاس سوم قرار دهید.

جهت نام گذاری کلاس، توسعه دهندگان اغلب از یک اسم مفرد که با حرف بزرگ آغاز می شود، استفاده می نمایند. برای مثال، کدی که کاربران سایت را مدیریت می کند را داخل کلاس User، کدی که پست های کاربران را اداره می کند داخل کلاس Post و کدی که نظرات و کامنت های کلاس را اداره می کند، داخل کلاسی به نام Comment قرار می دهند.

در مثال زیر، یک کلاس به نام Car تعریف کرده و سپس تمامی کدهای مربوط به دستگاه car را داخل این کلاس سازمان دهی می کنیم.

class Car {    // The code  }  

کلاس را با کلیدواژه ی class تعریف می کنیم. بعد از کلیدواژه ی class اسم کلاس را که حرف اول آن با capital letter آغاز می شود درج می کنیم.

اگر اسم کلاس از چندین کلمه تشکیل شده باشد، در آن صورت حرف اول تمامی کلمات تشکیل دهنده را با حروف بزرگ می نویسیم. از این سیستم نگارشی تحت عنوان camel case یاد می شود. به طور مثال می توان به JapanseCars، AmericanIdol، EuropeTour اشاره کرد. پیاده سازی یا منطق کلاس را داخل کاراکترهای { و } قرار می دهیم که به آن در اصطلاح بدنه ی کلاس می گویند.

چگونگی تعریف property در کلاس

به متغیرهایی که داخل بدنه ی کلاس تعریف می شوند، property گفته می شود. property ها می توانند مانند متغیرهای عادی مقادیری از نوع رشته (string)، عدد صحیح (integer) و بولی (Boolean) در خود نگهداری کنند. در زیر تعدادی property داخل کلاس Car تعریف می کنیم.

class Car {    public $comp;    public $color = 'beige';    public $hasSunRoof = true;  }  
  • کلیدواژه ی public را قبل از اسم property درج می کنیم.
  • حرف اول اسم property را با lower case (حرف کوچک) آغاز می کنیم.
  • اگر اسم property بیش از یک کلمه تشکیل شده باشد، در آن صورت تمامی کلمات به استثنای کلمه ی اول با حرف بزرگ آغاز می شوند. به عنوان مثال می توان دو نمونه ی فوق،$color و $hasSunRoof اشاره کرد.
  • یک Property می تواند مقدار پیش فرض داشته باشد که در همان خط تعریف به آن اختصاص داده می شود. به عنوان مثال می توان به $color = ‘beige’ اشاره کرد.
  • یک property می تواند مقدار پیش فرضی هم نداشته باشد. در مثال بالا می توان به متغیر $comp اشاره کرد.

نحوه ی ساخت آبجکت از روی یک کلاس

می تواند از روی یک کلاس که به منزله ی یک نقشه عمل می کند، چندین آبجکت یا نمونه ایجاد کرد. هر آبجکت می تواند property های منحصر بفرد خود را داشته باشد.

به منظور استفاده از یک کلاس می بایست ابتدا یک آبجکت یا نمونه ی جدید از آن ایجاد کرد. جهت ساخت آبجکت از روی کلاس مورد نظر، در برنامه نویسی شی گرا از کلیدواژه ی new استفاده می شود. مثال:

$bmw = new Car ();
  • در کد بالا، یک آبجکت به نام $bmw از کلاس Car با کلیدواژه ی new ایجاد می کنیم.
  • از این پروسه تحت عنوان نمونه سازی از کلاس (ایجاد آبجکت از روی کلاس) یا instantiation یاد می شود.

می توان چندین نمونه یا آبجکت از کلاس واحد ایجاد کرد. همان طور که در بالا نیز ذکر شد، کلاس یک نقشه برای ایجاد آبجکت (در صورت نیاز با پیاده سازی اختصاصی) می باشد.

$bmw = new Car ();  $mercedes = new Car ();  

به عبارت ساده تر می توان از یک کلاس واحد هر تعداد آبجکت که لازم بود ایجاد کرد و سپس به هر آبجکت property های دلخواه و اختصاصی را اضافه نمود.

آبجکت چه کاربردی دارد؟

در برنامه نویسی مبتنی بر تابع، توابع و متغیرها در یک دامنه ی سراسری (global scope) قرار داشته و تمامی کدهای برنامه قابلیت دسترسی به این متغیرها و توابع را دارند. کافی است اسم تابع مورد نظر را جهت اجرای آن صدا زد. اما در برنامه نویسی شی گرا، می توان با استفاده از کلاس کد خود را سازمان دهی کرده و در واقع با تعریف توابع و متغیرها در سطح کلاس، آن ها را از دسترس بقیه برنامه خارج ساخت.

زمانی که توسعه دهنده کد را داخل بدنه ی کلاس تعریف می کند، این کد در واقع کپسوله سازی شده (class scope) و از دسترس کل برنامه یا به اصطلاح global scope خارج می شود. حال به منظور دسترسی به متغیرها یا توابعی که در حوزه ی اختصاصی کلاس قرار دارند، باید یک مکانیزم درنظر بگیریم که از طریق آن، کد خارج از کلاس بتواند در صورت نیاز به محتوای کپسوله سازی شده در کلاس دسترسی داشته باشد. برای این منظور در برنامه نویسی شی گرا از کلاس مورد نظر آبجکت ساخته می شود.

دقت داشته باشید که بر واژه ی جمع objects تاکید داریم، نه واژه ی مفرد object چرا که می توانیم هر تعداد آبجکت که لازم است از کلاس واحد ایجاد کنیم. آبجکت های ساخته شده از روی کلاس تمامی متدها و property های کلاسی که از آن مشتق شده اند را دارا می باشند. با مشاهده ی تصویر زیر این مفهوم را بهتر درک می کنید:

OOP

همان طور که مشاهده می کنید، از کلاسی واحد به نام Car، سه آبجکت مستقل به ترتیب به نام های Mercedes، Bmw و Audi ایجاد کردیم.

تمامی آبجکت ها از روی کلاسی واحد به نام Car ساخته شده اند و به همین جهت متدها و property های کلاس مزبور را به ارث برده اند (دارا می باشند)، با این وجود هر سه آبجکت از یکدیگر متفاوت و مستقل هستند. در واقع نه تنها دارای اسم متفاوت اند، بلکه به property های هر یک مقدار متفاوتی تخصیص داده شده است. در نمونه ی فوق، سه آبجکت از نظر رنگ با یکدیگر متفاوت هستند.

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

اگرچه هر سه آبجکت حامل کدی یکسان می باشند، با این حال می توانند رفتار و قابلیت هایی متفاوتی داشته باشند چرا که مقادیر مختلفی به هر یک تخصیص یافته است.

چگونگی دسترسی به مقدار property های یک آبجکت

پس از ایجاد آّبجکت از روی کلاس، می توان به property های آن دسترسی داشت. برای مثال:

echo $bmw -> color;  echo $mercedes -> color;  

به منظور دسترسی به مقدار یک property از کلاس، ابتدا اسم آبجکت، عملگر -> و سپس اسم property را ذکر می کنیم.

همان طور که مشاهده می کنید، اسم property با علامت $ آغاز نمی شود، بلکه این علامت فقط در ابتدای اسم آبجکت درج می گردد.

Result:beige beige

نحوه ی مقداردهی و تنظیم property های آبجکت

به منظور مقداردهی property های یک آبجکت، از روشی یکسان استفاده می کنیم.

برای مثال، به منظور تنظیم مقدار property مزبور (color) بر روی true در آبجکت bmw، از کد زیر استفاده می کنیم:

$bmw -> color = 'blue';

جهت مقداردهی متغیر $comp در هر دو آبجکت، بدین صورت عمل می کنیم:

$bmw -> comp = "BMW";  $mercedes -> comp = "Mercedes Benz";  

پس از تنظیم مقدار property، می توان به مقدار آن دسترسی داشت.

به منظور دسترسی به مقدار متغیر color از آبجکت$bmw ، از دستور زیر استفاده می کنیم:

echo $bmw -> color;  Result:blue  

همچنین می توان به اسم شرکت تولید کننده ی ماشین (ذخیره شده در متغیر comp) و رنگ آبجکت دوم (مقدار color در آّبجکت $mercedes) دسترسی پیدا کرد.

echo $mercedes -> color;  echo $mercedes -> comp;  Result:beige  Mercedes Benz  

نحوه ی تعریف متد در کلاس

کلاس ها معمولا علاوه بر متغیر، توابعی را دربر می گیرند که عملیاتی را انجام داده و رفتارهای آن کلاس محسوب می شوند. زمانی که تابع در محدوده ی یک کلاس تعریف می شود، در اصطلاح برنامه نویسی شی گرا به آن متد می گویند. در کد زیر می بینید که تابع hello() را با سطح دسترسی (کلیدواژه ی public) تعریف کردیم.

class Car {    public $comp;    public $color = 'beige';    public $hasSunRoof = true;    public function hello()     {      return "beep";    }  }  

در قطعه کد بالا می بینید که کلیدواژه ی public را قبل از متد قرار دادیم. در انتخاب اسم برای یک تابع، معمولا حرف اول اسم تابع را با حرف کوچک آغاز می کنیم.

چنانچه اسم تابع از چندین کلمه تشکیل شده باشد، در آن صورت تمامی کلمات به استثنای اولین کلمه با حرف بزرگ آغاز می شوند. به عنوان مثال می توان به helloUser() یا flyPanAm() اشاره کرد.

شیوه ی دسترسی به متد نیز مانند دسترسی به property های کلاس می باشد. اما قبل از هر چیز لازم است یک آبجکت از روی کلاس ایجاد کنیم.

$bmw = new Car ();  $mercedes = new Car ();  echo $bmw -> hello();  echo $mercedes -> hello();  Result:beep  beep  

کل کدی که در طول آموزش جاری نوشته ایم، به شرح زیر می باشد:

 color; // beige  echo "
"; echo $mercedes -> color; // beige echo "
"; // Set the values $bmw -> color = 'blue'; $bmw -> comp = "BMW"; $mercedes -> comp = "Mercedes Benz"; // Get the values again echo $bmw -> color; // blue echo "
"; echo $mercedes -> color; // beige echo "
"; echo $bmw -> comp; // BMW echo "
"; echo $mercedes -> comp; // Mercedes Benz echo "
"; // Use the methods to get a beep echo $bmw -> hello(); // beep echo "
"; echo $mercedes -> hello(); // beep

در مبحث بعدی به شرح کلیدواژه ی $This می پردازیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *