آموزش متد سازنده در PHP و استفاده از constructor در کلاس

هنگام ایجاد شیء از یک کلاس در زبان‌های برنامه‌نویسی محبوب، می‌توانیم یکسری تنظیمات و مقداردهی‌های اولیه را انجام دهیم. این کار به‌کمک متد سازنده (Constructor) اتفاق می‌اُفتد. در این آموزش با سازنده در PHP به زبان ساده آشنا شده و نحوه تعریف و استفاده از آن و نیز چند نکته کاربردی را بررسی می‌کنیم.

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

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

متد سازنده در PHP

هر بار که یک شیء از کلاسی ساخته می‌شود، به‌طور خودکار یک متد که به متد سازنده (Constructor) معروف است صدا زده می‌شود.

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

فرض کنید می‌خواهیم کلاسی برای کاربر (User) ایجاد کنیم. ساختار اولیه بدنه این کلاس چیزی شبیه به کد زیر می‌شود:

<?php
 class User {
     public $name;
     public $age;
 }

برای ایجاد شیء و مقداردهی مقادیر (نام و سن کاربر) به شکل زیر عمل می‌کنیم:

<?php
 $uesr = new User();
 $user->name = "Sahar";
 $user->age  = 22;

متد سازنده در PHP با نام __construct() تعریف می‌شود. دقت کنید که این متد باید public باشد. همچنین در ابتدایش دو تا _ دارد.

اگر چنین متدی در بدنه کلاس تعریف کنم، بدون اینکه آن را فراخوانی کنم، در هنگام ایجاد شیء از کلاس User (دقیقاً در جایی که new User() می‌نویسیم) این متد نیز فراخوانی می‌شود.

در کد زیر، در متد __construct() صرفاً یک پیام چاپ کرده‌ام.

<?php
  class User {
     public $name;
     public $age;

     public function __construct(){
         echo "User object created!";
     }
 }

حال اگر یک شیء از کلاس User ایجاد کنیم، پیامی که در متد سازنده نوشته بودم در خروجی چاپ می‌شود:

<?php
 $user = new User();

 // خروجی: User object created!

از متد سازنده در PHP و سایر زبان‌ها می‌توانیم برای مقداردهی اولیه مقادیر و نیز انجام یکسری فعالیت‌های منطقی (نظیر بررسی سطح دسترسی یا اجرای توابع خاص) در هنگام ایجاد شیء از کلاس استفاده کنیم.

استفاده از متد constructor در PHP

متد سازنده مانند سایر متدهایی که برای کلاس‌ها تعریف می‌کنیم، می‌تواند پارامترهای ورودی داشته باشد. اگر با تعریف پارامتر در توابع و روش‌ها و ترفندهای آن آشنا نیستید، آموزش تابع در PHP را ببینید.

در کلاس زیر، به‌عنوان پارامترهای ورودی متد سازنده، دو مقدار $name و $age را گرفته‌ام. در بدنه متد، این مقادیر را به ویژگی‌های کلاس (attribute یا property) انتساب می‌دهم.

<?php
  class User {
     public $name;
     public $age;

     public function __construct($name, $age){
         $this->name = $name;
         $this->age  = $age;
     }
 }

حال در هنگام ایجاد شیء از کلاس User باید حتماً این دو مقدار را به عنوان آرگومان‌های constructor در PHP تعیین کنم.

<?php
 $user = new User("Omid", 25);

پس از ایجاد شیء، مقدار ویژگی name در شیء $user با مقداری که به سازنده فرستاده بودیم برابر خواهد بود. یعنی اگر نام کاربر را چاپ کنیم، Omid را چاپ می‌شود:

<?php
 echo $user->name;

 // خروجی: Omid

دقت کنید که هیچ اجباری برای همسان بودن نام پارامترهای متد سازنده و ویژگی‌هایی که قرار است مقداردهی اولیه شوند نداریم. یعنی می‌توانستم به‌جای $name و $age نام‌های $n و $a را به‌عنوان ورودی‌های متد سازنده کلاس تعریف کنم.

دستور echo و print چاپ خروجی در php

دستور echo و print چاپ خروجی در php

کاربرد متد سازنده در PHP

متد __construct() به‌طور خودکار در هنگام ایجاد شیء صدا زده می‌شود. بنابراین می‌توان چهار مزیت یا کاربرد برای آن در نظر گرفت:

  • مقداردهی اولیه ویژگی‌ها (مثلاً تنظیم نام و ایمیل کاربر هنگام ساخت شیء)
  • بهبود خوانایی و نگهداری کد (به‌دلیل حذف روند مقداردهی دستی پس از ساخت شیء)
  • افزایش امنیت (می‌توان مقداردهی و همچنین روند ایجاد شیء را با شرط در PHP ترکیب کرد)
  • کاهش خطا (چون همیشه مقادیر موردنیازمان مقداردهی می‌شوند)

تعریف پارامتر با مقدار پیشفرض

مشابه تعریف تابع، با هدف انعطاف‌پذیری بیشتر و متناسب با نیازهای پروژه، می‌توانیم از پارامترهای پیش‌فرض (default) نیز استفاده کنیم.

مثلاً در قطعه کد زیر، در صورتی که مقدار age در هنگام فراخوانی سازنده تعریف نشده باشد، مقدار پیش‌فرض 18 به آن انتساب داده می‌شود.

<?php
 class User {
     public $name;
     public $age;

     public function __construct($name, $age = 18){
         $this->name = $name;
         $this->age  = $age;
     }
 }

این‌طوری می‌توانم هنگام ایجاد شیء، نام کلاس را با یک آرگومان یا دو آرگومان متناسب با نیازم فراخوانی کنم:

<?php
 $user1 = User("Hasti");   // name = Hasti, age = 18
 
 $user2 = User("Arman", 25); // name = Arman, age = 25

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

آموزش اتصال و کار با دیتابیس در PHP

آموزش اتصال و کار با دیتابیس در PHP

فراخوانی متد سازنده کلاس والد در PHP

اگر چندین کلاس داشته باشیم که از یکدیگر ارث‌بری کرده باشند، می‌توانیم متد سازنده کلاس والد را از کلاس فرزند صدا بزنیم.

در همان مثال کلاس User، فرض کنید می‌خواهیم کلاسی مخصوص کاربران VIP در سایت داشته باشیم. قاعدتاً برخی از رفتارها و ویژگی‌های این دو کلاس شبیه به یکدیگر هستند. بنابراین می‌توانم از خاصیت ارث‌بری (inheritance) استفاده کنم.

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

<?php
 class User {
     public function __construct(){
         echo "متد سازنده کلاس کاربر اجرا شد.";
		 echo "<br>";
     }
 }

 class VIPUser extends User {
     public function __construct(){
         parent::__construct();
         echo "سازنده کلاس کاربر ویژه اجرا شد.";
     }
 }

در متد سازنده کلاس VIPUser ابتدا متد سازنده والد (که کلاس User است) را صدا زده و سپس کارهای بعدی را انجام داده‌ام.

<?php
 $test = new VIPUser();

خروجی کد بالا چیزی شبیه به تصویر زیر می‌شود:

متد سازنده کلاس کاربر اجرا شد.
سازنده کلاس کاربر ویژه اجرا شد.

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

ارث بری در PHP : آموزش و ۳ نکته inheritance با مثال

ارث بری در PHP : آموزش و ۳ نکته inheritance با مثال

متد Destructor در PHP (پاکسازی خودکار)

مشابه متد __construct() که هنگام ایجاد شیء اجرا می‌شود، متد __destruct() هنگام حذف یا از بین رفتن شیء اجرا خواهد شد. این متد معمولاً برای آزادسازی منابع، بستن اتصالات دیتابیس و انجام عملیات‌هایی نهایی مرتبط با کلاس کاربرد دارد.

<?php
 class Test {
     public function __construct() {
         echo "شیء ساخته شد.";
     }

     public function __destruct() {
         echo "شیء از بین رفت.";
     }
 }

 $obj = new Test();  // output: شیء ساخته شد.
 unset($obj);        // output: شیء از بین رفت.

مشابه متد سازنده در PHP، می‌توانیم در بدنه متد __destruct() نیز هر ساختار کد (کار با متغیر، شرط، حلقه و …) استفاده کنیم.

مرور آموزش سازنده PHP

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

در بدنه این متد مانند هر متد دیگری می‌توانیم از ساختارهای مختلف و حتی فراخوانی سایر متدها نیز استفاده کنیم. یکی از ساختارهای پرتکرار، این است که در سازنده کلاس فرزند، متد سازنده والد را فراخوانی کنیم.

متد __destruct() به‌صورت خودکار در هنگام حذف شیء اجرا می‌شود و می‌توان از آن برای پاک‌سازی منابع و انجام کارهای انتهایی استفاده کرد. این متد بدون پارامتر تعریف می‌شود و نمی‌توان برای آن پارامتر ورودی تعیین کرد.

هر دوی این متدها در صورتی که تعریف شده باشند اجرا شده و درغیراینصورت اجرا نمی‌شوند. یعنی اگر این‌ها را تعریف نکنیم، هیچ اتفاق یا خطایی در کدهای ما رخ نمی‌دهد.

امیدوارم این آموزش برایتان مفید بوده باشد. اگر در مورد متد سازنده در PHP سؤالی یا چالشی دارید در بخش دیدگاه‌ها مطرح کنید تا پاسخ دهم.