آموزش کلاس در PHP و کار با classها

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

از مفاهیم برنامه نویسی شی گرا می‌دانیم که کلاس‌ها شبیه یک قالب برای اشیاء هستند. به یک نمونه از یک کلاس (Class)، شئ (Object) گفته می‌شود.

هر کلاس می‌تواند چندین ویژگی داشته باشد. این ویژگی‌ها همان خصوصیات کلاس هستند که برای هر شئ می‌تواند متفاوت باشد. همچنین برای تعریف کارهایی که یک شئ می‌تواند انجام دهد، از متدها استفاده می‌کنیم.

با این مقدمه خیلی کلی، ابتدا یک مثال از کلاس ماشین در نظر می‌گیریم و آموزش را بر مبنای آن جلو می‌بریم.

ساخت کلاس در PHP

فرض کنید کلاسی به نام Car داریم. این کلاس نشان‌دهنده انواع ماشین در سیستم ما است. برای هر ماشین، ۳ ویژگی ساده در نظر می‌گیریم:

  • مدل (model)
  • رنگ (color)
  • ظرفیت (capacity)

علاوه بر این‌ها، متدهایی برای ماشین در نظر می‌گیریم. که جلوتر آن‌ها را معرفی و تعریف می‌کنم.

ساختار کلی تعریف کلاس در PHP به این صورت است که ابتدا کلمه کلیدی Class را نوشته و جلوی آن نام کلاس را می‌نویسیم. سپس با گذاشتن علامت کروشه ({}) محدوده کلاس را مشخص می‌کنیم.

هر چیزی که درون این محدوده بنویسیم، جزء کلاس در نظر گرفته می‌شود.

class Name {
    // class body
}

پس برای تعریف کلاس ماشین در PHP باید ساختار زیر را استفاده کنیم:

<?php
class Car {
    // Car class body
}
?>

توجه کنید که حرف اول نام کلاس با حروف بزرگ انگلیسی نوشته می‌شود.

ویژگی کلاس در PHP

تعریف ویژگی‌های یک کلاس (property) معمولاً در ابتدای بدنه کلاس انجام می‌شود. ویژگی‌ها در حقیقت نوعی متغیر برنامه نویسی هستند که برای هر شئ می‌تواند مقادیر مختلفی داشته باشد.

برای ویژگی‌ها باید سطح دسترسی مشخص کنیم. در مورد سطح دسترسی‌ها در بخش انتهایی آموزش صحبت می‌کنم. فعلاً قبل از اسم هر ویژگی، کلمه کلیدی public را قرار می‌دهیم.

<?php
class Car {
    public $model;
	public $color;
	public $capacity;
}
?>

همانطور که می‌بینید سه ویژگی کلاس ماشین خود را با PHP تعریف کردیم. اگر لازم بود یکی از این مقادیر دارای مقدار پیش‌فرض باشد، می‌توانیم آن را در همین بخش تعیین کنیم. در کلاس زیر، ظرفیت ماشین به طور پیش‌فرض ۵ نفر در نظر گرفته شده است.

همچنین می‌توانید نوع هر متغیر را هم مشخص کنید. من برای model این کار را انجام داده و آن را از نوع رشته در PHP تعیین کردم.

<?php
class Car {
    public string $model = "";
	public $color;
	public $capacity = 5;
}
?>

تعریف متدهای کلاس

متدها (method) در حقیقت رفتارهای کلاس هستند. برای تعریف متد در کلاس PHP روندی مشابه تعریف تابع PHP داریم. برای کلاس ماشین چهار متد در نظر گرفتم:

<?php
class Car {
    public $model = "";
	public $color;
	public $capacity = 5;
	
	function set_model($model){
	    if ($this->model == ""){
		    $this->model = $model;
		}
	}
	function get_model(){
	    return $this->model;
	}
	function set_color($color){
	    $this->color = $color;
	}
	function start(){
	    // codes for start car
	}
}
?>

درون متدهای یک کلاس می‌توانیم هر کاری انجام دهیم! در قطعه کد بالا می‌بینید که در get_model() یکی از ویژگی‌های شئ را خوانده و بر می‌گردانیم. داخل set_color() مقدار متغیر رنگ را تغییر می‌دهیم. در start() نیز هر کاری پیچیده‌ای که مدنظرتان است را می‌توانیم قرار دهیم. از دستورات شرطی پی اچ پی گرفته تا ساخت یک شئ دیگر!

متغیر this در PHP

در قطعه کد بالا از کلمه کلیدی $this استفاده کرده‌ام. این کلمه کلیدی که به شکل یک متغیر در کلاس PHP وجود دارد، برای اشاره به همین شئ استفاده می‌شود.

در بخش بعدی آموزش یاد می‌گیریم که چطور از یک کلاس، چند شئ مختلف بسازیم. در چنین حالتی وقتی می‌خواهیم به ویژگی رنگ همین ماشین دسترسی پیدا کنیم، از $this استفاده می‌کنیم. یعنی می‌گوییم ویژگی مربوط به همین شئ که متد روی آن صدا زده شده است را فراخوانی کن!

استفاده از کلاس PHP

تا اینجا یاد گرفتیم چگونه یک کلاس در PHP ایجاد کنیم. class یک قالب یا نوعی ساختار است و می‌توانیم از روی آن چندین شئ مختلف ایجاد کنیم. به طور کلی، متدهای همه اشیاء ثابت هستند و فقط مقدار ویژگی‌های آن‌ها فرق می‌کند.

