سازنده یا consrtuctor چیست؟

در قسمت قبل درباره کلاس ها در php صحبت کردیم. هر کلاس می‌تواند یک سازنده یا constructor داشته باشد.

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

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

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

class Student {
    public $name;
    public $family_name;
    public $age;
    public $city;

    public function get_student_info() {
        return $this->name . ' ' . $this->family_name . '. age: ' . $this->age . ' city: ' . $this->city;
    }

}

$student1 = new Student();
$student1->name = 'Morteza';
$student1->family_name = 'Ghorbani';
$student1->age = 28;
$student1->city = 'Anzali';
echo $student1->get_student_info();

$student2 = new Student();
$student2->name = 'Mohsen';
$student2->family_name = 'Ghorbani';
$student2->age = 25;
$student2->city = 'Shiraz';
echo $student2->get_student_info();

بر اساس قسمت قبل از آموزش php که کلاس‌ها را بررسی کردیم، عملکرد کد بالا واضح و روشن است و نیاز به توضیح نمی‌باشد. اما پس از ایجاد آبجکت های student1 و student2 ما شروع کردیم به مقداردهی فیلد های آن. این کار هرکدام با یک دستور انجام شد. سازنده ها این امکان را به ما می‌دهند تا در زمان ایجاد یک آبجکت بتوانیم فیلد های آن را هم مقداردهی اولیه کنیم. کانستراکتور ها در php با استفاده از __constroctor تعریف می شود و چون یک متد است، قبل از آن باید کلمه کلیدی function استفاده شود. کد زیر تعریف یک سازنده در کلاس را نشان می‌دهد که در حال حاضر کار خاصی انجام نمی‌دهد. برای تعریف سازنده ها از کلمه کلیدی public یا private استفاده نمیکنیم.

class Student {

    function __construct() {
        // نحوه تعریف یک سازنده
    }

}

همانطور که گفتیم سازنده هم یک متد ساده ولی از قبل تعریف شده در php است. بنابراین سازنده ها می‌توانند پارامتر داشته باشند. حالا کلاس دانشجو را با استفاده از سازنده ها پیاده سازی میکنیم و مقداردهی اولیه فیلد های آن را با استفاده از سازنده انجام می‌دهیم.

class Student {
    public $name;
    public $family_name;
    public $age;
    public $city;

    function __construct($std_name, $std_family_name, $std_age, $std_city) {
        $this->name = $std_name;
        $this->family_name = $std_family_name;
        $this->age = $std_age;
        $this->city = $city;
    }

    public function get_student_info() {
        return $this->name . ' ' . $this->family_name . '. age: ' . $this->age . ' city: ' . $this->city;
    }

}

$student1 = new Student("Morteza", "Matbou", 28, "Anzali");
echo $student1->get_student_info();

$student2 = new Student("Mohsen", "Ghorbani", 31, "Shiraz");
echo $student2->get_student_info();

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

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

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

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

پارامتر های اختیاری در سازنده ها

 با توجه به این موضوع که سازنده ها مانند توابع معمولی در php هستند و می توانند پارامتر داشته باشند، بنابراین پارامتر های سازنده می توانند مقادیر پیش فرض داشته باشند.

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

class TestClass {
    public $y, $y;

    function __construct($x, $y = 10) {
        $this->x = $x;
        $this->y = $y;
    }

    public function sum() {
        return $this->x + $this->y;
    }

}

$obj = new TestClass(20);
echo $obj->sum(); // خروجی: 30

کلاس TestClass دو عدد x و y را در سازنده خودش دریافت می کند و متد sum جمع این دو عدد را برمیگرداند. با توجه به مقدار اولیه 10 برای پارامتر y در صورت ارسال نکردن آرگومان، مقدار پیش فرض 10 برای فیلد y در نظر گرفته می‌شود.

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