آموزش PHP

آموزش PHP - برنامه نویسی شئ گرا

می توانیم جهان را با اشیاء مختلف مانند خورشید، زمین، ماه و غیره تصور کنیم. همچنین قادریم ماشین را نیز با اشیاء مختلف مانند چرخ، فرمان، دنده ها و غیره تصور کنیم. تمام این موارد مانند مفاهیم برنامه نویسی شی گرا است که همه چیز را به عنوان یک شیء فرض کرده و با استفاده از اشیاء مختلف به پیاده سازی نرم افزار می پردازد.

مفاهیم شی گرا

پیش از بررسی جزئیات به تعریف اصطلاحات مهم مربوط به برنامه ریزی شی گرا می پردازیم.

  • Class : این نوع داده ای توسط برنامه نویس تعریف می شود که شامل توابع محلی و داده های محلی می باشد. می توانید کلاس را به عنوان الگویی برای ساخت بسیاری از نمونه های (instance) یک نوع (یا کلاس) از یک شیءدر نظر بگیرید.
  • Object : به نمونه فردی از ساختار داده تعریف شده توسط یک کلاس Object یا شئ گفته می شود. کلاس را یک بار تعریف می کنید و سپس قادرید بسیاری از اشیاء که متعلق به آن هستند را ایجاد نمایید. اشیاء نیز به عنوان نمونه شناخته می شوند.
  • Member Variable : اینها متغیرهایی هستند که درون یک کلاس تعریف شده اند. این داده ها برای خارج از کلاس مخفی می شوند و از طریق توابع عضو قابل دسترسی هستند. این متغیرها هنگامی که یک شی ایجاد می شود، به عنوان ویژگی (attribute) شیء فراخوانی می شوند.
  • Member function : این تابع در داخل یک کلاس تعریف شده که برای دسترسی به داده های شیء مورد استفاده قرار می گیرد.
  • Inheritance : هنگامی که یک کلاس توسط ارجاع تابع موجود از یک کلاس پدر تعریف شود، آن را به ارث می برد. در اینجا کلاس child تمام یا چند عضو تابع و متغیرهای کلاس parent را ارث می برد.
  • Parent class : کلاسی است که توسط یک کلاس دیگر به ارث برده می شود. این نیز یک کلاس پایه یا سوپر کلاس (super class) می باشد.
  • Child Class: کلاسی است که از کلاس دیگری به ارث برده می شود. این نیز یک زیر کلاس یا کلاس مشتق شده است. 
  • Polymorphism : این یک مفهوم شی گرا است که در آن همان تابع برای اهداف مختلف استفاده می شود. به عنوان مثال نام تابع همان باقی می ماند، اما تعداد آرگومان ها و کارها و تسک هایی که انجام می دهد متفاوت است.
  • Overloading : یک نوع پلی مورفیسم است که در آن برخی یا تمامی اپراتورها بسته به انواع استدلال هایشان پیاده سازی های متفاوت دارند. اما به طور مشابه می توان توابع را با اجراهای مختلف نیز overload کند.
  • Data Abstraction : هر نمایش داده ای است که جزئیات پیاده سازی اش پنهان یا (انتزاعی) باشد.
  • Encapsulation : اشاره به یک مفهوم است که برای ایجاد یک شئ، تمام داده ها و توابع عضو را با هم تشکیل می دهیم.
  • Constructor : اشاره به نوع خاصی از تابع است که در زمان تشکیل شئ از یک کلاس به صورت خودکار فراخوانی می شود.
  • Destructor : اشاره به یک نوع خاص از تابع دارد که در زمان حذف یا خارج از محدوده بودن شئ به صورت خودکار فراخوانی می شود.

تعریف کلاس های PHP

فرم کلی تعریف یک کلاس جدید در PHP به شرح زیر است:

<?php
   class phpClass {
      var $var1;
      var $var2 = "constant string";
      
      function myfunc ($arg1, $arg2) {
         [..]
      }
      [..]
   }
?>

