
هنگام ایجاد شیء از یک کلاس در زبانهای برنامهنویسی محبوب، میتوانیم یکسری تنظیمات و مقداردهیهای اولیه را انجام دهیم. این کار بهکمک متد سازنده (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
را بهعنوان ورودیهای متد سازنده کلاس تعریف کنم.
کاربرد متد سازنده در 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
اگر چندین کلاس داشته باشیم که از یکدیگر ارثبری کرده باشند، میتوانیم متد سازنده کلاس والد را از کلاس فرزند صدا بزنیم.
در همان مثال کلاس 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 در کلاس فرزند تعریف نشده باشد، بهطور خودکار متد سازنده از کلاس والد فراخوانی میشود. در صورت تمایل میتوانید مثالهای آن را در مستندات انگلیسیاش (اینجا +) بخوانید.
متد 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 سؤالی یا چالشی دارید در بخش دیدگاهها مطرح کنید تا پاسخ دهم.
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم