کلاس در php چیست و چه کاربردی دارد

یکی از مهمترین مباحث برنامه‌نویسی بحث شی گرایی می باشد. قبل از یادگیری شی‌گرایی یا Object Oriented که امروزه در نرم افزار های بزرگ و مدرن به کارگیری از این سبک برنامه‌نویسی غیر قابل اجتناب می باشد باید با مفهوم کلاس آشنا شوید. اصلی ترین و مهمترین اصل در شی‌گرایی، کلاس‌ها هستند. تمام اصول شی‌گرایی و دیزاین پترن ها با استفاده از کلاس‌ها پیاده سازی می‌شوند. بنابراین یادگیری درست و اصولی این مفهوم برنامه‌نویسی، بدون توجه به اینکه از چه زبانی استفاده می‌کنید لازم و ضروری است.

تمامی زبان های برنامه‌نویسی از شی‌گرایی پشتیبانی نمی‌کنند. برای مثال زبان C از شی گرایی پشتیبانی نمی‌کند. به این معنی است که شما نمی‌توانید در آن کلاس تعریف کنید. اما زبان هایی مانند جاوا، سی‌شارپ، پایتون و خیلی از زبان های دیگر شی‌گرا هستند. همچنین php شی گرا می‌باشد و در ادامه  این مقاله به بررسی این موضوع خواهیم پرداخت.

کلاس چیست

قبل از هر چیزی باید بدانیم کلاس چیست و چرا از آن استفاده می‌شود. برنامه های دنیای واقعی نیاز به مدل سازی دارند. منظور از برنامه های دنیای واقعی چیست؟

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

دانشجو دارای نام، نام خانوادگی، سن، رشته تحصیلی است. این ویژگی ها در تمامی دانشجویان یکسان است، بنابراین به زبان ساده،‌ می‌توانیم این ویژگی ها (Property) یا صفات را با استفاده از کلاس، پیاده‌سازی کنیم.

تعریف کلاس در php

برای اعلان یک کلاس از کلمه کلیدی class استفاده می‌کنیم. کد زیر تعریف یک کلاس را نشان می‌دهد.

class Student {
    
}

 بعد از کلمه کلیدی class نام کلاس مشخص می‌شود که در مثال بالا Student در نظر گرفتیم.

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

تعریف فیلد (Field) در کلاس

فیلد ها متغیر هایی هستند که وضعیت آبجکت را نگه می‌دارند.

در زبان‌های برنامه نویسی به فیلد ها (‌Field)، ویژگی (Property) و یا صفت (Attribute) نیز گفته می‌شود و برای ما هرکدام معادل یک مفهوم هستند. در ادامه ما به تمامی صفت های کلاس، فیلد می‌گوییم.

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

class Student {

    public $name; // نام
    public $family_name; // نام خانوادگی
    public $age; // سن
    public $field; // رشته

}

از کلمه کلیدی public برای تعریف فیلد استفاده میکنیم. این کلمه کلیدی، باعث می‌شود فیلد مورد نظر به صورت عمومی تعریف شود(در ادامه به سطح دسترسی فیلد ها خواهیم پرداخت).

می‌توانید تعریف فیلد را در یک خط و یک دستور انجام دهید.

class Student {
    // تعریف چند صفت با یک دستور
    public $name, $family_name, $age, $field;
}

مقدار اولیه فیلد

هر فیلد می‌تواند دارای مقادیر اولیه پیش فرض باشد (Initial Property Value) که قوانین آنها مانند متغیر‌های معمولی در php می‌باشد.

class Student {

    public $name = 'Morteza';
    public $family_name = 'Ghorbani';
    public $age = 27;
    public $field = 'IT';

}

ایجاد یک نمونه (Instance) از کلاس

چگونه می‌توانیم به صفاتی که در کلاس تعریف کردیم دسترسی پیدا کنیم. قبل از استفاده از کلاس، باید نمونه‌ای (Instance)  از آن ایجاد کنیم. برای این کار از کلمه کلیدی new استفاده میکنیم و نمونه ایجاد شده را به یک متغیر انتساب می‌دهیم. کد زیر ایجاد یک نمونه ساده از کلاس Student است.

class Student {

    public $name = 'Morteza';
    public $family_name = 'Ghorbani';

}

$object = new Student();

به زبان ساده، یک آبجکت (object) از کلاس Student ایجاد کردیم و با استفاده از این آبجکت به فیلد آن دسترسی داریم. کد زیر این موضوع و روش آن را به سادگی شرح می‌دهد.

class Student {

    public $name = 'Morteza';
    public $family_name = 'Ghorbani';

}

$object = new Student();
echo $object->name . ' ' . $object->family_name;
// خروجی: Morteza Ghorbani

نکته قابل توجه این است که با استفاده نمونه ایجاد شده از کلاس (متغییر $object) و ( -> ) به صفات تعریف شده در کلاس Student دسترسی داریم و در زمان فراخوانی صفات از $ استفاده نمیکنیم.

