برنامه نویسی شی گرا یا 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 تبدیل میشوی که آمادهی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.
۴ دیدگاه
۱۸ مرداد ۱۴۰۲، ۰۵:۳۷
میفهمم چیمیگه ولی متوجه نمیشم
نازنین کریمی مقدم۲۲ مرداد ۱۴۰۲، ۱۰:۳۱
درود
هرجا متوجه نشدید میتونید اینجا بپرسید تا بیشتر توضیح بدم :)