وقتی از کلاس Car یک شئ می‌سازیم، آن شئ دارای یک id می‌شود که منحصر به فرد است. فعلاً همین قدر بدانید که هر چند تا شئ که ایجاد کنیم، از یکدیگر متمایز هستند.

ساخت شی از کلاس

برای ایجاد شئ از کلاس در PHP از کلمه کلیدی new استفاده می‌شود. در جلوی new نام کلاس را آورده و () را قرار می‌دهیم. به قطعه کد زیر توجه کنید:

<?php
$car1 = new Car();
$car2 = new Car();

فعلاً دو شئ از کلاس ماشین ایجاد کردم. در ادامه یاد می‌گیریم چطور به متدها و ویژگی‌ها دسترسی داشته باشیم.

Car() یک متد درون کلاس Car است که به طور ضمنی تعریف می‌شود؛ به آن سازنده یا Constructor گفته می‌شود. در جلسه بعدی در مورد نحوه کار سازنده‌ها و تعریف سازنده‌های دلخواه در کلاس PHP بیشتر یاد می‌گیریم.

استفاده از شی در PHP

برای فراخوانی متدها و ویژگی‌های public در شئ PHP از علامت -> جلوی متغیر شئ استفاده می‌کنیم. سپس متد یا ویژگی را فراخوانی می‌کنیم. به قطعه کد زیر توجه کنید:

<?php
$car1 = new Car();
$car2 = new Car();

$car1->set_model("BMW x7");
$car2->set_model("Benz A45");

$car1->set_color("White Metallic");

با این قطعه کد، پس از ایجاد دو شئ $car1 و $car2 مدل هر دو را مشخص کرده و برای اولی رنگ تعیین کردم.

به طور مشابه می‌توانم مدل ماشین اول را فراخوانی کرده و در خروجی نمایش دهم:

<?php
echo $car1->get_model();

چون ویژگی‌هایمان را public تعریف کرده‌ایم، می‌توانیم به طور مستقیم به همه آن‌ها دسترسی داشته باشیم. در کد زیر، بدون اینکه از متدی در شئ استفاده کنم، رنگ ماشین دوم را تغییر می‌دهم:

<?php
$car2->color = "Black";

سطح دسترسی در کلاس PHP

برای متدها و ویژگی‌های یک کلاس می‌توانیم سطوح دسترسی مختلفی در نظر بگیریم. به کلاس ماشین که تا الآن داشتیم دقت کنید. ما می‌توانیم همه متدها و ویژگی‌هایش را از بیرون از کلاس صدا بزنیم!

من برای متد set_model() یک شرط گذاشته‌ام؛ اگر برای ماشین مدلی تعریف شد، دیگر نمی‌توانیم آن را تغییر دهیم. حالا اگر کد زیر را بنویسیم، تغییر مدل ماشین بدون بررسی شرط مورد نظرمان انجام می‌شود!

<?php
$car1->model = "BMW x6";

این یک مثال ساده است! در برنامه‌های بزرگ باید دسترسی‌ها و تغییرات غیر مجاز را مدیریت کنیم. به عنوان یک برنامه‌نویس خوب بهتر است اجازه دسترسی مستقیم به بعضی ویژگی‌ها و حتی متدها را محدود کنیم.

برای این کار از کلمات کلیدی که برای Visibility استفاده می‌شود استفاده می‌کنیم. ۳ کلمه کلیدی داریم:

دسترسی/نمایشمحل قابل دسترس
publicهمه جا
protectedدرون کلاس و کلاس‌هایی که از این کلاس ارث‌بری کرده‌اند
privateفقط درون همین کلاس

اگر هیچ سطح دسترسی برای اعضای درون کلاس PHP تعریف نکنیم، به طور پیش‌فرض public در نظر گرفته می‌شوند.

در کد زیر، کلاس Car را دوباره بازنویسی کردم و ویژگی‌های رنگ را protected و مدل را private کردم! در این حالت، آخرین دستوری که برای خواندن مدل ماشین نوشته شده است، اشتباه بوده و با خطا مواجه می‌شویم.

<?php
class Car {
    private $model = "";
	protected $color;
	public $capacity = 5;
	
	function set_model($model){
	    if ($this->model == ""){
		    $this->model = $model;
		}
	}
	function get_model(){
	    return $this->model;
	}
	function set_color($color){
	    $this->color = $color;
	}
	function start(){
	    // codes for start car
	}
}

$my_car = new Car();
$my_car->set_model("BMW x7");
echo $my_car->model; // wrong!
?>

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

شاید بتوان گفت دو نوع خاص از کلاس‌ها را داریم که به نام اینترفیس یا interface در PHP و کلاس abstract در PHP شناخته می‌شوند. در جلسات آینده از دورهٔ رایگان این دو مورد را نیز بررسی می‌کنم.

در این آموزش سعی کردم نحوه تعریف کلاس در PHP و کار با آن را قدم به قدم و به ساده‌ترین روش توضیح دهم. اگر سؤالی دارید یا احساس می‌کنید نکته‌ای جا افتاده، از بخش دیدگاه‌ها نظرتان را بیان کنید.

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP