PHP یکی از پرکاربردترین زبانهای برنامه نویسی حوزه وب است که به توسعه دهندگان اجازه میدهد تا وبسایتها و وب اپلیکیشنهای پویا ایجاد کنند. یکی از مهمترین ویژگیهای PHP قابلیت برنامه نویسی شی گرا در این زبان است که موجب سادهسازی ساختار کد، بهبود قابلیت استفاده مجدد و افزایش انعطاف پذیری برنامه میشود. شی گرایی در PHP نوع نگاه توسعه دهندگان به مقوله ساخت برنامههای مبتنی بر این زبان را متحول کرده است. بر همین اساس در مطلب پیشرو از مجله فرادرس سعی خواهیم کرد تا ابتدا شما را با مفاهیم بنیادی شی گرایی در PHP آشنا کنیم.
با مطالعه این مطلب با مفاهیم کلیدی شی گرایی نظیر تعریف کلاس، شی، متدها، توابع سازنده کلاس و بسیاری نکات مهم دیگر در این حوزه آشنا خواهید شد. در این مطلب سعی شده است تا با ارائه مثالهای عملی درک درستی از نحوه عملکرد برنامه نویسی شی گرا در PHP به شما داده شود.
شی گرایی در PHP چیست؟
«برنامه نویسی شی گرا» (Object-Oriented Programming | OOP) یک الگوی برنامه نویسی است که با مدلسازی موجودیتهای برنامه نویسی در قالب اشیا با استفاده از کلاسهای مختلف به دنبال نزدیک ساختن دنیای برنامه نویسی به عناصر موجود در دنیای واقعی است.
امروزه برنامه نویسی شی گرا یکی از محبوبترین پارادایمهای برنامه نویسی است و بیشترین استفاده را نیز در زبان برنامه نویسی PHP دارد. بیشتر فریمورکها و سیستمهای مدیریت محتوای مبتنی بر PHP مانند لاراول، دروپال، سیمفونی، CodeIgniter و سایر موارد از شیگرایی در هسته اصلی خود استفاده میکنند. شیگرایی در PHP خوانایی، قابلیت نگهداری و استفاده مجدد کد را بهبود میبخشد. شی گرایی در PHP به منظور ارتباط برنامه نویسی با دنیای واقعی تمام مولفههای موجود در برنامه را به عنوان موجودیت یا شی در نظر میگیرد و هر شی نیز ویژگیها و رفتارهای مختص خود را دارد. بنابراین، مفهوم کلاس و شی در این سبک برنامه نویسی به منظور مدلسازی یک برنامه کاربردی مورد استفاده قرار میگیرد. در واقع، کلاسها نقشه ساخت اشیا در برنامه هستند.
منظور از کلاس php چیست؟
کلاس در PHP یک طرح اولیه برای ساخت شی را مشخص میکند. در واقع ساختار، ویژگیها و رفتار اشیا توسط کلاس مشخص میشوند. کلاسها برای ایجاد اشیایی استفاده میشوند که ویژگیها و رفتارهای مشترک دارند. در نتیجه، با استفاده از کلاس توسعه دهندگان قادر خواهند بود که دادهها و رفتار شی را در بلوکهای کد با قابلیت استفاده مجدد محصور کنند. برای ساخت کلاس در PHP باید از کلمه کلیدی class استفاده کرد. قطعه کد زیر نحوه تعریف کلاس در PHP را نشان میدهد.
1<?php
2class User {
3
4}
5?>
در مثال بالا کلاس User
با استفاده از کلمه کلیدی class تعریف شده است. در ادامه با تعیین فیلدها و متدهای این کلاس پیادهسازی آن را کامل خواهیم کرد. پیشتر در مطلب زیر از مجله فرادرس مفهوم کلاس در برنامه نویسی بهطور کامل همراه با مثالهای عملی مورد بررسی قرار گرفته است.
تعریف فیلدهای کلاس در PHP
فیلدهای کلاس همان خصوصیتها و ویژگیهای اشیا هستند. PHP امکان افزودن این خصوصیات به کلاس را میدهد. فیلدهای کلاس در قالب متغیرهایی درون بدنه کلاس تعریف میشوند و میتوانند در داخل و خارج از کلاس مورد استفاده قرار گیرند. در قطعه کد زیر نحوه تعریف فیلد برای کلاس User
نشان داده شده است.
1class User {
2 public $name = 'John Sanders';
3 public $age = 25;
4 protected $email = '[email protected]'
5 private $ssn = '123-45-6789';
6}
در مثال بالا فیلدهای $name
و $age
با سطح دسترسی public تعریف شدهاند. همچنین، فیلد $email
با سطح دسترسی protected و فیلد $ssn
با سطح دسترسی private تعریف شده است.
منظور از سطوح دسترسی در PHP چیست؟
تمام فیلدهای کلاس در PHP با پیشوندهای public ،private و protected قابل تعریف هستند. بهطور کلی سطوح دسترسی در PHP به صورت زیر تعریف میشوند.
- «عمومی» (public): فیلدهای تعریف شده با این سطح دسترسی در داخل و خارج از کلاس قابل دسترسی هستند.
- «محافظت شده» (protected): فیلدهای تعریف شده با سطح دسترسی protected در داخل کلاسی که تعریف شدهاند و سایر کلاسهای ارثبری شده از این کلاس قابل استفاده هستند.
- «خصوصی» (private): این فیلدها تنها در داخل کلاسی که تعریف شدهاند قابلیت استفاده دارند.
تعریف متدهای کلاس در PHP
متدهای کلاس در PHP توابعی هستند که رفتار اشیا پیادهسازی شده از کلاس را مشخص میکنند. کلاسها در PHP محدودیتی از نظر تعریف متد ندارند. تعریف متدهای کلاس تفاوت چندانی با تعریف تابع در PHP ندارد. قطعه کد زیر نحوه تعریف متدهای کلاس را نشان میدهد.
1class User {
2 // same as above...
3 function greet() {
4 echo 'Hello, ' . $this->name . ' and welcome to the site!';
5 }
6}
در مثال بالا متد greet()
تعریف شده است که پیام خوش آمدگویی به کاربر را در خروجی چاپ میکند. سطوح دسترسی برای متدهای کلاس همانند فیلدها قابل تعریف است. برای این منظور کافی است تا با توجه به نوع دسترسی از کلمات کلیدی public ،protected و private استفاده کنید. در مثال زیر ۲ متد دیگر برای کلاس User با سطوح دسترسی public و private تعریف شده است.
1class User {
2 // same as above...
3
4 public function getSSN() {
5 return $this->ssn;
6 }
7
8 private function setSSN($ssn) {
9 $this->ssn = $ssn;
10 }
11}
در مثال بالا کلمه کلیدی $this
برای دسترسی به فیلدها و متدهای داخلی کلاس مورد استفاده قرار میگیرد. به عنوان مثال، برای دسترسی به مشخصه $age
باید از $this->$age
استفاده کرد.
تقویت برنامه نویسی PHP با فرادرس
تبدیل شدن به یک برنامهنویس حرفهای PHP نیازمند ترکیبی از آموزش، تمرین و تجربه واقعی است. برای حرفهای شدن در این حوزه بعد از یادگیری اصول و مفاهیم اولیه برنامه نویسی باید به سراغ یادگیری مفاهیم پیشرفتهتری همچون فریمورکهای PHP، پایگاه دادههای مختلف، الگوهای طراحی و سایر فناوریهای کاربردی بروید. بنابراین، برای تقویت دانش برنامه نویسی خود در این حوزه باید دورههای آموزشی حرفهای تری را ببینید.
بر همین اساس میتوانید از دورههای آموزشی تخصصی PHP موجود در سایت فرادرس استفاده کنید. مشاهده این دورههای آموزشی مهارتهای شما برای حضور فعال در بازار کار PHP را افزایش میدهد. در ادامه چند مورد از آموزشهای تخصصی PHP فرادرس به شما پیشنهاد شده است.
به منظور مشاهده فهرست کامل آموزشهای PHP فرادرس میتوانید از لینک زیر استفاده کنید.
شی در php به چه معنا است؟
اشیا یکی از مفاهیم اساسی در برنامه نویسی شی گرا هستند. توسعه دهندگان با استفاده از اشیا میتوانند موجودیتهای دنیای واقعی و رفتار آنها را در یک برنامه مدلسازی کنند. در بخش قبلی با مفهوم کلاس آشنا شدیم و دانستیم که کلاس طرح یا نقشه ساخت شی را مشخص میکند. بنابراین، یک شی نمونهای پیادهسازی شده از یک کلاس است و ویژگیها و رفتارهای آن در قالب تعریف کلاس مشخص میشود. برای استفاده از کلاس باید یک شی جدید از آن ایجاد کرد. قطعه کد زیر نحوه ایجاد شی از کلاس User را نشان میدهد.
در مثال بالا شی $user1
به عنوان یک نمونه از کلاس User
با استفاده از کلمه کلیدی new
پیادهسازی شده است. برای دسترسی به فیلدها و متدها شی ساخته شده از کلاس به صورت زیر میتوان عمل کرد.
1echo $user->name . ' is ' . $user->age . ' years old.';
2echo "<br>";
3echo $user->greet();
4echo "<br>";
5echo $user->getSSN();
6echo "<br>";
در مثال بالا از علامت ->
برای دسترسی به مشخصهها و توابع شی user
استفاده شده است. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
John Sanders is 25 years old. Hello, John Sanders and welcome to this site! 123-45-6789
کلاس ایجاد شده در این بخش مقیاس پذیر نیست، زیرا تمام اشیا پیادهسازی شده از این کلاس دارای مشخصههای یکسانی هستند. در ادامه این بخش نحوه پویا کردن کلاس در PHP با استفاده از تابع سازنده توضیح داده خواهد شد. پیشتر در مطلب زیر از مجله فرادرس مفهوم شی در برنامه نویسی به زبان ساده مورد بررسی قرار گرفته است.
تابع سازنده کلاس در PHP
تابع «سازنده» (Constructor) در کلاس به منظور مقداردهی اولیه اشیا جدید ساخته شده از کلاس مورد استفاده قرار میگیرد. برای این منظور زبان PHP متد __construct
را ارائه میدهد. در ادامه نحوه پیادهسازی متد سازنده برای کلاس User
آورده شده است.
1class User {
2 public $name;
3 public $age;
4 public $email;
5 private $ssn;
6
7 function __construct($name, $age, $email, $ssn) {
8 $this->name = $name;
9 $this->age = $age;
10 $this->email = $email;
11 $this->ssn = $ssn;
12 }
13
14 function greet() {
15 echo 'Hello, ' . $this->name . ' and welcome to the site!';
16 }
17
18 public function getSSN() {
19 return $this->ssn;
20 }
21
22 private function setSSN($ssn) {
23 $this->ssn = $ssn;
24 }
25}
کد ارائه شده در بالا با پیادهسازی متد سازنده کلاس User
را به حالت پویا درآورده است، زیرا هر شی در زمان ایجاد باید مشخصههای اصلی خود یعنی name
، age
و ssn
را وارد کند. نحوه ایجاد شی از کلاس با متد سازنده به صورت زیر خواهد بود.
1$user1 = new User('Akanni William', 35, "[email protected]", '123-45-6789');
2
3$user2 = new User('Alabi Brandon', 25, "[email protected]", '987-65-4321');
4
5echo $user1->name . ' is ' . $user1->age . ' years old.';
6echo "<br>";
7echo $user1->greet();
8echo "<br>";
9echo $user1->getSSN();
10
11echo "<br>";
12echo "<br>";
13
14echo $user2->name . ' is ' . $user2->age . ' years old.';
15echo "<br>";
16echo $user2->greet();
17echo "<br>";
18echo $user2->getSSN();
در مثال ارائه شده در بالا ۲ شی با نامهای $user1
و $user2
از کلاس User
ایجاد شدهاند. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Akanni William is 35 years old. Hello, Akanni William and welcome to the site! 123-45-6789 Alabi Brandon is 25 years old. Hello, Alabi Brandon and welcome to the site! 987-65-4321
با استفاده از سینتکس ارائه شده در بالا و به لطف متد سازنده در PHP میتوان هر تعداد شی با مشخصات متفاوت از کلاس User
ایجاد کرد. نکته مهم دیگری که باید به آن توجه داشت این است که باید تمام مشخصات تعیین شده برای ایجاد شی جدید از کلاس را وارد کرد. در غیر این صورت برنامه با خطا مواجه خواهد شد.
تابع مخرب کلاس در PHP
تابع «مخرب» (Destructor) یکی از متدهای ضروری کلاس در PHP محسوب میشود. عملکرد تابع مخرب در نقطه مقابل تابع سازنده قرار دارد. در واقع، تابع مخرب قبل از حذف شی فراخوانی میشود و منابع درگیر حافظه را آزاد میکند. این تابع هیچ آرگومانی را به عنوان ورودی نمیپذیرد و مقداری نیز به عنوان خروجی برگشت نمیدهد. قطعه کد زیر نحوه پیادهسازی تابع مخرب کلاس در PHP را نشان میدهد.
1<?php
2
3// define a class named Furniture
4
5class Furniture {
6
7 public $price;
8
9 public $type;
10
11 // constructor of the class
12
13 function __construct($price, $type) {
14
15 $this->price = $price;
16
17 $this->type = $type;
18
19 }
20
21 // destructor of the class
22
23 function __destruct() {
24
25 echo "The price of this furniture is {$this->price}.n";
26
27 echo "The type of this furniture is {$this->type}.n";
28
29 }
30
31}
32
33$sofa = new Furniture("50000", "Sofa");
34
35?>
در مثال ارائه شده در بالا تابع __destruct()
بعد از ایجاد شی به صورت خودکار فراخوانی میشود و منابع حافظه را آزاد میکند. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
The price of this furniture is 50000 The type of this furniture is sofa.
مقایسه اشیا کلاس در PHP
گاهی اوقات نیاز است تا اشیا نمونهسازی شده از کلاس با یکدیگر مقایسه شوند. برای این منظور در زبان PHP میتوان از عملگر برابری (==) یا عملگر برابری دقیق (===) استفاده کرد. قطعه کد زیر پیادهسازی کلاس Numbers
در PHP را نشان میدهد.
1class Numbers {
2 public $num1;
3 public $num2;
4 public $num3;
5
6 function __construct($num1, $num2, $num3) {
7 $this->num1 = $num1;
8 $this->num2 = $num2;
9 $this->num3 = $num3;
10 }
11
12 function add() {
13 return $this->num1 + $this->num2 + $this->num3;
14 }
15
16 function multiply() {
17 return $this->num1 * $this->num2 * $this->num3;
18 }
19
20 function divide() {
21 return $this->num1 / $this->num2 / $this->num3;
22 }
23
24 function subtract() {
25 return $this->num1 - $this->num2 - $this->num3;
26 }
27}
در ادامه اشیا $numbers1
و $numbers2
از این کلاس پیادهسازی شدهاند. همچنین، مقایسه بین این ۲ شی نیز صورت گرفته است.
1echo ($numbers1 == $numbers2) ? 'True' : 'False'; // True
2echo ($numbers1 === $numbers2) ? 'True' : 'False'; // False
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
True False
در مثال بالا نتیجه بررسی برابری ۲ شی $numbers1
و $numbers2
به دلیل برخورداری از مقادیر یکسان برابر True خواهد شد. در نقطه مقابل عملگر برابری دقیق یا (===) زمانی مقدار True برگشت میدهد که هر دو نمونه ایجاد شده از کلاس به یک شی اشاره کنند. با توجه به این که $numbers1
و $numbers2
از یک شی یکسان نمونهسازی نشدهاند. بنابراین، مقایسه این دو با عملگر برابری دقیق مقدار False را برگشت میدهد.
منظور از متدهای زنجیرهای در PHP چیست؟
«متدهای زنجیرهای» (Chaining Method) یکی از مفاهیم شی گرایی در PHP است که به توسعه دهندگان این امکان را میدهد تا چندین متد را به صورت پشت سرهم فراخوانی کنند. استفاده از این قابلیت در PHP به کوتاهتر شدن کد کمک میکند و خوانایی برنامه را نیز بهبود میبخشد.
مثال زیر نحوه استفاده از Chaining Method در PHP را به خوبی نشان میدهد.
1class Twita {
2 function __construct(public $username, public $offlineStatus)
3 {
4 $this->username = $username;
5 $this->offlineStatus = $offlineStatus;
6 }
7
8 function login(){
9 echo "Welcome, " . $this->username . " to your account ";
10 echo "<br>";
11 return $this;
12 }
13
14 function logout(){
15 echo $this->username . "has logged out";
16 echo "<br>";
17 return $this;
18 }
19
20 function setOnlineStatus(){
21 $this->offlineStatus = false;
22 echo $this->username. "is now online";
23 echo "<br>";
24 return $this;
25 }
26
27 function setOfflineStatus(){
28 $this->offlineStatus = true;
29 echo $this->username. "is now offline";
30 echo "<br>";
31 return $this;
32 }
33}
در مثال بالا کلاس Twita
با فیلدهای username
و offlineStatus
تعریف شده است. همچنین، این کلاس دارای ۴ متد login()
، logout()
، setOnlineStatus()
و setOfflineStatus()
است که هدف اصلی آن نیز مدیریت ورود و خروج کاربر به حساب کاربری است. به منظور زنجیرهای کردن متدها این کلاس کافی است تا از علامت ->
استفاده کنید. قطعه کد زیر نحوه زنجیرهای کردن متدهای این کلاس را نشان میدهد.
1$twit = new Twita('Abolade William', true);
2$twit->login()->setOnlineStatus()->logout()->setOfflineStatus();
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Welcome, Abolade William to your account Abolade William is now online Abolade William has logged out Abolade William is now offline
نکته مهم در خصوص متدهای زنجیرهای این است که تمام متدهای کلاس در تعریف خود باید مقدار $this
را برگشت دهند.
ثابت های جادویی کلاس در PHP
در زبان برنامه نویسی PHP مقادیر از پیش تعریف شدهای تحت عنوان «ثابت» (Constant) وجود دارند. مقادیر ثابتها در حین اجرای اسکریپت PHP تغییر نمیکند. در این بین چند ثابت جادویی در زبان PHP وجود دارد که با توجه به مکان استفاده مقادیر متفاوتی را برگشت میدهند. ثابتهای جادویی PHP در زمان کار با کلاسها بسیار مورد استفاده قرار میگیرند. مهمترین ثابتهای زبان PHP عبارتند از:
- CLASS: این ثابت نام کلاسی را برمیگرداند که در آن تعریف شده است.
- FILE: مسیر کامل و نام فایلی که در آن استفاده میشود را برمیگرداند.
- LINE: این ثابت شماره خط کنونی مورد استفاده را برگشت میدهد.
- METHOD: این ثابت نیز نام متد مورد استفاده را به همان شکل تعریف شده برمیگرداند.
برای درک بهتر مفهوم ثابتهای جادویی کلاس در PHP مثال زیر ارائه شده است.
1Class Vehicle {
2 public $name;
3 public $color;
4 public $price;
5 public $brand;
6
7 function __construct($name, $color, $price, $brand) {
8 $this->name = $name;
9 $this->color = $color;
10 $this->price = $price;
11 $this->brand = $brand;
12 }
13
14 public function getClassConstant(){
15 echo "Name of class is: " .__CLASS__ . "<br>";
16 }
17
18 public function getFileConstant(){
19 echo "Full path of file is: " . __FILE__ . "<br>";
20 }
21
22 public function getLineConstant(){
23 echo "Line of code is: " . __LINE__ . "<br>";
24 }
25
26 public function getMethodConstant(){
27 echo "Name of method is: " . __METHOD__ . "<br>";
28 }
29}
در مثال بالا کلاس Vehicle
با فیلدهای $name
، $color
، $price
و $brand
تعریف شده است. همچنین، این کلاس دارای ۴ متد است که هر کدام از آنها یکی از ثابتهای جادویی کلاس را بر میگردانند. در ادامه یک شی از این کلاس ایجاد شده است و متدهای تعریف شده در آن نیز فراخوانی شدهاند.
1$vehicle = new Vehicle('Lexus', 'Black', 100000, 'Lexus');
2$vehicle->getClassConstant();
3$vehicle->getFileConstant();
4$vehicle->getLineConstant();
5$vehicle->getMethodConstant();
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Name of class is: Vehicle Full path of file is: C:xampphtdocsoop-tutindex.php Line of code is: 232 Name of method is: Vehicle::getMethodConstant
در خروجی ارائه شده در بالا مقدار ثابتهای جادویی تعریف شده در کلاس چاپ شده است. این ثابتها به طور گسترده در ساخت ابزارهای توسعهدهنده مورد استفاده قرار میگیرند.
مفاهیم بنیادی شی گرایی در PHP
برنامه نویسی شی گرا یک الگوی برنامه نویسی است که سعی در مدلسازی مولفههای برنامه نویسی دارد. هدف اصلی این روش سادهتر کردن درک مفاهیم برنامه نویسی از طریق نزدیک ساختن عناصر موجود در آنها به دنیای واقعی است.
در این سبک برنامه نویسی تمام عناصر برنامه از طریق کلاسها و اشیا مدلسازی میشوند. علاوه بر اشیا و کلاسها شی گرایی در PHP بر پایه چند اصل اساسی استوار است که در ادامه فهرست شدهاند:
- کپسوله سازی
- وراثت
- چندریختی
- تجرید
در ادامه این بخش از نوشته به بررسی هر کدام از این موارد خواهیم پرداخت.
کپسوله سازی در PHP چیست؟
«کپسوله سازی» (Encapsulation) یکی از مفاهیم بنیادین شی گرایی در PHP است. این مفهوم به ترکیب دادهها و عملکردهای شی در قالب یک واحد مجزا تحت عنوان کلاس اشاره دارد که دسترسی مستقیم به فیلدها و متدها را محدود میکند. استفاده از رویکرد کپسوله سازی قابلیت استفاده مجدد، خوانایی و قابلیت نگهداری کد را به طرز محسوسی بهبود میبخشد.
با استفاده از کلاسها در PHP میتوان مفهوم کپسوله سازی را پیادهسازی کرد. به عنوان مثال، در فرایند توسعه فروشگاه اینترنتی با PHP میتوان کلاسی برای مدیریت احراز هویت کاربران و کلاس دیگری به منظور مدیریت پرداختها در برنامه پیادهسازی کرد. این مورد به چندین توسعه دهنده بدون هیچ گونه مشکلی اجازه همکاری در یک پروژه واحد را میدهد و هر کدام میتوانند بخش خاصی از کد را پیادهسازی کنند.
وراثت در PHP چیست؟
وراثت یکی دیگر از پایههای اصلی شی گرایی در PHP است که به توسعه دهندگان اجازه ایجاد کلاس جدید بر مبنای کلاس قبلی را میدهد. با استفاده از این مفهوم میتوان از فیلدها و متدهای موجود در یک کلاس دوباره استفاده کرد. کلاس ارثبری شده از کلاس اصلی در اصطلاح «کلاس فرزند» (child class) یا «زیر کلاس» (sub class) نامیده میشود. به لطف استفاده از مفهوم وراثت در PHP توسعه دهندگان در زمان توسعه به کدهای کمتری برای پیادهسازی برنامه نیاز دارند. اگر قصد یادگیری مباحث موجود در زبان PHP از طریق انجام تمرینها و مثالهای مختلف را دارید میتوانید از فیلم آموزش برنامه نویسی PHP فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
برای درک بهتر مفهوم وراثت در PHP حالتی را در نظر بگیرید که در حال توسعه یک وبسایت فروشگاهی هستید. در زمان توسعه به کلاسی با نام Product
برای ساخت محصولات فروشگاه نیاز دارید. این کلاس دارای فیلدهای name
، price
، description
و image
است. همچنین، متدهایی با نامهای formatPrice
و addToCart
نیز دارد. قطعه کد زیر نحوه پیادهسازی این کلاس را نشان میدهد.
1class Product {
2 public $name;
3 public $price;
4 public $desc;
5 public $image;
6
7 function __construct($name, $price, $desc, $image) {
8 $this->name = $name;
9 $this->price = $price;
10 $this->desc = $desc;
11 $this->image = $image;
12}
13 final function formatPrice(){
14 return "$". $this->price . "<br>";
15 }
16 public function addToCart(){
17 return $this->name . " has been added to cart <br> <br>";
18 }
19}
با استفاده از کلاس Product
میتوان چندین کلاس دیگر را نیز ارثبری کرد. در ادامه نحوه ارثبری چند کلاس دیگر از کلاس Product
نشان داده شده است.
1class Laptop extends Product {
2 public $cpu;
3 public $ram;
4 public $storage;
5
6 function __construct($name, $price, $desc, $image, $cpu, $ram, $storage) {
7 parent::__construct($name, $price, $desc, $image);
8 $this->cpu = $cpu;
9 $this->ram = $ram;
10 $this->storage = $storage;
11 }
12
13 public function addToCart(){
14 return $this->name . " has been overidden <br> <br>";
15 }
16
17 public function formatLaptopSpecs(){
18 return $this->name . "<br>" . "i" . $this->cpu . " Processor <br>" . $this->ram . "GB RAM <br>" . $this->storage . "GB SSD <br> <br>";
19
20 }
21}
22
23class Phone extends Product {
24 public $os;
25 public $ram;
26 public $storage;
27
28 function __construct($name, $price, $desc, $image, $os, $ram, $storage) {
29 parent::__construct($name, $price, $desc, $image);
30 $this->os = $os;
31 $this->ram = $ram;
32 $this->storage = $storage;
33 }
34
35 public function formatPhoneSpecs(){
36 return $this->name . "<br>" . $this->os . "<br>" . $this->ram . "GB RAM <br>" . $this->storage . "GB <br> <br>";
37
38 }
39}
40
41class TV extends Product {
42 public $screenSize;
43 public $resolution;
44 public $refreshRate;
45
46 function __construct($name, $price, $desc, $image, $screenSize, $resolution, $refreshRate) {
47 parent::__construct($name, $price, $desc, $image);
48 $this->screenSize = $screenSize;
49 $this->resolution = $resolution;
50 $this->refreshRate = $refreshRate;
51 }
52
53 public function formatTVSpecs(){
54 return $this->name . "<br>" . "Screen Size: " . $this->screenSize . "<br>" . "Resolution: " .$this->resolution . "<br>" . "Refresh Rate: " .$this->refreshRate . "<br> <br>";
55 }
56}
قطعه کد بالا نحوه ایجاد ۳ محصول جدید با استفاده از ارثبری کلاس Product
را نشان میدهد. با استفاده از کلمه کلیدی extends میتوان کلاسهای جدیدی را از کلاس والد ارثبری کرد. نکته مهم در خصوص کلاسهای ارثبری شده این است که این کلاسها علاوه بر داشتن فیلدها و متدهای کلاس والد قابلیت تعریف فیلد و متد به صورت جداگانه برای خود را نیز دارند. مثال زیر نحوه ایجاد شی جدید از کلاسهای ارثبری شده را نشان میدهد.
1$tv = new TV('LG TV', 1000, 'A TV', 'image.jpg', '55"', '4K', '60Hz');
2echo $tv->formatTVSpecs();
3echo $tv->addToCart();
4
5$phone = new Phone('iPhone 12', 1000, 'A phone', 'image.jpg', 'iOS', 8, 256);
6echo $phone->formatPhoneSpecs();
7echo $phone->addToCart();
8
9$laptop = new Laptop('Macbook Pro', 1000, 'A laptop', 'image.jpg', '5', 16, 512);
10echo $laptop->formatLaptopSpecs();
11echo $laptop->addToCart();
در مثال بالا ۳ شی جدید از کلاسهای ارثبری شده TV
، Phone
و Laptop
ایجاد شده است. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
LG TV Screen Size: 55" Resolution: 4K Refresh Rate: 60Hz LG TV has been added to cart iPhone 12 iOS 8GB RAM 256GB iPhone 12 has been added to cart Macbook Pro i5 Processor 16GB RAM 512GB SSD Macbook Pro has been overidden
استفاده از وراثت در PHP چه مزایایی دارد؟
مهمترین مزیت استفاده از وراثت در PHP فراهم آوردن قابلیت استفاده مجدد از کد است. وراثت به توسعه دهندگان امکان میدهد تا با ایجاد کلاسهای جدید فیلدها و متدهای کلاسهای موجود را ارثبری کنند. در نتیجه، امکان استفاده مجدد از کد برای توسعه دهندگان وجود خواهد داشت. این قابلیت موجب صرفهجویی در زمان میشود، زیرا توسعه دهندگان نیازی به نوشتن دوباره کد ندارند. علاوه بر این، مفهوم وراثت در شی گرایی نگهداری کد را نیز آسانتر میکند، زیرا در صورت بروز اشکال در کلاس والد تنها با یک مرتبه اصلاح تمام کلاسهای فرزند ارثبری شده نیز به صورت خودکار اصلاح میشوند. وراثت ساختار کلاس را به صورت سلسله مراتبی شکل میدهد که در نتیجه درک و سازماندهی کد را آسانتر میکند. استفاده از رابطه والد-فرزندی در کلاسها به دستهبندی راحتتر آنها کمک میکند. در نهایت، وراثت این امکان را به توسعه دهندگان میدهد تا بدون تغییر کد موجود ویژگیها و عملکردهای جدیدی را به برنامه خود اضافه کنند.
منظور از چندریختی در PHP چیست؟
«چندریختی» (Polymorphism) یکی دیگر از ستونهای اصلی شی گرایی در PHP است. کلمه پلی مورفیسم یک واژه یونانی به معنای «داشتن چندین شکل و فُرم مختلف» است. این مفهوم اساسی در شی گرایی به اشیا کلاسهای مختلف این امکان را میدهد تا در عین حفظ رفتار منحصر به فرد خود به جای یکدیگر استفاده شوند. چندریختی به توسعه دهندگان امکان میدهد تا کدهایی انعطافپذیرتر، ماژولار و با قابلیت نگهداری آسان بنویسند.
در زبان برنامه نویسی PHP با استفاده از کلاسهای انتزاعی یا اینترفیسها میتوان چندریختی را پیادهسازی کرد. چندریختی به توسعه دهندگان این امکان را میدهد تا به جای نوشتن کدهای جداگانه برای هر کلاس کدهای مشترک قابل استفاده در همه کلاسها را بنویسند. بنابراین، چندریختی ضمن کاهش میزان کدهای نوشته شده برنامه را کارآمدتر میکند و قابلیت نگهداری آن را نیز بهبود میبخشد.
منظور از اعضای استاتیک کلاس در PHP چیست؟
زبان برنامه نویسی PHP به توسعه دهندگان این امکان را میدهد تا با استفاده از کلمه کلیدی static فیلدها و متدهایی را محدود به کلاس تعریف کنند. در واقع، فیلدها و متدهای static تعریف شده به اشیا ساخته شده از کلاس ارتباطی ندارند و توسط خود کلاس قابل استفاده هستند. در ادامه این بخش نحوه تعریف فیلدها و متدهای static برای کلاس توضیح داده شده است. به منظور یادگیری موضوعات بیشتر در حوزه برنامه نویسی PHP میتوانید فیلم آموزش پروژه محور طراحی سایت فروشگاهی با PHP فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
چگونه یک فیلد استاتیک برای کلاس در PHP تعریف کنیم؟
فیلدهای استاتیک ساخته شده از کلاس تنها توسط خود کلاس قابل دسترسی هستند و اشیا نمونهسازی شده از کلاس به این فیلدها دسترسی ندارند. به عنوان مثال، قطعه کد زیر تعداد دفعات استفاده از کلاس User
را نشان میدهد.
1class User {
2 public $name;
3 public $email;
4 public $password;
5
6 function __construct($name, $email, $password) {
7 $this->name = $name;
8 $this->email = $email;
9 $this->password = $password;
10 }
11 static $usersCount = 0;
12}
در مثال بالا فیلد $usersCount
با استفاده از کلمه کلیدی static در بدنه کلاس User
تعریف شده است. برای دسترسی به مقدار فیلدهای استاتیک در برنامه میتوان از سینتکس زیر استفاده کرد.
با توجه به سینتکس ارائه شده در بالا ابتدا باید نام کلاس قرار گیرد و بعد از قرار دادن علامت ::
باید نام فیلد استاتیک قرار داده شود. در ادامه نحوه استفاده از فیلد استاتیک در برنامه آورده شده است.
1$user = new User('Abolade William', '[email protected]', 'password');
2echo User::$usersCount; // 0
خروجی حاصل از اجرای قطعه کد بالا نیز به صورت زیر خواهد بود.
0
چگونه متد استاتیک برای کلاس در PHP تعریف کنیم؟
متدهای استاتیک در PHP نیز همانند فیلدهای استاتیک تنها توسط کلاس قابل دسترسی هستند و اشیا ساخته شده از کلاس امکان دسترسی به این متدها را ندارند. برای تعریف متد استاتیک کافی است تا قبل از نام متد کلمه کلیدی static را قرار دهید. قطعه کد زیر نحوه تعریف متد استاتیک برای کلاس User را نشان میدهد
1class User {
2 // same as above...
3
4 static function updateUsersCount(){
5 self::$usersCount++;
6 return self::$usersCount . " users registered";
7 }
8}
در مثال بالا متد updateUsersCount()
از نوع استاتیک تعریف شده است. این متد در هر مرتبه ایجاد شی از کلاس User
مقدار فیلد استاتیک usersCount
را یک واحد افزایش میدهد. در ادامه نحوه فراخوانی این متد در برنامه آورده شده است.
1$user = new User('Abolade William', '[email protected]', 'password');
2echo User::updateUsersCount(); // 1 users registered
3echo User::$usersCount; // 0
نحوه دسترسی به متدهای استاتیک کلاس مشابه دسترسی به فیلدهای استاتیک است.خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
1
از فیلدها و متدهای استاتیک به منظور انجام عملیات مختلف بر روی کلاسها مستقل از اشیا نمونهسازی شده میتوان استفاده کرد.
کلاس انتزاعی یا Abstract Class در PHP چیست؟
در زبان PHP کلاس «انتزاعی» (Abstract) به کلاسی اشاره دارد که به صورت مستقیم شی از آن ساخته نمیشود، ولی این کلاس به عنوان الگویی جهت ارثبری سایر کلاسها مورد استفاده قرار میگیرد. کلاسهای انتزاعی در PHP توسط کلاسهای فرعی گسترش مییابند که این کلاسها نیز باید متدهای انتزاعی تعریف شده در کلاس انتزاعی را پیادهسازی کنند. به زبان ساده کلاسهای انتزاعی در PHP به توسعه دهندگان امکان میدهند تا کلاسهایی با توابع تعریف کنند که هنوز این توابع پیادهسازی نشدهاند. پیادهسازی این توابع توسط کلاسهایی صورت میپذیرد که از کلاس انتزاعی ارثبری میکنند. پیشتر در مطلب زیر از مجله فرادرس کلاس Abstract در برنامه نویسی به زبان ساده توضیح داده شده است.
چگونه یک کلاس انتزاعی در PHP تعریف کنیم؟
برای تعریف کلاس انتزاعی در PHP از کلمه کلیدی abstract قبل از نام کلاس باید استفاده کرد. همچنین، این کلمه کلیدی در ابتدای تعریف متدهای انتزاعی کلاس نیز قرار میگیرد. مثال زیر نحوه تعریف پیادهسازی کلاس انتزاعی در PHP را نشان میدهد.
1abstract class Product {
2 public $name;
3 public $price;
4 public $desc;
5 public $image;
6
7 function __construct($name, $price, $desc, $image) {
8 $this->name = $name;
9 $this->price = $price;
10 $this->desc = $desc;
11 $this->image = $image;
12 }
13
14 public function addToCart(){
15 return $this->name . " has been added to cart <br> <br>";
16 }
17
18 abstract function formatSpec();
19}
در مثال بالا کلاس انتزاعی Product
به همراه متد انتزاعی formatSpec
تعریف شده است. با توجه به نکات عنوان شده امکان ساخت شی از کلاس انتزاعی Product
به صورت مستقیم وجود ندارد. در این شرایط باید کلاس جدیدی ایجاد کرد که از کلاس Product
ارثبری کند و متدهای آن را گسترش دهد. قطعه کد زیر پیادهسازی کلاس Laptop
را نشان میدهد که از کلاس Product
ارثبری میکند.
1class Laptop extends Product {
2 public $cpu;
3 public $ram;
4 public $storage;
5
6 function __construct($name, $price, $desc, $image, $cpu, $ram, $storage) {
7 parent::__construct($name, $price, $desc, $image);
8 $this->cpu = $cpu;
9 $this->ram = $ram;
10 $this->storage = $storage;
11 }
12
13 public function formatSpec(){
14 return $this->name . "<br>" . "i" . $this->cpu . " Processor <br>" . $this->ram . "GB RAM <br>" . $this->storage . "GB SSD <br> <br>";
15 }
16}
در مثال بالا متد انتزاعی formatSpec()
توسط کلاس Laptop
پیادهسازی میشود.
اینترفیس در PHP چیست؟
اینترفیس در PHP مشابه کلاس انتزاعی است با این تفاوت که اینترفیسها فقط میتوانند توابع عمومی داشته باشند و امکان تعریف فیلدها و متدهای پیادهسازی شده برای آنها وجود ندارد. PHP با فراهم کردن امکان تعریف اینترفیس انتزاع را به سطح بالاتری برده است. به زبان ساده اینترفیسها صرفاً شامل چند تابع یا متد بدون پیادهسازی هستند و سایر کلاسها با ارثبری از اینترفیس باید این متدها را پیادهسازی کنند. در ادامه مثالی از تعریف اینترفیس در PHP آورده شده است.
1interface ProductInterface {
2 public function addToCart();
3 public function formatSpec();
4}
در مثال بالا اینترفیس ProductInterface
به همراه متدهای addToCart()
و formatSpec()
تعریف شده است. بنابراین، کلاسهای فرزند این کلاس باید این ۲ متد را پیادهسازی کنند. در ادامه نحوه پیادهسازی اینترفیس ProductInterface
توسط کلاس فرزند ارائه شده است.
1class Phone implements ProductInterface {
2 public $name;
3 public $price;
4 public $desc;
5 public $image;
6 public $os;
7 public $ram;
8 public $storage;
9
10 function __construct($name, $price, $desc, $image, $os, $ram, $storage) {
11 $this->name = $name;
12 $this->price = $price;
13 $this->desc = $desc;
14 $this->image = $image;
15 $this->os = $os;
16 $this->ram = $ram;
17 $this->storage = $storage;
18 }
19
20 public function addToCart(){
21 return $this->name . " has been added to cart <br> <br>";
22 }
23
24 public function formatSpec(){
25 return $this->name . "<br>" . $this->os . "<br>" . $this->ram . "GB RAM <br>" . $this->storage . "GB <br> <br>";
26 }
27}
در قطعه کد بالا کلاس Phone
اینترفیس ProductInterface
را با کلمه کلیدی implements
پیادهسازی کرده است.
Traits در PHP چیست؟
در زبان PHP امکان ارثبری چندگانه وجود ندارد یعنی یک کلاس نمیتواند به صورت همزمان ۲ کلاس والد داشته باشد. برای رفع این مشکل در نسخه 5.4.0 زبان PHP قابلیت Traits معرفی شد. به زبان ساده یک Traits شامل مجموعهای از توابع است که میتوانند بدون نیاز به ارثبری، گسترش یا پیادهسازی کلاس یا اینترفیس مورد استفاده قرار گیرند. تعریف Trait در زبان PHP با استفاده از کلمه کلیدی trait صورت میگیرد. قطعه کد زیر نحوه پیادهسازی Trait در زبان PHP را نشان میدهد.
1trait AllProductsFunctions {
2 public function addBrandLogo(){
3 return "Brand logo added";
4 }
5}
در مثال بالا تنها یک تابع با نام addBrandLogo()
در بدنه Trait تعریف شده است که میتوان از آن در تمام کلاسهای برنامه استفاده کرد. علاوه بر این، امکان تعریف چند تابع دیگر نیز در بدنه Trait وجود دارد. برای استفاده از Trait در سایر کلاسها کافی است از کلمه کلیدی use
قبل از نام Trait استفاده کرد. قطعه کد زیر نحوه استفاده از Trait ایجاد شده در کلاس Phone
را نشان میدهد.
1 class Phone implements ProductInterface {
2// same as before...
3 use AllProductsFunctions;
4// same as before...
5}
در مثال بالا امکان استفاده از توابع موجود در AllProductsFunctions
در تمام اشیا ساخته شده از کلاس Phone
وجود دارد. علاوه بر این، امکان استفاده از چندین Trait در یک کلاس نیز وجود دارد. برای این منظور باید نام Traitها از یکدیگر با کاما جدا شود.
مزایای استفاده از شی گرایی در PHP چیست؟
استفاده از شی گرایی در PHP طیف گستردهای از مزایای مختلف را در اختیار توسعه دهندگان قرار میدهد که به آنها در ساخت و پیادهسازی برنامههای مقیاسپذیر با قابلیت نگهداری و استفاده مجدد کمک شایانی میکند. برخی از مهمترین مزایای استفاده از شی گرایی در PHP به شرح زیر است.
- قابلیت استفاده مجدد کد
- مقیاس پذیری بالا
- کپسوله سازی
- وراثت
- آزمایش پذیری
در ادامه این بخش از نوشته هر کدام از موارد ارائه شده در بالا به طور کامل مورد بررسی قرار گرفتهاند.
قابلیت استفاده مجدد کد
اولین و پیش افتادهترین مزیت استفاده از برنامه نویسی شی گرا در PHP قابلیت استفاده مجدد کد است. منظور از قابلیت استفاده مجدد کد این است که میتوان از بلوکها و توابع پیادهسازی شده در سراسر برنامه و بدون نیاز به بازنویسی تمام کد دوباره استفاده کرد. علاوه بر این، توسعه دهندگان با کمک شی گرایی میتوانند از اشیا ایجاد شده در چندین برنامه استفاده کنند یا در صورت نیاز آنها را چندین مرتبه به کار گیرند. در نتیجه این امر زمان مورد نیاز برای توسعه برنامه کاهش مییابد و کیفیت برنامه نیز بهبود پیدا میکند.
مقیاس پذیری بالا
استفاده از شی گرایی در PHP مقیاس پذیری برنامه را نیز بهبود میبخشد. در نتیجه، به سادگی میتوان با توجه به نیاز قابلیتها و عملکردهای جدیدی را به برنامه افزود. به لطف شی گرایی میتوان عملکردهای جدید را بدون تاثیر بر سایر بخشهای برنامه اضافه کرد. این مورد نگهداری و بروزرسانی برنامهها را آسانتر میکند و در عین حال احتمال بروز خطا و ایجاد باگ در برنامه را نیز کاهش میدهد. علاوه بر این، برنامه نویسی شی گرا در PHP ماژولار کردن کد را آسانتر میکند و به چندین توسعه دهنده امکان کار بر روی بخشهای کد را میدهد.
کپسوله سازی
کپسولهسازی یکی از اصول مهم شی گرایی در PHP است که امنیت و قابلیت نگهداری برنامهها را بهبود میبخشد. با کپسولهسازی میتوان عملکرد داخلی شی مورد نظر را از سایر بخشهای برنامه پنهان کرد. این مورد بدین معنی است که شی فقط از طریق اینترفیس عمومی آن قابل دسترس است. در نتیجه، کپسولهسازی از دسترسی غیرمجاز به سایر بخشهای برنامه جلوگیری میکند. علاوه بر این، کپسولهسازی بروزرسانی عملکرد داخلی شی را بدون تاثیر بر سایر بخشهای کد ممکن میسازد.
وراثت
وراثت یکی دیگر از مفاهیم مهم در برنامه نویسی شی گرا است که به توسعه دهندگان امکان ساخت کلاسهای جدید بر مبنای کلاسهای موجود را میدهد. به واسطه وراثت میتوان ویژگیها و متدهای کلاس والد را به ارث برد و سپس آنها را تغییر یا گسترش داد و عملکرد جدیدی ایجاد کرد. این ویژگی استفاده مجدد از کد را آسانتر میکند و ضمن کاهش «افزونگی» (Redundancy) به ایجاد برنامههای کاربردی کارآمد کمک میکند. علاوه بر این، وراثت موجب ثبات بیشتر برنامه میشود و نگهداری و بروزرسانی کد را آسانتر میکند.
آزمایش پذیری
آخرین مزیت شی گرایی در PHP آسان کردن فرایند تست و اشکالزدایی برنامهها است. با کپسولهسازی کد در اشیا برنامه میتوان بخشهای مختلف کد را از یکدیگر تفکیک کرد و آنها را به صورت جداگانه از سایر بخشها مورد آزمایش قرار داد. این ویژگی سبب میشود که خطاها و اشکالات برنامه سریعتر شناسایی شوند و برطرف کردن آنها نیز آسانتر و بدون تاثیر بر سایر بخشهای برنامه صورت پذیرد. علاوه بر این، شی گرایی پیادهسازی تست خودکار برای برنامه را نیز آسانتر میکند. از این قابلیت برای تست کردن برنامه در مقیاسهای کلانتر میتوان استفاده کرد که در نهایت موجب بهبود عملکرد کلی برنامه میشود.
یادگیری PHP با فرادرس
یادگیری برنامه نویسی شی گرا در PHP یکی از ضروریات نقشه راه برنامه نویسی وب است. توسعه دهندگان به منظور بهبود مهارتهای خود در زمینه توسعه وب باید اصول و مبانی شی گرایی در PHP به خوبی آشنا باشند. نخستین گام در یادگیری شی گرایی آشنایی با اصول برنامه نویسی PHP است که به شما در درک ساختار زبان کمک میکند. در گام بعدی باید به سراغ یادگیری کلاسها و اشیا در PHP بروید، زیرا سنگ بنای برنامه نویسی شی گرایی بر پایه این دو مفهوم کلیدی استوار است. به عنوان گام بعدی نیز باید با مفهوم وراثت در PHP آشنا شوید. درک وراثت به شما امکان میدهد تا بتوانید کلاسهای جدیدی را بر مبنای کلاسهای قبلی ایجاد کنید.
در تکمیل آموختههای قبلی خود نیز میتوانید به سراغ یادگیری مفاهیمی همچون چندریختی در PHP، کلاسهای انتزاعی و سایر موارد بروید. به منظور شروع مسیر یادگیری خود میتوانید از فیلم آموزش رایگان آشنایی با PHP فرادرس استفاده کنید که لینک آن در زیر آورده شده است.
در ادامه اگر میخواهید مفاهیم پایهای شی گرایی در PHP را به طور کامل همراه با مثالها و تمرینات مختلف یاد بگیرید، پیشنهاد میکنیم تا از فیلم آموزش برنامه نویسی PHP فرادرس کمک بگیرید که لینک آن در ادامه آورده شده است.
جمعبندی
رعایت اصول شی گرایی در PHP به طرز قابل توجهی روند توسعه برنامه را بهبود میبخشد. در نتیجه، کیفیت برنامههای ساخته شده نیز افزایش مییابد. توسعه دهندگان با استفاده از مفاهیم پایهای شی گرایی نظیر کلاسها، اشیا و ارثبری میتوانند کدهای ماژولار با قابلیت استفاده مجدد بنویسند و موجودیتهای دنیای واقعی را به طرز موثری مدلسازی کنند. با توجه به اهمیت و کاربردهای فراوان شی گرایی در برنامه نویسی PHP در این مطلب از مجله فرادرس سعی شد تا اصول و مفاهیم پایهای شی گرایی در PHP به طور کامل مورد بررسی قرار گیرد. به منظور تکمیل مسیر یادگیری خود در حوزه برنامه نویسی PHP میتوانید از مجموعه آموزشهای برنامه نویسی PHP فرادرس استفاده کنید که لینک آن در ادامه آورده شده است.
در این مطلب ضمن توضیح مفاهیم اولیه شی گرایی نظیر کلاس، شی، متدها و فیلدهای کلاس سعی شد تا مفاهیم بنیادی شی گرایی همچون وراثت، کپسولهسازی و چندریختی نیز به همراه مثال آموزش داده شود. علاوه بر این، تکنیکهای شی گرایی و برخی مفاهیم کاربردی همچون کلاسهای انتزاعی، اینترفیس و Trait نیز توضیح داده شد.
source