برنامه نویسی شی گرا یا Object-Oriented Programming که به اختصار OOP نیز نامیده میشود، شیوه ای از برنامه نویسی بر پایه ی آبجکت یا شی است. این شیوه به برنامه نویسان امکان میدهد تا کدهایی تمیز، با قابلیت نگهداری بالاتر و اشکال زدایی آسانتر بنویسند. این سبک از برنامه نویسی، شباهت زیادی با مفاهیم دنیای واقعی دارد؛ برای مثال عملکرد مغز، به شیوه ی شی گرایانه است، به این صورت که اطلاعات را از محیط دریافت میکند و پس از پردازش آن ها، واکنش مناسب نشان میدهد. در ادامه با مفاهیم شی گرایی در PHP و مثالهای مختلف آن آشنا میشویم؛ با ما همراه باشید.
مزایای شی گرایی در PHP
برنامه نویسی شی گرا، مزایای بسیاری دارد از جمله، تقسیم کد به بخشهای کوچک تر، سازماندهی و مدیریت کد، عدم نیاز به نوشتن کدهای تکراری، امکان استفاده از کدهای قبلی، امنیت بیشتر برنامه، اشکال زدایی و عیب یابی آسان و سریعتر و... .
شی گرایی در PHP
در اینجا قصد داریم مفاهیم شی گرایی در PHP را به شما آموزش دهیم سپس به بررسی مثال هایی در مورد هر کدام از آنها میپردازیم.
Class (کلاس) - یک نوع داده ی تعریف شده توسط برنامه نویس است که شامل توابع و دادههای محلی است. شما میتوانید یک کلاس را به عنوان الگویی برای ساخت نمونههای بسیاری از همان نوع (یا کلاس) شی در نظر بگیرید.
Object (شی) - آبجکت، یک نمونه ی منفرد از ساختار داده است که توسط یک کلاس تعریف میشود. شما یک کلاس را یک بار تعریف میکنید و سپس آبجکتهای دلخواهتان را به آن تعلق میدهید. اشیاء به عنوان نمونه نیز شناخته میشوند.
Member Variable (متغیرهای عضو) - متغیرهایی هستند که درون یک کلاس تعریف شده اند. این دادهها در خارج از کلاس غیرقابل مشاهده خواهند بود و از طریق توابع عضو میتوان به آنها دسترسی داشت. زمانی که شی ایجاد شود، به این متغیرها صفت شی گفته میشود.
Member function (توابع عضو) - تابع تعریف شده در داخل یک کلاس است و برای دسترسی به دادههای آبجکت استفاده میشود.
Inheritance (وراثت) - هنگامی که یک کلاس با به ارث بردن عملکرد موجود یک کلاس پدر تعریف میشود، آن را وراثت مینامند. یک کلاس فرزند، همه یا تعدادی از توابع و متغیرهای کلاس والد را به ارث میبرد و همچنین میتواند توابع و متغیرهای منحصر به فرد خود را داشته باشد.
Parent class (کلاس والد) - کلاسی که کلاس دیگری از آن به ارث میبرد را کلاس والد مینامند. به این کلاس، کلاس پایه یا فوق کلاس نیز گفته میشود.
Child Class (کلاس فرزند) - کلاسی که از کلاس دیگری ارث می برد را کلاس فرزند مینامند. به این کلاس، زیرکلاس یا کلاس مشتق شده نیز گفته میشود.
Polymorphism (چندریختی) - یک مفهوم شی گرایی است که در آن میتوان از یک عملکرد برای اهداف مختلف استفاده کرد. به عنوان مثال نام تابع یکسان باقی میماند اما تعداد مختلفی از آرگومانها را میگیرد و میتواند کار متفاوتی انجام دهد.
Overloading (سربارگذاری) - نوعی چندریختی است که در آن برخی یا همه ی عملگرها بسته به نوع آرگومانهای خود پیاده سازیهای مختلفی دارند. توابع مشابه نیز میتوانند با اجراهای متفاوت سربارگذاری شوند.
Data Abstraction (انتزاع یا تجرید داده) – انتزاع به برنامه نویس کمک میکند تا جزییات پیاده سازی برنامه را از کاربر پنهان کند. انتزاع باعث میشود تا تنها عملیاتی که با آبجکتهای دیگر برنامه ارتباط دارند، نمایش داده شوند. متدهای انتزاع میتوانند بدنه داشته باشند یا نداشته باشند.
interface (اینترفیس) - اینترفیس همانند انتزاع است، با این تفاوت که متدهای آن بدنه ندارند و کلاسی که اینترفیس را implement کند، ملزم به بازنویسی تمامی متدهای کلاس پدر است. شباهت اینترفیس و انتزاع در این است که از هیچ کدام نمیتوان یک آبجکت ایجاد کرد.
Encapsulation (کپسوله سازی) - به مفهومی گفته میشود که در آن همه ی دادهها و توابع عضو را با هم ترکیب میکنیم تا یک شی جدید را تشکیل دهیم. در کپسوله سازی، دسترسی به اشیاء با استفاده از سطح بندی محدود میشود.
Constructor (سازنده) - به نوع خاصی از تابع گفته میشود که هر زمان یک آبجکت از یک کلاس تشکیل شود، به طور خودکار فراخوانی میشود.
Destructor (مخرب) - به نوع خاصی از تابع گفته میشود که هر زمان که یک آبجکت حذف شود یا از دامنه خارج شود، به طور خودکار فراخوانی میشود.
تعریف class در PHP
کلاس با استفاده از کلمه ی کلیدی class تعریف میشود و به دنبال آن نام کلاس و یک جفت پرانتز {} آورده میشود.
تعریف کلاس در PHP به شرح زیر است. در زیر ما یک کلاس به نام Fruit را با دو ویژگی (name$ و color$) و دو متد ()set_name و ()get_name برای set و get کردن ویژگی name$ ایجاد کرده ایم:
<?php
class Fruit {
// Properties
public $name;
public $color;
// Methods
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
}
?>
تعریف object در PHP
ما میتوانیم از یک کلاس چندین آبجکت ایجاد کنیم. هر شی تمامی ویژگیها و متدهای تعریف شده در کلاس را در خود دارد اما دارای مقادیر مختلفی از ویژگی هاست. آبجکتهای یک کلاس با کلمه ی کلیدی new تعریف میشوند. تعریف آبجکت در PHP به شرح زیر است. در این مثال، apple$ و banana$ نمونههای آبجکت کلاس Fruit هستند.
<?php
class Fruit {
// Properties
public $name;
public $color;
// Methods
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
}
$apple = new Fruit();
$banana = new Fruit();
$apple->set_name('Apple');
$banana->set_name('Banana');
echo $apple->get_name();
echo "<br>";
echo $banana->get_name();
?>
در مثال زیر دو متد دیگر برای set و get کردن ویژگی color$ به کلاس Fruit اضافه کرده ایم.
<?php
class Fruit {
// Properties
public $name;
public $color;
// Methods
function set_name($name) {
$this->name = $name;
}
function get_name() {
return $this->name;
}
function set_color($color) {
$this->color = $color;
}
function get_color() {
return $this->color;
}
}
$apple = new Fruit();
$apple->set_name('Apple');
$apple->set_color('Red');
echo "Name: " . $apple->get_name();
echo "<br>";
echo "Color: " . $apple->get_color();
?>
فراخوانی توابع عضو
پس از ایجاد آبجکت ها، قادر خواهید بود توابع عضو مربوط به آن شی را فراخوانی کنید. یک تابع عضو فقط قادر به پردازش متغیر عضو از شی مرتبط است.
به مثال زیر توجه کنید:
<?php
class Books {
/* Member variables */
var $price;
var $title;
/* Member functions */
function setPrice($par){
$this->price = $par;
}
function getPrice(){
echo $this->price ."<br/>";
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title ." <br/>";
}
}
?>
سپس سه آبجکت مستقل از سه نوع کتاب ایجاد میکنیم:
$physics = new Books;
$maths = new Books;
$chemistry = new Books;
کد زیر، نحوه ی ست کردن عنوان و قیمت این سه کتاب را با فراخوانی توابع عضو نشان میدهد.
اکنون برای ست کردن قیمت و عنوان نیازی به فراخوانی تابع set نداریم. این دو متغیر عضو را فقط در زمان ایجاد شی میتوانیم مقدار دهی اولیه کنیم. مثال زیر را مشاهده کنید:
$physics = new Books( "Physics for High School", 10 );
$maths = new Books ( "Advanced Chemistry", 15 );
$chemistry = new Books ("Algebra", 7 );
/* Get those set values */
$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();
$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();
Physics for High School Advanced Chemistry Algebra 10 15 7
توابع destructor در PHP
مانند یک تابع سازنده، میتوانید یک تابع مخرب را با استفاده از ()destruct__ تعریف کنید. شما میتوانید تمام منابع را با یک مخرب آزاد کنید.
inheritance در PHP
تعریف کلاس فرزند به صورت زیر است. در این مثال، Novel کلاس فرزند و Books کلاس والد است. همان طور که مشاهده میکنید، کلاس فرزند علاوه بر ویژگیهای والد، میتواند ویژگیهای منحصر به فرد خود را نیز داشته باشد.
class Novel extends Books {
var $publisher;
function setPublisher($par){
$this->publisher = $par;
}
function getPublisher(){
echo $this->publisher. "<br />";
}
}
سربارگذاری تابع در PHP
تعاریف تابع در کلاسهای فرزند، با نام مشابه در کلاس والد سربارگذاری میشوند. در یک کلاس فرزند میتوانیم تعریف تابعی که از کلاس والد به ارث برده است را اصلاح کنیم.
در مثال زیر توابع getPrice و getTitle برای برگرداندن مقادیر مورد نظر سربارگذاری میشوند.
function getPrice() {
echo $this->price . "<br/>";
return $this->price;
}
function getTitle(){
echo $this->title . "<br/>";
return $this->title;
}
انواع سطوح دسترسی در کلاس
به طور پیش فرض و در صورت عدم تعیین نوع سطح دسترسی، تمامی خصوصیات و متدهای یک کلاس عمومی یا public هستند.
اگر بخواهید دسترسی اعضای یک کلاس را محدود کنید، اعضای کلاس را خصوصی (private) و یا محافظت شده (protected) تعریف میکنید.
اعضای private
با تعیین یک عضو خصوصی، دسترسی آن را به کلاسی که در آن اعلام شده محدود میکنید. عضو خصوصی نمیتواند از سوی کلاس هایی که از کلاس والد ارث بری میکنند، ارجاع داده شود و در خارج از کلاس قابل دسترسی نیست.
یک عضو کلاس را میتوان با استفاده از کلمه کلیدی private، خصوصی کرد.
در مثال زیر، وقتی کلاس MyClass به کلاس دیگری ارث برده میشود، کلاسهای فرزند، به ()myPublicFunction و driver$ دسترسی دارند اما به myPrivateFunction$ و car$ هیچ گونه دسترسی نخواهد داشت، زیرا آنها خصوصی اعلام شده اند.
class MyClass {
private $car = "skoda";
$driver = "SRK";
function __construct($par) {
// Statements here run every time
// an instance of the class
// is created.
}
function myPublicFunction() {
return("I'm visible!");
}
private function myPrivateFunction() {
return("I'm not visible outside!");
}
}
اعضای protected
ویژگی یا متد محافظت شده در کلاسی که در آن اعلام شده است و همچنین در کلاس هایی که آن کلاس را گسترش میدهند قابل دسترسی است. اعضای محافظت شده خارج از این دو نوع کلاس در دسترس نیستند. با استفاده از کلمه کلیدی protected، میتوان از یک عضو کلاس محافظت کرد.
برای مثال:
class MyClass {
protected $car = "skoda";
$driver = "SRK";
function __construct($par) {
// Statements here run every time
// an instance of the class
// is created.
}
function myPublicFunction() {
return("I'm visible!");
}
protected function myPrivateFunction() {
return("I'm visible in child class!");
}
}
کلاسهای abstract در PHP
کلاس انتزاعی به کلاسی گفته میشود که امکان نمونه سازی و ساخت آبجکت ندارد، بلکه فقط به ارث میرسد بنابراین نمیتواند private باشد. یک کلاس انتزاعی با کلمه ی کلیدی abstract اعلام میشود.
هنگام ارث بری از یک کلاس انتزاعی، تمام متدهایی که در اعلان کلاس والدین به صورت انتزاعی مشخص شده اند، باید توسط فرزند تعریف شوند. علاوه بر این، این متدها باید با همان قابلیت دسترسی تعریف شوند. کلاسهای انتزاعی میتوانند بدنه نداشته و تنها ورودیها را دریافت کنند.
مثال زیر تعریف یک کلاس انتزاعی را نشان میدهد.
abstract class Animal
{
public $name;
public $age;
public function Describe()
{
return $this->name . ", " . $this->age . " years old";
}
abstract public function Greet();
}
نکته: در کلاس انتزاعی میتوان هم از متدهای معمولی استفاده کرد و هم از توابعی از نوع انتزاع که بدنه نداشته باشند.
نکته: باکمک انتزاع، میتوان کلاسهای فرزند را وادار به ساخت برخی آبجکتها کرد.
نحوه ی ارث بری از کلاس انتزاعی تعریف شده در بالا به صورت زیر است.
class Dog extends Animal
{
public function Greet()
{
return "Woof!";
}
public function Describe()
{
return parent::Describe() . ", and I'm a dog!";
}
}
حال میتوانیم از متد ()Greet به صورت زیر آبجکت بسازیم.
نحوه ی ساخت اینترفیس در PHP به صورت زیر است. در این مثال ابتدا یک اینترفیس تعریف شده است که متد درون آن یعنی متد foo بدنه ندارد و اینترفیس بعدی از اینترفیس a مشتق شده است. کلاس c با کلمه ی کلیدی impelemnts از اینترفیس b مشتق شده که درون آن دو تابع تعریف کرده ایم؛ زیرا ملزم هستیم متدهای والد را بازنویسی کنیم.
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// This will work
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
polymorphism در PHP
برای پیاده سازی چندریختی میتوانیم از بین اینترفیس و انتزاع یکی را انتخاب کنیم. به مثال زیر توجه کنید.
interface Shape {
public function calcArea();
}
کلاس circle با فراخوانی متد ()calcArea، مساحت دایره را در خروجی برمی گرداند.
class Circle implements Shape {
private $radius;
public function __construct($radius)
{
$this -> radius = $radius;
}
// calcArea calculates the area of circles
public function calcArea()
{
return $this -> radius * $this -> radius * pi();
}
}
کلاس rectangle در زیر، با فراخوانی متد ()calcArea مساحت مستطیل را بر میگرداند.
class Rectangle implements Shape {
private $width;
private $height;
public function __construct($width, $height)
{
$this -> width = $width;
$this -> height = $height;
}
// calcArea calculates the area of rectangles
public function calcArea()
{
return $this -> width * $this -> height;
}
}
برای مشاهده ی مثالهای بیشتر درباره ی شی گرایی در PHP میتوانید به وب سایت رسمی PHP مراجعه کنید.
جمع بندی:
شی گرایی در PHP، یکی از مهمترین مباحثی است ک برای نوشتن برنامههای حرفه ای به آن نیاز داریم. شی گرایی مزایای فراوانی برای ما به همراه دارد برای مثال میتوانیم برنامههای بزرگ با بخشهای پیچیده را به بخشهای کوچکتری تبدیل کنیم. در پایان نیز تغییر بخشها و همچنین عیب یابی برای ما آسانتر خواهد بود. علاوه بر این میتوانیم هر کدام از بخشها را در برنامههای دیگر به کار ببریم و در زمان صرفه جویی کنیم. در این مقاله با مثال هایی از شی گرایی در PHP آشنا شدیم.
امیدواریم که این مقاله برای شما مفید باشد. شما میتوانید سوالات خود را در بخش نظرات با ما به اشتراک بگذارید.
اگر به یادگیری بیشتر در زمینه ی PHP علاقه داری، با شرکت در دوره ی آموزشی متخصص PHP در کمتر از یک سال به یک متخصص PHP تبدیل میشوی که آماده ی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.