:: فقط تا پایان فروردین 👈 ۳۵٪ تخفیف ویژه به همراه هدیه 5 میلیون تومانی
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ دیدگاه نظر نازنین گودرزی
آموزش شی گرایی در PHP : برنامه نویسی شی گرا یا OOP
آموزش شی گرایی در PHP : برنامه نویسی شی گرا یا OOP

برنامه نویسی شی گرا یا 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;

کد زیر، نحوه‌ی ست کردن عنوان و قیمت این سه کتاب را با فراخوانی توابع عضو نشان می‌دهد.

$physics->setTitle( "Physics for High School" );
$chemistry->setTitle( "Advanced Chemistry" );
$maths->setTitle( "Algebra" );
$physics->setPrice( 10 );
$chemistry->setPrice( 15 );
$maths->setPrice( 7 );

اکنون برای دریافت مقادیر ست شده در مثال بالا، توابع عضو دیگری را فراخوانی می‌کنیم.

$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();
$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();
Physics for High School Advanced Chemistry Algebra 10 15 7

توابع constructor در PHP

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

مثال زیر یک سازنده برای کلاس Books ایجاد می‌کند و قیمت و عنوان کتاب را در زمان ایجاد شی مقداردهی می‌کند.

function __construct( $par1, $par2 ) {
   $this->title = $par1;
   $this->price = $par2;
}

اکنون برای ست کردن قیمت و عنوان نیازی به فراخوانی تابع 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 به صورت زیر آبجکت بسازیم.

$animal = new Dog();
$animal->name = "Bob";
$animal->age = 7;
echo $animal->Describe();
echo $animal->Greet();

interface در PHP

نحوه‌ی ساخت اینترفیس در 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 تبدیل می‌شوی که آماده‌ی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.

۴ دیدگاه
ما همه سوالات و دیدگاه‌ها رو می‌خونیم و پاسخ میدیم
۱۸ مرداد ۱۴۰۲، ۰۵:۳۷

میفهمم چیمیگه ولی متوجه نمیشم

نازنین کریمی مقدم ۲۲ مرداد ۱۴۰۲، ۱۰:۳۱

درود هرجا متوجه نشدید میتونید اینجا بپرسید تا بیشتر توضیح بدم :)

mhd _313 ۱۰ فروردین ۱۴۰۱، ۱۳:۴۱

خیلی خوب توضیح دادید??

Mr.coder ۳۱ فروردین ۱۴۰۰، ۰۷:۲۶

عالییییی دقیقا قسمتی که میخواستم رو متوجه شدم???

  • مزایای شی گرایی در PHP
  • شی گرایی در PHP
  • تعریف class در PHP
  • تعریف object در PHP
  • فراخوانی توابع عضو
  • توابع constructor در PHP
  • توابع destructor در PHP
  • inheritance در PHP
  • سربارگذاری تابع در PHP
  • انواع سطوح دسترسی در کلاس
  • کلاس‌های abstract در PHP
  • interface در PHP
  • polymorphism در PHP
اشتراک گذاری مقاله در :