در اینجا شرح هر خط  را  مشاهده خواهید کرد: 

  • فرم مخصوص Class (کلاس)، به دنبال نام کلاسی که می خواهید تعریف کنید می آید.
  •  مجموعه ای از پرانتزهایی که هر تعداد اعلان های متغیر و تعاریف تابع را محاسبه می کنند.
  • اعلام متغیر با فرم خاص var  شروع می شود، که با نام متغیر $ همراه است. ممکن است دارای مقدار اولیه برای یک مقدار ثابت باشند. 
  • تعاریف تابع شبیه به توابع مستقل PHP هستند اما برای کلاس محلی یا لوکال و تنظیم و دسترسی به داده های شی مورد استفاده قرار می گیرند. 

مثال

در اینجا مثالی از کلاس نوع کتاب (Books type) تعریف شده است:

<?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/>";
      }
   }
?>

متغیر $this متغیر خاصی است و به همان شیء اشاره دارد.

 ایجاد اشیاء در PHP

هنگامی که کلاس خود را تعریف کردید، می توانید شئ های زیادی را از آن نوع کلاس ایجاد کنید. در زیر نمونه ای از چگونگی ایجاد شی با استفاده از اپراتور new قرار داده شده است.

$physics = new Books;
$maths = new Books;
$chemistry = new Books;

در اینجا ما سه شئ ایجاد کرده ایم و این اشیا مستقل از یکدیگر هستند که نمونه های جداگانه ای خواهند داشت. در ادامه نحوه دسترسی به تابع member و پردازش member variables را بررسی خواهیم کرد. 

فراخوانی توابع member 

پس از ایجاد اشیاء خود، می توانید اعضای عضو مربوط به آن شئ را فراخوانی کنید. تابع member قادر به پردازش member variables (متغیر عضو) مربوط به آن شئ می باشد.

 مثال زیر نحوه تعیین قیمت سه کتاب را با فراخوانی تابع member  نشان می دهد.

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

$physics->setPrice( 10 );
$chemistry->setPrice( 15 );
$maths->setPrice( 7 );

حال توابع member دیگر را نیز فراخوانی کنید تا مقادیر تنظیم شده در مثال فوق را دریافت کنید:

$physics->getTitle();
$chemistry->getTitle();
$maths->getTitle();
$physics->getPrice();
$chemistry->getPrice();
$maths->getPrice();

نتیجه زیر را تولید می کند:

Physics for High School
Advanced Chemistry
Algebra
10
15
7

توابع سازنده

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

PHP یک تابع خاص به نام __construct() را برای تعریف سازنده فراهم می کند. می توانید آرگومان های بسیاری را از این طریق به تابع سازنده منتقل کنید. 

مثال زیر یک سازنده برای کلاس Book (کتاب) ایجاد کرده و در زمان ایجاد شی، قیمت و عنوان کتاب  را نیز ایجاد می کند.

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

حال نیاز به تنظیم جداگانه برای تنظیم قیمت و عنوان نداریم. می توانیم این دو member variables را در زمان ایجاد تولید کنیم. مثال زیر را بررسی نمایید:

$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

مانند یک تابع سازنده می توانید یک تابع مخرب را با استفاده از تابع __destruct() تعریف کنید. همچنین می توانید تمام منابع را با یک destructor آزاد نمایید. 

Inheritance (وراثت)

تعاریف کلاس PHP می تواند به صورت اختیاری از تعریف کلاس پدر( parent ) و با استفاده از گسترش شرط صورت پذیرد. دستورنگارش آن به شرح زیر است:

class Child extends Parent {
   <definition body>
}

اثر وراثت کلاس فرزند (یا child class ، زیر کلاس یا subclass) دارای ویژگی های زیر است:

  • به طور خودکار تمام declaration های member variable از کلاس parent را دارد. 
  • به طور خودکار تمام اعضا همانند parent عمل می نمایند. (به طور پیش فرض) همانند همان تابعی که در parent است، کار می کنند. 

مثال زیر کلاس Books را به ارث می برد و قابلیت های بیشتری را بر اساس الزامات اضافه می کند.

class Novel extends Books {
   var $publisher;
   
   function setPublisher($par){
      $this->publisher = $par;
   }
   
   function getPublisher(){
      echo $this->publisher. "<br />";
   }
}

در حال حاضر به غیر از توابع inherited ، ناول کلاس دو تابع عضو اضافی را نگه می دارد.

 تابع Overriding

