شی گرایی در PHP

مروری بر برنامه‌نویسی شی‌گرا در PHP برای کار با Codeigniter

شی گرایی در PHP

هموطن گرامی؛ سلام.

در این مقاله قصد داریم تا مروری اجمالی به برنامه‌نویسی شیء‌گرا و به طور خاص شی‌ءگرایی در PHP، داشته باشیم. خواندن این مقاله برای افرادی که به تازگی قصد شروع کار با کدایگنایتر و یا برنامه‌نویسی با  زبان PHP را دارند توصیه می‌شود.

تاریخچه برنامه‌نویسی

تا قبل از ورود برنامه‌نویسی شیءگرا زبان‌های برنامه‌نویسی از روش ساخت یافته پیروی می‌کردند. در این روش مبنای کدهای یک برنامه توابع بودند. برنامه‌نویس با تعریف توابع مختلف در هنگام نیاز آن‌ها را فراخوانی می‌کرد. این روش جوابگوی برخی از مسائل نبود و عیوبی نیز به همراه داشت. از جمله زبان‌هایی که به این سبک بودند می‌توان به Pascal، BASIC و زبان C اشاره کرد1. تئوری برنامه‌نویسی شیءگرا در اواخر دهه 1950 و اوایل دهه 1960 میلادی در دانشگاه MIT ارائه2 و باعث تحولی بزرگ در دنیای برنامه‌نویسی شد. در برنامه‌نویسی شیءگـرا نوع رویکرد به مسئله و حل آن تفاوت پیدا کرد. برای نمونه C++، Java و PHP از جمله زبان‌هایی هستند که از شی‌گرایی پشتیبانی می‌کنند. در ادامه به ساز و کار برنامه‌نویسی شی‌گرا می‌پردازیم.

برنامه‌نویسی شی‌گرا

واژه لاتین برنامه‌نویسی شی‌گرا OOP (بخوانید او او پی) و سرنام عبارت Object Oriented Programming است. در این سبک از برنامه‌نویسی کل پروژه به قسمت‌های مستقل کوچک‌تری تقسیم می‌شود. با این کار وظیفه هر بخش مشخص می‌شود و از طرفی شفافیت و خطایابی در کدهای برنامه ساده‌تر می‌شود. در برنامه‌نویسی روالی (ساخت یافته) هر یک از این بخش‌های جزئی را یک تابع تشکیل می‌داد اما در برنامه‌نویسی شی‌گرا کلاس‌ها این اجزاء را تشکیل می‌دهند. برای کد زنی به شیوه شی‌گرا باید مفاهیم زیر را بدانیم که در ادامه به صورت ساده و خلاصه برای شما بازگو می‌کنیم:

  • کلاس (Class)
  • شی (Object)
  • نمونه‌سازی (Instance)
  • متد (Method)
  • خصوصیت (Property)
  • ارث‌بری (Inheritance)
  • بسته‌بندی (Encapsulation)
  • چند شکلی (Polymorphism)
  • نوع عمومی (Public)
  • نوع محافظت شده (Protected)
  • نوع خصوصی (Private)

کلاس Class

کلاس‌ها الگوهایی هستند که اشیاء (Objects) از روی آن‌ها ساخته می‌شوند. تمامی اشیایی که در پروژه هم‌نوع هستند از یک کلاس (Class) مشخص سرچشمه گرفته‌اند. یک کلاس شبیه "نقشه" برای یک خانه است.

شیء Object

به یک نمونه بر گرفته از یک کلاس مشخص شیء (Object) گفته می‌شود. یک شیء شبیه یک "خانه ساخته شده" از روی نقشه است.

نمونه Instance

هنگامی که کار کد‌نویسی مربوط به یک کلاس انجام شد، برای بهره‌مندی باید از روی آن کلاس یک شیء بسازیم. به شیء ساخته شده از روی یک کلاس، نمونه (Instance) می‌گوییم. خانه ساخته شده یک "نمونه" برگرفته از نقشه است. تعداد نامحدودی خانه از روی آن نقشه ممکن است ساخته شود.

متد Method

