جلسه سیزدهم PHP : آموزش کامل زبان برنامه نویسی پی اچ پی مقدماتی تا پیشرفته (جلسه سوم شی گرایی در پی اچ پی)
در این مقاله از آموزش PHP با جلسه سیزدهم PHP در خدمت شما هستیم. در قسمت قبل دومین جلسهی شی گرایی را سپری کردیم و به مباحثی همچون توابع سازنده و مخرب، ارث بری، همپوشانی توابع و همچنین به تفاوت public ،private و protected در کلاسها پرداختیم. در سومین جلسه از شی گرایی قصد داریم تا با بیان چند نکته مبحث شی گرایی (oop) را به اتمام برسانیم. توجه داشته باشید که مبحث شی گرایی را در 3 جلسه آموزش خواهیم داد. جلسه اول شی گرایی ، جلسه دوم شی گرایی ، جلسه سوم شی گرایی
فهرست مطالب
ثابت ها (Constants)
یک ثابت بهنوعی یک متغیر است، که میتواند مقداری را درون خود نگه دارد، اما همانطور که از اسم آنها پیداست، ثابتها تغییرناپذیر هستند. زمانی که ما یکبار آن را تعریف کنیم، آن ثابت تغییر نخواهد کرد. به مثال زیر توجه نمایید.
1 2 3 4 5 6 |
<?php class Goodbye { const MESSAGE = "Thank you for visiting codepaz.com!"; } echo Goodbye::MESSAGE; |
نکته 1: با توجه به مثال بالا از جلسه سیزدهم PHP در این کلاس، RequiredMargin یک ثابت است. که با کلمه کلیدی const اعلام میشود و تحت هیچ شرایطی آن را به هیچچیز غیر از 1.7 تغییر نمیدهد. توجه داشته باشید که نام ثابت، پیشوند $ مشابه آنچه در مورد متغیرها بهکار میرود، را ندارد.
نکته 2: ثابتها case-sensitive هستند. یعنی به کوچکی و بزرگی حروف حساس هستند. پیشنهاد هم میشود که تمامی ثابتها در کلاسها با حروف بزرگ نوشته شوند.
نکته 3: با استفاده از علامت (::) میتوانیم به ثابتها، از خارج ِ کلاس، دسترسی داشته باشیم.
نکته 4: همچنین با استفاده از کلمهی کلیدی ِ self نیز میتوانیم در داخل ِ خود ِ کلاس به آن ثابت دسترسی داشته باشیم. به مثال زیر از جلسه سیزدهم PHP دقت کنید.
1 2 3 4 5 6 7 8 9 10 |
<?php class Goodbye { const MESSAGE = "Thank you for visiting codepaz.com!"; public function bye() { echo self::MESSAGE; } } $goodbye = new Goodbye(); $goodbye->bye(); |
کلاسها و متدهای abstract
کلاسهای abstruct در php، کلاسهایی هستند که نمیتوان از روی آنها شی ایجاد کرد و تنها میتوان از آنها ارث بری کرد. این نوع از کلاسها با کلمه کلیدی abstract اعلام میشوند. هنگام ارث بری از یک کلاس abstract همه متدهایی که در کلاس پدر با کلمه abstract نشانگذاری شدهاند بایستی در کلاس فرزند تعریف شوند. حال به ساختار آن توجه نمایید.
1 2 3 4 5 6 |
<?php abstract class ParentClass { abstract public function someMethod1(); abstract public function someMethod2($name, $color); abstract public function someMethod3() : string; } |
نکته 1: همانطور که مشاهده میکنید، به دلیل وجود کلمه کلیدی ِ abstract قبل از ایجاد تابع، بدنهی تابع وجود ندارد. درواقع یک تابع به وجود میآید اما چگونگی انجام کارها درون تابع نوشته نمیشود. بلکه باید جزییات تابع را خودمان زمان ارث بری تعریف کنیم.
نکته 2: درون کلاسهای abstract، علاوه بر توابع abstract بدون بدنهی تابع، میتوانیم از توابع معمولی که بدنهی تابع هم دارند استفاده کنیم. همچنین از توابع سازنده که در جلسه دوازدهم PHP هم با آنها آشنا شدیم، میتوانیم در اینجا استفاده کنیم.
نکته 3: همچنین استفاده از proprey ها با سطح دسترسی مختلف (visibility) بلامانع است.
به مثال زیر از جلسه سیزدهم PHP توجه نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php // Parent class abstract class Car { public $name; public function __construct($name) { $this->name = $name; } abstract public function intro() : string; } // Child classes class Audi extends Car { public function intro() : string { return "Choose German quality! I'm an $this->name!"; } } class Volvo extends Car { public function intro() : string { return "Proud to be Swedish! I'm a $this->name!"; } } class Citroen extends Car { public function intro() : string { return "French extravagance! I'm a $this->name!"; } } // Create objects from the child classes $audi = new audi("Audi"); echo $audi->intro(); echo "<br>"; $volvo = new volvo("Volvo"); echo $volvo->intro(); echo "<br>"; $citroen = new citroen("Citroen"); echo $citroen->intro(); |
نکته 1: همانطور که مشاهده میکنید یک کلاس abstract با نام Car ایجاد شده است. که در آن یک تابع سازنده نیز موجود است.
نکته 2: سه کلاس Audi،Volvo،Citroen از کلاس Car ارث بری کردهاند.
نکته 3: زمانی که در کلاس abstract یک تابع abstract ایجاد میشود، حتماً باید این تابع درون کلاسهای فرزند مجدداً بهکاربرده شود تا بدنهی آن نیز تولید شود.
نکته 4: توجه داشته باشید که تعاریف تابع درون یک کلاس abstract نیز باید توسط کلمه کلیدی abstract پیش برود. همچنین داشتن توابع abstract درون یک کلاس غیر abstract صحیح نیست.
نکته 5: کلمهی string در مقابل توابع abstract در مثال بالا در PHP نسخه 7 اضافه شده است. بیانگر این است که خروجی یک string خواهد بود.
مفهوم interface
جهت تعریف یک interface از کلیدواژهی interface استفاده میکنیم. برای اینکه یک کلاس بتواند از interface ارث بری کند، لازم است از کلیدواژهی implement استفاده شود. دستور استفاده از آن را در زیر مشاهده میکنید.
1 2 3 4 5 6 7 |
<?php interface interfaceName { // abstract methods } class Child implements interfaceName { // defines the interface methods and may have its own code } |
نکته 1: برای ساخت کلاس interface از کلمهی کلیدی class استفاده نمیکنیم و فقط از interface استفاده میکنیم.
نکته 2: تمامی متدها در کلاس interface بهاجبار باید public باشند.
نکته 3: interface ها تقریبا شبیه به abstract ها عمل میکنند. با این تفاوت که: توابع معمولی با بدنه ندارند. proprety ندارند. توابع سازنده ندارند. و فقط توابعی بدون بدنه دارند.
نکته 4: زمانی که یک کلاس از کلاس interface ارث بری میکند، باید تمامی متدهای آن را اجرا کند. درواقع خود ِ این متدها در کلاس اصلی، بدنه ندارد و بدنهی آن در کلاس فرزند الزاماً باید نوشته شوند. به مثال زیر توجه نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php // Interface definition interface Animal { public function makeSound(); } // Class definitions class Cat implements Animal { public function makeSound() { echo " Meow "; } } class Dog implements Animal { public function makeSound() { echo " Bark "; } } class Mouse implements Animal { public function makeSound() { echo " Squeak "; } } // Create a list of animals $cat = new Cat(); $dog = new Dog(); $mouse = new Mouse(); $animals = array($cat, $dog, $mouse); // Tell the animals to make a sound foreach($animals as $animal) { $animal->makeSound(); } |
نکته 1: در مثال بالا از آرایه و حلقه foreeach هم استفاده شد که به ترتیب این موارد را در جلسات چهارم و ششم PHP آموختیم.
نکته 2: یک کلاس میتواند چندین interface را implement کند. کافیاست که از یک کاما استفاده شود. به مثال زیر توجه کنید.
1 2 3 4 5 |
class Demo implements AInterface, BInterface, CInterface { // Functions declared in interfaces must be defined here } |
نکته 1: همانطور که در مثال بالا مشاهده میکنید، شرط ِ انجام این کار تعریف توابع ِ تمامی interface ها در قسمت ِ بدنهی کد میباشد.
متدها و ویژگیهای ايستا (static)
کلمه کلیدی static در برنامه نویسی شی گرا اهمیت بسیار زیادی دارد. ما میتوانیم با استفاده از proprety ها و متدهای ایستاتیک بهصورت مستقیم و بدون ایجاد هرگونه شئ، از کلاس مربوطه، دسترسی پیدا کنیم. عناصر ایستا مشابه یک عضو سراسری برای کلاس عمل میکنند و تمام اشیاء ایجاد شده از آن کلاس میتوانند به آنها دسترسی پیدا کنند. به مثال زیر توجه نمایید.
1 2 3 4 5 6 7 8 9 10 11 |
<?php class human{ static public $name; static public function s(){ echo 'welcome'."<br>"; self::$name='sajjad'; echo self::$name . "<br>"; } } human::s(); echo human::$name; |
خروجی کد بالا از جلسه سیزدهم PHP :
Welcome
Sajjad
Sajjad
نکته 1: در مثال بالا در کلاس human یک proprety و متد ایستا ایجاد شده است. در داخل حلقهی کلاس برای دسترسی به خاصیت ایستا باید از کلمه::self استفاده کرد. اما در بیرون کلاس برای دسترسی به خاصیتهای ایستا باید اینگونه عمل کرد. className::proprety or method name
نکته 2: شی های ایجادشده از کلاس استاتیک نمیتوانند به proprety ها دسترسی داشته باشند. اما میتوانند به متدها دسترسی داشته باشند.
تبریک میگم شما موفق شدید تا جلسه سیزدهم پی اچ پی ، مبحث ” شی گرایی در پی اچ پی (3) ” را پشت سر بگذارید.
با پایان این جلسه، شی گرایی در PHP به اتمام رسید. اگر سؤالی از این 3 جلسه دارید در قسمت کامنت ها مطرح کنید.