توابع تعریف شده در کلاس های فرزند بازنویسی شده توابع با نام مشابه در کلاس های پدر هستند. در یک کلاس فرزند، قادر به اصلاح تعریف تابع به ارث برده از کلاس پدر می باشیم. 

در مثال زیر توابع getPrice و getTitle برای بازنویسی برخی مقادیر بازگردانده شده استفاده می شوند.

function getPrice() {
   echo $this->price . "<br/>";
   return $this->price;
}
   
function getTitle(){
   echo $this->title . "<br/>";
   return $this->title;
}

Public Members (اعضای عمومی)

به غیر از مواردی که مشخص می کنید، خاصیت ها (properties ) و متد های کلاس به صورت عمومی می باشند. این امر به معنی نمایش آن ها در سه حالت زیر است: 

  • از خارج از کلاس در آن declared شده است. 
  • از درون کلاس در آن declared شده است. 
  • از درون کلاس دیگری که کلاس ای در آن declared شده اجرا می شود. 

تا کنون تمام اعضا را به صورت اعضای عمومی یا public members دیده ایم. اگر می خواهید دسترسی به اعضای یک کلاس را محدود کنید، اعضای کلاس را بعنوان private  (خصوصی) یا protected (محافظت شده) تعریف می کنید. 

Private members (اعضای خصوصی)

تعیین member private باعث محدود نمودن دسترسی به آن کلاس می شود. member private نمی تواند از کلاس های به ارث برده شده که در آن کلاس declared شده ارجاع گردد و از خارج از کلاس قابل دسترسی باشد. 

یک عضو کلاس یا class member می تواند با استفاده از کلمه کلیدی private  در کنار نام آن عضو به صورت خصوصی ایجاد شود.

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!");
   }
}

زمانی که کلاس MyClass با استفاده از extends (گسترش) توسط کلاس دیگری به ارث برده می شود، ()myPublicFunction به عنوان $driver قابل مشاهده خواهد بود. گسترش کلاس به myPrivateFunction و $car آگاهی و یا دسترسی ندارد، چرا که آنها خصوصی هستند.

 Protected members (اعضای حفاظت شده)

خاصیت (property) یا متد protected  در کلاسی که در آن declared صورت گرفته و همچنین در کلاس هایی که آن کلاس را گسترش می دهند، موجود است. Protected members در خارج از این دو نوع کلاس در دسترس نیستند. یک عضو کلاس می تواند با استفاده از کلمه کلیدی Protected   در کنار نام عضو محافظت شود.در اینجا نسخه متفاوتی از MyClass قرار دارد:

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!");
   }
}

Interfaces

رابط ها (Interfaces) برای ارائه نام تابع مشترک به اجرا کنندگان تعریف می شود. implementorهای مختلف می توانند این اینترفیس ها را با توجه به الزامات آنها پیاده سازی نمایند. می توانید بگویید، رابط ها اسکلت هایی هستند که توسط توسعه دهندگان اجرا می شود. در PHP5، تعریف رابط به شکل زیر است:

interface Mail {
   public function sendMail();
}

سپس، اگر کلاس دیگری آن رابط را اجرا کند، مانند زیر خود بود:

class Report implements Mail {
   // sendMail() Definition goes here
}

constant 

ثابت یا constant  به نوعی یک متغیر است، در حالی که دارای یک مقدار می باشد، اما مین را بیشتر شبیه به یک تابع در نظر بگیریم زیرا ثابت غیر قابل تغییر است. هنگامی که ثابتی را declare  می کنید، تغییر نمی کند.

 تعریف constant  آسان است، به نسخه MyClass در زیر توجه کنید:

class MyClass {
   const requiredMargin = 1.7;
   
   function __construct($incomingValue) {
      // Statements here run every time
      // an instance of the class
      // is created.
   }
}

در این کلاس، requiredMargin یک ثابت است. با کلمه کلیدی const تعریف یا  declare  شده و تحت هیچ شرایطی نمی توانید آن را به چیزی غیر از 1.7 تغییر دهید. توجه داشته باشید که نام ثابت دارای پیشوند $ نبوده و به عنوان نام متغیر انجام می شود. 

کلاس های Abstract

کلاس Abstract نمی تواند نمونه ای باشد و تنها به ارث برده می شود. شما یک کلاس Abstract مانند زیر و تنها با کلید واژه Abstract تعریف می کنید:

 وقتی که از یک کلاس Abstract به ارث برده می شود، تمام روش های انتزاعی در تعریف کلاس Parent باید توسط فرزند تعریف شود؛ علاوه بر این، این متدها نیز باید به همان  شکل تعریف شوند.

abstract class MyAbstractClass {
   abstract function myAbstractFunction() {
   }
}

توجه داشته باشید که تعاریف تابع در داخل یک کلاس انتزاعی نیز باید توسط کلمه کلیدی Abstract پیش برود. قانونی بودن تعاریف تابع Abstract در یک کلاس غیر انتزاعی یا non-abstract قانونی نمی باشد. 

کلید واژه Static

تعریف class members (اعضای کلاس) یا متدها به عنوان استاتیک باعث می شود تا بدون نیاز به ایجاد نمونه ای از کلاس قادر به دسترسی به آن ها باشیم. تعریف عضو استاتیک نمی تواند با شی کلاس نمونه در دسترس باشد (اگر چه یک متد static  قادر به انجام اینکار می باشد).مثال زیر را امتحان کنید:

<?php
   class Foo {
      public static $my_static = 'foo';
      
      public function staticValue() {
         return self::$my_static;
      }
   }
	
   print Foo::$my_static . "n";
   $foo = new Foo();
   
   print $foo->staticValue() . "n";
?>	

کلید واژه final

PHP 5 کلید واژه final  را معرفی می کند که از کلاس های فرزند جهت سوء استفاده از بازنویسی متد با پیشوند تعریف شده با final جلوگیری می نماید. اگر کلاس خود را با  final تعریف کنید، قادر به گسترش آن نمی باشید. 

مثال زیر نتیجه را در قالب یک خطای Fatal : Cannot override final method BaseClass::moreTesting() نشان می دهد.

<?php

   class BaseClass {
      public function test() {
         echo "BaseClass::test() called<br>";
      }
      
      final public function moreTesting() {
         echo "BaseClass::moreTesting() called<br>";
      }
   }
   
   class ChildClass extends BaseClass {
      public function moreTesting() {
         echo "ChildClass::moreTesting() called<br>";
      }
   }
?>

فراخوانی parent constructors

به جای نوشتن یک constructor  کاملا جدید برای زیر کلاس ها، می توانید از طریق فراخوانی constructor  پدر و سپس انجام آنچه لازم است را برای نمونه سازی زیر کلاس انجام دهید. در اینجا یک مثال ساده قرار دارد:

class Name {
   var $_firstName;
   var $_lastName;
   
   function Name($first_name, $last_name) {
      $this->_firstName = $first_name;
      $this->_lastName = $last_name;
   }
   
   function toString() {
      return($this->_lastName .", " .$this->_firstName);
   }
}
class NameSub1 extends Name {
   var $_middleInitial;
   
   function NameSub1($first_name, $middle_initial, $last_name) {
      Name::Name($first_name, $last_name);
      $this->_middleInitial = $middle_initial;
   }
   
   function toString() {
      return(Name::toString() . " " . $this->_middleInitial);
   }
}

در این مثال، ما یک کلاس پدر (Name) داریم که دارای سازنده دو پارامتر و یک زیر کلاس (NameSub1) است که خود دارای یک سازنده سه پارامتری است. سازنده NameSub1 توابع را با فراخوانی constructor پدر به روش صریح با استفاده از :: دستور نگارش (ارسال دو آرگومان ) انتقال داده و سپس یک فیلد اضافی را تنظیم می نماید. به طور مشابه، NameSub1 تابع ()toString غیر سازنده (non constructor) را از نظر تابع parent که آن را لغو کرده، تعریف می کند. 

نکته : یک سازنده را می توان با نام یک نام کلاس تعریف کرد. این امر در مثال بالا تعریف شده است.

در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش PHP

Learn PHP

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

کلیک کنید و سوالات خود را از ما بپرسید
لطفا فرم سوال را پر کنید

سوال شما با موفقیت ثبت شد. برای اینکه بتوانیم به شما اطلاع رسانی کنیم، موارد زیر را وارد کنید:

لطفا چند لحظه منتظر بمانید ...