هر کلاس ممکن است توابعی داشته باشد. به این توابع متد (Method) گفته می‌شود. این متدها هستند که رفتارها و قابلیت‌های یک شیء را تعیین می‌کنند. فرضاً سیستم سرمایش خانه را می‌توان یکی از متدهای کلاس خانه در نظر گرفت. اگر استفاده از کولرهای گازی در کلاس تعریف شده باشد پس تمام خانه‌هایی که از روی این کلاس ساخته می‌شوند دارای کولر گازی خواهند بود.

خصوصیت Property

کلاس‌ها  حاوی متغیرهایی نیز هستند. به این متغیرها خصوصیت (Property) می‌گوییم. رنگ خانه یکی از خصوصیات کلاس خانه است که در یک متغیر نگهداری می‌شود.

ارث‌بری Inheritance

یکی از مکانیزم‌هایی که در شی‌گرایی وجود دارد این است که یک کلاس از یک کلاس دیگر متولد شود. به این معنی که کلاس متولد شده علاوه بر ارث‌بری (Inheritance) از کلیه متدها و خصوصیات کلاس پدر، خود می‌تواند شامل متدها و خصوصیات جدیدی نیز باشد. فرض کنید که در حیاط خانه یک استخر آب اضافه شود. این خانه علاوه‌بر کلیه امکانات خانه اول دارای یک قسمت جدید (یا خصوصیت جدید و یا متد جدید) شده است.

بسته‌بندی Encapsulation

قرار دادن کلیه خصوصیات و متدهای یک کلاس در یک بسته‌بندی مشخص (در حافظه RAM) را بسته‌بندی (نهان‌سازی) (Encapsulation) می‌نامند. این کار باعث افزایش امنیت نیز می‌شود به طوری که دسترسی به خصوصیات و متدهای یک شیء، چنانچه از نوع داخلی تعریف شده باشد، توسط سایر اشیاء میسر نخواهد بود. در مثال خانه، حریم داخلی از حریم خارجی جدا است.

چند ریختی Polymorphism

عملکرد متفاوت کلاس‌ها به هنگام به اشتراک‌گذاری  یک رابط عمومی (Common Interface) را چند ریختی گویند.3 زمانی که بخواهید کلاسی تهیه کنید تا سایر کلاس‌های برنامه از آن استفاده کنند بدون اینکه از عملکرد داخلی آن اطلاع داشته باشند چند ریختی (Polymorphism) کاربرد دارد. فرض کنید که شما یک مهندس عمران هستید. برای ساختن هر بنایی اعم از مسکونی یا تجاری به عملیاتی نیاز دارید که برای همه آن‌ها مشترک است. مانند گودبرداری. در نتیجه شما می‌توانید کلاسی تهیه کنید که شیء ساخته شده از روی آن برای شما عملیات حفاری را انجام دهد. سپس به سراغ کلاس ساختمان بروید. کلاسی که متد حفاری دارد به ازای زمین‌های با اندازه متفاوت عملکرد متفاوتی دارد اما این کار برای هر سازه‌ای که شما بخواهید بسازید لازم است. در غیر اینصورت باید متد مربوط به حفاری به طور جداگانه در کلاس‌های مختلف شما نوشته شود (خانه، مغازه، پاساژ، برج و غیره).

نوع عمومی Public

خصوصیات و یا متدهایی از کلاس که از نوع عمومی (Public) تعریف شوند از هر جایی قابل دسترس خواهند بود. مانند پارگینگ یک مجتمع آپارتمانی که همه واحدها به آن دسترسی دارند.

نوع خصوصی Private

این نوع از متدها یا خصوصیات فقط مختص به کلاس خود هستند و دسترسی به آن‌ها از جای دیگر مقدور نیست. مانند اتاق‌های خانه که راهی از اتاق‌های خانه‌های دیگر به آن‌ها وجود ندارد.

نوع محافظت شده Protected

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

دیاگرام ساده از یک کلاس

در شکل زیر خصوصیات و متدهای یک کلاس نمایش داده شده‌اند. در نظر داشته باشید که هیچ محدودیتی در تعداد خصوصیات و یا متدها نیست اما همواره بهینه (Optimize) بودن کد خود را مد نظر داشته باشید.

شمایی از یک کلاس ساده

شکل 1 - شمایی از یک کلاس ساده

تعریف یک کلاس در PHP

برای تعریف یک کلاس از کلمه رزرو شده class به همراه نام انتخابی برای آن کلاس استفاده می‌کنیم. مانند کد زیر:

<?php
class person{
}
?>

با این کار به سادگی یک کلاس تهی با نام person ایجاد شده است. در ادامه برای این کلاس خصوصیات و متدهایی تعریف می‌کنیم:

<?php
class person{
    public $name;
    function __construct($inputName){
        $this->name=$inputName;
    }
    public function showName(){
        echo $this->name;
    }
} // End class
$morteza=new person('Morteza');
$morteza->showName();
?>

در کد بالا به کلاس person خصوصیتی به نام name اضافه شده است. پس اشیایی که از این روی این کلاس ساخته می‌شوند در دل خود چنین خصوصیتی خواهند داشت. همانطور که می‌بینید خصوصیت نام شخص از نوع public تعریف شده است پس سایر اشیاء نیز به مقدار این property دسترسی خواهند داشت.

نکته:  پس در PHP به متغیرهای خارج از کلاس، متغیر (Variable) و به متغیرهایی که در درون کلاس قرار دارند خصوصیت (Property) گفته می‌شود.

توابع سازنده Constructor

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

متد کلاس showName

به کلاس فرضی ما یک متد به نام showName نیز اضافه شد. وظیفه این متد به سادگی نمایش خاصیت name است. نوع این متد نیز public است لذا سایر اشیاء خواهند توانست این متد را فراخوانی و اجرا کنند.

ساختن شیء از روی کلاس person

همانطور که می‌دانید متغیرها در PHP می‌توانند انواع مختلفی از داده‌ها را نگهداری کنند. برای نمونه اعداد صحیح، اعشاری، رشته‌ها (دنباله‌ای از کاراکترها)، آرایه‌ها و اشیاء. پس هنگامی که می‌خواهیم از روی یک کلاس یک شیء (Object) تهیه کنیم آن را در یک متغیر قرار می‌دهیم. برای ساختن شیء از کلمه رزرو شده new به همراه نام کلاس و پرانتز، استفاده می‌کنیم. در مثال بالا یک شیء به نام morteza ایجاد شده که رشته کاراکتری Morteza را نیز به تابع سازنده ارسال می‌کند. متعاقباً تابع سازنده این رشته را در درون خصوصیت name قرار می‌دهد تا سایر متدها در صورت نیاز بتوانند از این مقدار استفاده کنند.

دسترسی به متدها و خصوصیات اشیاء

هنگامی که شیء مورد نظر خود را از روی یک کلاس ساختیم برای دسترسی به خصوصیات و یا فراخوانی یکی از متدهای آن شیء، از نماد <- (خط تیره، علامت بزرگتر) استفاده می‌کنیم. برای راحتی اسم این نماد را "نقطه" بگذارید (A->B بخوانید A نقطه B). ابتدا نام شیء سپس نماد مربوطه و بعد نام متد یا خصوصیت مورد نظر خود را ذکر می‌کنیم. برای فراخوانی متدها پس از ذکر نام متد، باید از پرانتز استفاده شود. در صورت نیاز، آرگومان (Argument) نیز می‌توان به متدها ارسال کرد. برای خصوصیات پرانتز نباید تایپ شود. جهت دیدن تاثیر و حوزه دسترسی نوع‌های public private و protected به مثال‌های  این صفحه مراجعه کنید. در نمونه‌های زیر فرض بر نوع public می‌باشد:

$morteza->showName(); //فراخوانی متد بدون ارسال پارامتر
$circle->draw(50,50,25); //فراخوانی متد رسم از شیء دایره همراه با ارسال داده‌های مورد نیاز از طریق پارامتر
$student->accept_year; //خواندن سال قبولی دانشجو از شی دانشجو
$car->model;
$person->weight;

نکته: برای دسترسی به متد یا خصوصیت یک کلاس از درون خود آن کلاس باید از کلمه رزرو شده this$ استفاده کنیم. یعنی در هنگام نوشتن کد کلاس هرگاه به متدی یا مقدار یکی از خصوصیت‌های کلاس جاری نیاز شد به شکل زیر اقدام می‌کنیم. نکته اینکه فقط یک علامت $ در ابتدا ذکر می‌شود.

$this->name; //  خواندن مقدار یک خصوصیت
$this->method(); // فراخوانی یک متد خودی

نکته: برای دسترسی به متد یا خصوصیت یک کلاس از درون کلاس (و نه شیء) دیگر از دو کاراکتر کولِن (Colon) به دنبال هم :: استفاده می‌شود. مثال:

parent::__construct($name);

نحوه‌ی ارث‌بری یک کلاس

برای این کار از کلمه رزرو شده extends بعد از نام کلاس و سپس ذکر نام کلاس والد، استفاده می‌کنیم. در هنگام تعریف کلاس، تنها مجاز به یک بار ارث‌بری هستیم، یعنی نمی‌توان از چند واژه extends برای ارث‌بری همزمان از چند کلاس استفاده کرد و PHP این اجازه را نمی‌دهد(single inheritance languages).  در کد زیر یک کلاس دانشجو تعریف شده است. از آن‌جا که دانشجو نیز یک شخص است لذا برای بهره‌مندی از خصوصیات و متدهای کلی از کلاس person ارث‌بری شده است. فرضاً اگر کلاسی برای ورزشکاران نیز بخواهیم بنویسیم می‌توانیم همین روال را تکرار کنیم.

<?php
class person{
    public $name;
    function __construct($inputName){
        $this->name=$inputName;
    }
    public function showName(){
        echo $this->name;
    }
} // End class
// نحوه ارث بری از کلاس شخص
class student extends person{
    private $major;
    public function __construct($name,$major){
        parent::__construct($name);
        $this->major=$major;
    }
    public function showMajor(){
        return $this->major;
    }
} // End class

$Elina=new student('Elina','Computer Software');
echo "<p>Hello, my name is ";
echo $Elina->showName();// از کلاس شخص به ارث رسیده است
echo "</p><p>";
echo "I am study ";
echo $Elina->showMajor();
echo "</p>";
?>

نکته: پس از ارث‌بری می‌توانید متدهای نوع عمومی (Public) و یا محافظت شده (Protected) را بازنویسی (Redeclare) کنید و تغییراتی در آن‌ها ایجاد کنید اما نمی‌توان این کار را برای متدهای نوع خصوصی (Private) انجام داد.

خاتمه

در پایان توصیه اکید بنده به دوستان علاقمند به برنامه‌نویسی این است که هرگز به یادگیری کد از طریق خواندن، شنیدن یا دیدن اکتفا نکنند و حتماً با دستان خود کد بنویسند. از کدهای بسیار ساده تا پیشرفته. تنها زمانی از copy و paste بخش‌های مختلف پروژه خود استفاده کنید که قبل از آن، کدنویسی ملکه ذهن شما شده باشد. برای کسب درآمد از طریق برنامه‌نویسی مراحل زیر باید سپری شوند:

  • یادگیری (از هر طریقی که دوست دارید مانند کتاب، ویدئو، فایل صوتی و غیره)
  • تکرار و تمرین زیاد و متنوع به صورت علمی و عملی
  • تبدیل آموخته‌ها به ملکه ذهن
  • کسب تجربه
  • شروع فعالیت تجاری هدفمند

 

منابع

1. ویکیپدیا، خط زمان زبانهای برنامهنویسی

2. ویکیپدیا، برنامهنویسی شیءگرا

3. فهم و اعمال چند ریختی در پیاچپی


«وب مستر عزیز، کپی برداری از مطالب این سایت با ذکر منبع و لینک به سایت بلامانع است. در غیر اینصورت لطفاً از کپی‌برداری خودداری فرمایید. با تشکر»


مؤلف:
بازدید: 14394
تاریخ:

برنامه‌نویسی شی‌گرا واقعاً عالیه

2016:05:07 00:09


نام: * کد امنیتی: *
دیدگاه شما: *


وب سایت:
ایمیل: پنهان باشد
تلگرام: پنهان باشد
موبایل: پنهان باشد
جنسیت: آقا خانم اعلام نمی‌کنم
رنگ‌بندی: بنفش قرمز آبی سبز طلایی
  • درج کدهای HTML ممنوع است.
  • از ارسال تکراری خودداری فرمایید.
  • بهتر است با حروف پارسی دیدگاه خود را تایپ کنید.
  • به منظور کنترل و مدیریت محتوا، در صورت اضطرار، حق ویرایش و یا حذف نظر برای مدیریت محفوظ است.