$class_obj->attribute_name;

متد (Method) در کلاس

به صورت مفصل درباره توابع در php صحبت کردیم. کلاس ها شامل متد ها هستند که عملکرد آنها مشابه توابع می‌باشد.

فیلد‌ها (Field) متغیر هایی هستند که وضعیت آبجکت را نگه می‌دارند، در حالی که متد ها (Method)، توابعی هستند که آنچه که آبجکت می‌تواند انجام دهد را تعریف می‌کنند.

کد زیر مثالی از تعریف یک متد است. همچنین فراخوانی متد در خط آخر نشان داده شده است.

class MyClass {
    public $field = 'Field Value';

    public function my_method($param1, $param2) {
        return $param1 . ' ' . $param2;
    }
}

$obj = new MyClass();
$result = $obj->my_method('Hello', 'World');
echo $result; // خروجی: Hello World

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

بیشتر بخوانید: تفاوت آرگومان و پارامتر

تغییر مقادیر فیلد ها

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

class MyClass {

    public $name, $family_name;

}

$obj = new MyClass();
$obj->name = "Morteza";
$obj->family_name = "Ghorbani";
echo $obj->name . ' ' . $obj->family_name; // خروجی: Morteza Ghorbani

 با استفاده از نام آبجکت میتوانیم به فیلد مورد نظرمان درسترسی داشته باشیم. سپس همانند یک متغیر معمولی می‌توانیم مقادیر دلخواهمان را انتساب دهیم.

اشاره گر this در php

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

با استفاده از اشاره‌گر this این کار امکان‌پذیر است. مثال زیر را ببنید.

class Student {

    public $name, $family_name;

    public function get_name() {
        return $this->name . ' ' . $this->family_name;
    }

}

$obj = new Student();
$obj->name = "Morteza";
$obj->$family_name = "Ghorbani";
echo $obj->get_name(); // خروجی: Morteza Ghorbani

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

اشاره گر this به متد ها و فیلد های کلاس جاری اشاره می‌کند. با استفاده از this میتوانیم به فیلد های تعریف شده در آن کلاس دسترسی داشته باشیم. همچنین در بدنه یک متد می‌توانیم متد دیگری را فراخوانی کنیم

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

class MyClass {

    public function m1() {
        $result = $this->m2();
        return $result;
    }

    public function m2() {
        return "Hello World";
    }

}

$obj = new MyClass();
echo $obj->m1(); // خروجی: Hello World

در بدنه متد m1 با اشاره گر this، به متد m2 دسترسی داشتیم. بنابراین حتما برای دسترسی به متد ها و فیلد های یک کلاس در همان کلاس باید از اشاره گر this استفاده کنیم.

سطح دسترسی فیلد ها و متد ها در php

 آخرین موضوع مورد بحث در این قسمت، سطح دسترسی عناصر موجود در کلاس می باشد.

ما در کلاس چهار نوع سطح دسترسی داریم:

  • public
  • private
  • protected
  • static

نوع دستیابی public

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

نوع دستیابی private

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

class MyClass {
    private $field_1 = 'value 1';
}

$obj = new MyClass();
echo $obj->field_1(); // خروجی: Message: Cannot access private property MyClass::$field_1

 همانطور که در خط آخر مشاهده می‌کنید یک ارور دریافت خواهیم کرد. دلیل آن private بودن فیلد field_1 در کلاس MyClass می باشد. یعنی این فیلد فقط در داخل همان کلاس قابل دسترس می‌باشد. بنابراین این نوع دستیابی چه فایده ای دارد؟

نوع دستیابی private برای فیلد ها باعث میشود تا دسترسی مستقیم به آنها محدود شود

کد زیر را ببینید.

class MyClass {
    private $name = 'Morteza';
    public function get_name() {
        return $this->name;
    }
}

$obj = new MyClass();
echo $obj->get_name(); // خروجی: Morteza

 با استفاده از متد get_name به صورت غیر مستقیم به فیلد name دسترسی داریم. همچنین می‌توانیم متد هایی برای set کردن مقادیر فیلد های private استفاده کنیم. در کد زیر متد set_name را اضافه می‌کنیم. با استفاده از این متد مقدار فیلد name را تغییر می دهیم.

class MyClass {
    private $name;

    public function get_name() {
        return $this->name;
    }
    public function set_name($new_name) {
        $this->name = $new_name;
    }
}

$obj = new MyClass();
$obj->set_name("Morteza");
echo $obj->get_name(); // خروجی: Morteza

$obj->set_name("Parsa");
echo $obj->get_name(); // خروجی: Parsa

با هر بار فراخوانی متد set_name آرگومان ارسال شده، در فیلد name قرار داده می‌شود.

نوع دستیابی protected و static

این دو نوع دستیابی نیازمند ارائه مطالب دیگری است. در قسمت های بعدی آموزش php آنها را بررسی خواهیم کرد.