آموزش OOP در PHP (فصل 1)

آشنایی با مفاهیم Class و Object در متودولوژی OOP


پیش از این گفتیم که هر کلاس از دو ویژگی تحت عناوین Attribute و Behavior برخوردار است که به ترتیب نشانگر خصیصه‌های کلاس مذکور و کارهایی که آن کلاس از عهده‌ٔ آن‌ها برمی‌آید هستند. در عین حال، در متودولوژی شیئ‌گرایی این دو اصطلاح تحت عناوین دیگری نیز به کار می‌روند که عبارتند از Property و Method که در طول این دوره از این معادل‌ها استفاده خواهیم کرد. به منظور درک بهتر این موضوع، ابتدا داخل پوشهٔ oop که در آموزش گذشته ساختیم پوشهٔ جدیدی با نامی دلخواه همچون class-and-object ساخته سپس فایلی به نام index.php حاوی کدهای زیر داخل آن می‌سازیم:

<?php
class User
{
    public $name = "Behzad";
    public $lastName = "Moradi";
    public $dob = 1362;

    public function showFullName()
    {
        return $this->name . ' ' . $this->lastName;
    }
}

در خط اول، تگ آغازین php?> را نوشته سپس از کلیدواژه یا کیورد class استفاده کرده که وظیفهٔ ساخت کلاس را بر عهده دارد و نامی دلخواه همچون User برای کلاس خود انتخاب نموده‌ایم.به خاطر داشته باشیددر تمامی زبان‌های برنامه‌نویسی Keyword به یک سری دستورات گفته می‌شود که به صورت پیش‌فرض در هستهٔ زبان برنامه‌نویسی گنجانده شده و معنای خاصی دارند و از همین روی نمی‌توان از آن‌ها برای نام‌گذاری متغیرها، کلاس‌ها، متدها و … استفاده نمود.

آنچه می‌خواهیم متعلق به کلاس مذکور باشد را می‌باید داخل علائم {} بنویسیم به طوری که علامت } به منزلهٔ نقطهٔ شروع این کلاس است و علامت { نیز پایان این کلاس را مشخص می‌سازد. اساساً هر متغیری که داخل بدنهٔ کلاس یا به عبارتی مابین علائم } و { تعریف شده تحت عنوان Property شناخته می‌شود و همان‌طور که پیش از این متذکر شدیم، پراپرتی‌ها به عنوان خصائص یا ویژگی‌های یک کلاس تلقی می‌شوند. به طور مثال، در کلاس فوق سه پراپرتی تعریف کرده‌ایم تحت عناوین name$ و lastName$ و همچنین dob$ که برای هر کدام از آن‌ها نیز یک مقدار اولیه در نظر گرفته‌ایم. نکتهبا توجه به این که کلاس همچون نقشهٔ یک خانه است که در آن خصوصیات کلی خانه مشخص می‌گردد، لذا استفاده از مقادیر پیش‌فرض برای پراپرتی‌ها خیلی کار صحیحی نیست بلکه این کار می‌باید در حین ساخت آبجکت از طریق مفاهیمی همچون Setter و Getter صورت گیرد اما در کلاس فوق صرفاً جهت آموزش این موضوع از مقادیر پیش‌فرض استفاده شده است.

همان‌طور که ملاحظه می‌شود، پیش از نام این پراپرتی‌ها (متغیرها) از کیورد public استفاده کرده‌ایم که اصطلاحاً یک Access Modifier است. به عبارتی، این کیورد مشخص‌کنندهٔ سطح دسترسی این پراپرتی‌ها است و همان‌طور که از نامش مشخص است، از هر کجای سورس‌کد می‌توان به این پراپرتی‌ها دسترسی پیدا کرد زیرا اساساً به شکلِ عمومی تعریف شده‌اند (در آموزش‌های آتی به طور مفصل پیرامون انواع سطوح دسترسی صحبت خواهیم نمود.)

در ادامه، یک فانکشن/متد/تابع تحت عنوان ()showFullName ساخته‌ایم که این وظیفه را دارا است تا مقدار پراپرتی‌های name$ و lastName$ را بازگرداند. در زبان برنامه‌نویسی پی‌اچ‌پی، به منظور تعریف یک متد از کیوردfunction استفاده می‌کنیم و از آنجا که می‌خواهیم سطح دسترسی این متد عمومی‌ باشد، پیش از هر چیز از کیوردpublic استفاده نموده‌ایم.

در نام‌گذاری این متد، از روش اصطلاحاً camelCase استفاده نموده‌ایم بدین شکل که حرف اول کلمهٔ اول کوچک سپس حرف اول سایر کلمات به صورت بزرگ نوشته می‌شود. به عبارتی، می‌توان گفت که نام متد به صورت شماتیک همچون کوهان شتر خواهد بود (توجه داشته باشیم که در نام‌گذاری متدها نمی‌توان نام متد را با یک عدد آغاز کرد و یا از اِسپیس یا دَش برای جداسازی کلمات استفاده نمود.)

حال برسیم به محتوای داخل متد ()showFullName که با کیورد return آغاز می‌شود. در واقع، هر جایی از کد که از این کلیدواژه استفاده شود، دستوری که پس از آن قرار می‌گیرد بازگردانده شده و سایر دستوراتی که در خطوط بعدی قرار گرفته‌اند دیگر اجرا نخواهند شد. با این توضیحات، داخل این متد دستور داده‌ایم که در صورت فراخوانی این متد، یک اِسپیس مابین پراپرتی‌های name$ و lastName$ قرار گرفته و مجموعه کل این استرینگ ریترن گردد.

چیزی که در اینجا نیاز به توضیح بیشتر دارد، کیورد this$ است. در حقیقت،‌ این کیورد به خودِ کلاس User اشاره دارد که با در نظر داشتن این نکته می‌توان گفت که دستور this->name$ را بدین شکل می‌توان تفسیر نمود که گفته‌ایم «این کلاس» را مبنا قرار داده سپس به دنبال یک پراپرتی تحت عنوان name گشته و مقدار آن را به دست آورده‌ایم. نکتهٔ دیگری که در ارتباط با this$ می‌باید به خاطر داشته باشیم آن است که به منظور هدف قرار دادن یک پراپرتی، پس از کیورد this$ از علائم <- استفاده نموده، سپس علامت $ پراپرتی را حذف نموده و صرفاً نام آن را درج می‌کنیم.

تا این مرحله از کار،‌ توانسته‌ایم با موفقیت یک کلاس بسیار ساده که حاوی یک سری پراپرتی و یک متد است بسازیم. حال در ادامه قصد داریم ببینیم که به چه شکل می‌توان این کلاس را مورد استفاده قرار داد که برای این منظور، کدهای فوق را به صورت زیر تکمیل می‌کنیم:

<?php
class User
{
    public $name = "Behzad";
    public $lastName = "Moradi";
    public $dob = 1362;

    public function showFullName()
    {
        return $this->name . ' ' . $this->lastName;
    }
}

$objectMadeFromUserClass = new User();
echo $objectMadeFromUserClass->showFullName();

از روی کلاس User، آبجکتی با نامی دلخواه همچون objectMadeFromUserClass$ که نامی بامسمی است ساخته سپس در خط پانزدهم متد ()showFullName را روی این آبجکت فراخوانی کرده و با دستور echo خروجی آن را چاپ کرده‌ایم به طوری که خواهیم داشت:

Behzad Moradi

توجه داشته باشیم که به منظور ساخت یک آبجکت جدید از روی کلاسی خاص، می‌باید از کیورد new استفاده نماییم. همچنین آوردن علائم () پس از نام کلاس در چنین شرایطی اختیاری است؛ به عبارتی، هم User و هم ()User هر دو صحیح هستند اما این در حالی است که اگر کانستراکتور این کلاس پارامتر ورودی بگیرید، درج علائم () ضروری است (در ادامهٔ آموزش‌ها به طور مفصل با مفهوم کانستراکتور آشنا خواهیم شد.)

با توجه به این که سازوکار دستور return برای دولوپرهایی که تازه‌کار هستند ممکن است کمی گیج‌کننده باشد، در ادامه سعی می‌کنیم این موضوع را بیشتر توضیح دهیم. برای این منظور، کد فوق را به صورت زیر ریفکتور می‌کنیم:

<?php
class User
{
    public $name = "Behzad";
    public $lastName = "Moradi";
    public $dob = 1362;

    public function showFullName()
    {
        echo $this->name . ' ' . $this->lastName;
    }
}

$objectMadeFromUserClass = new User();
$objectMadeFromUserClass->showFullName();

همان‌طور که ملاحظه می‌شود، داخل متد ()showFullName دستور return را حذف کرده و از دستور echo به جای آن استفاده کرده‌ایم که این تغییر باعث می‌گردد به محض فراخوانی این متد، مقادیر پارامترهایی که پس از دستور echoآمده‌اند چاپ گردد. با توجه به این که خود این متد دیگر به جای ریترن کردن استرینگ مد نظر آن را چاپ می‌کند، لذا در خط پانزدهم دیگر لزوی به درج دستور echo نخواهیم داشت و در صورت اجرای این اسکریپت، خروجی در کنسول یا مرورگر چاپ خواهد شد. با مد نظر قرار دادن این توضیحات، می‌توان به این نتیجه رسید که دستور return آنچه در ادامه‌اش قرار می‌گیرد را به عنوان خروجی متد ارسال می‌کند و تصمیم با ما است که در حین استفاده از آن متد و با استفاده از دستور echo آن خروجی را چاپ کنیم یا نکنیم.

درآمدی بر تفاوت‌های مابین فانکشن و متد

پیش از این گفتیم که ()showFullName را هم می‌توان فانکشن قلمداد کرد و هم متد اما اگر بخواهیم کمی دقیق‌تر به موضوع نگاه کنیم، اساساً Function و Method دو مقوله متفاوت از یکدیگر هستند که در ادامه تفاوت‌های آن‌ها را بازگو خواهیم کرد. برای روشن‌تر شدن موضوع، تکه کد زیر را مد نظر قرار می‌دهیم:

function multiply($numOne, $numTwo)
{
    echo $numOne * $numTwo;
}

multiply(2, 5);

تابعی تعریف کرده‌ایم تحت عنوان ()multiply که دو پارامتر ورودی گرفته، آن‌ها را در یکدیگر ضرب کرده و خروجی را چاپ می‌کند و در ادامه هم می‌بینیم که چگونه آن را مورد استفاده قرار داده‌ایم. در یک اسکریپت معمولی که به روش Procedural نوشته شده باشد، این بلوک از کد فانکشن نامیده می‌شود. حال چنانچه این بلوک از کد داخل یک کلاس قرار گیرد، تحت عنوان متد شناخته خواهد شد به طوری که داریم:

class Calculator
{
    function multiply($numOne, $numTwo)
    {
        echo $numOne * $numTwo;
    }
}

$cal = new Calculator();
$cal->multiply(2, 5);

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

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

جمع‌بندی
در این آموزش با مفاهیم اصلی شیئ‌گرایی از جمله کلاس و آبجکت آشنا شده و دیدیم که به چه شکل می‌توان یک سری پراپرتی و متد برای کلاس‌ خود در نظر گرفته و پس از ساخت آبجکت آن‌ها را فراخوانی نمود. همچنین در ادامه به بررسی مقولهٔ اُتولودینگ پرداخته و ملاحظه شد که به چه شکل می‌توان به صورت خودکار کلاس‌های مورد استفاده را داخل فایل‌های مد نظر خود ایمپورت نمود و در نهایت هم به بررسی مقولهٔ نِیم‌اِسیپس‌ها پرداختیم که پس از PHP 5.3 به این زبان افزوده شده و امروزه استفاده از آن‌ها را در تمامی فریمورک‌های مطرح این زبان شاهد هستیم.

آشنایی با مفاهیم Constructor و Destructor در OOP


در مبحث شیئ‌گرایی و ساخت کلاس، دو مقوله داریم تحت عناوین Constructor و Destructor که در این آموزش قصد داریم با ذکر چند مثال، کاربرد آن‌ها را توضیح دهیم. واژهٔ Constructor از فعل Construct به معنی «ساختن» و واژهٔ Destructor از فعل Destruct به معنی «نابود کردن» گرفته شده و معنای تحت‌الفظی آن‌ها به ترتیب «سازنده» و «نابودکننده» است.

در مبحث شیئ‌گرایی این دو اصطلاح بدین صورت نمود عینی پیدا می‌کنند که به محض ساخت یک آبجکت از روی کلاسی خاص، مُفسر پی‌اچ‌پی کانستراکتور آن کلاس که به صورت پیش‌فرض از نظر پنهان است را به صورت خودکارفراخوانی می‌کند و در نهایت هم وقتی کار با آن کلاس به اتمام رسید، دیستراکتور فراخوانی خواهد شد. به طور کلی، هر زمانی که بخواهیم پس از ساختن یک آبجکت از روی یک کلاس تَسکی را اول از همه و آن هم به صورت خودکار انجام دهیم، باید از کانستراکتور استفاده نماییم. در مقابل کانستراکتور، مفهوم دیگری داریم تحت عنوان دیستراکتور که زمانی فراخوانی می‌شود که یک آبجکت از بین می‌رود و از جمله مواقعی که یک شیئ از بین می‌رود می‌توان به زمانی اشاره کرد که اسکریپت ما به اِتمام رسیده که بالتبع بخشی از حافظهٔ اِشغال‌شده توسط آن اسکریپت نیز آزاد می‌شود (همچنین زمانی که از متدی تحت عنوان ()unset استفاده می‌کنیم، آبجکت ساخته‌شده از بین خواهد رفت.)  هشدارتحت هیچ عنوان داخل کانستراکتور نمی‌توان از دستور return استفاده نمود.

در ارتباط با کانستراکتور در زبان پی‌اچ‌پی باید گفت که نوعی از متدها است که تحت عنوان Magic Method شناخته می‌شوند و این در حالی است که همچون متدها، می‌توانند پارامتر ورودی بگیرید اما در ارتباط با دیستراکتور، امکان درج هیچ گونه پارامتر ورودی را نخواهیم داشت. همچنین لازم به یادآوری است که در این زبان برای ساخت یک کانستراکتور ابتدا کیورد function را نوشته سپس دستور ()construct__ را می‌نویسیم و برای ساخت دیستراکتور نیز پس از درج کیورد function از دستور ()destruct__ استفاده می‌کنیم.

برای درک بهتر سازوکار کانستراکتور و دیستراکتور در زبان پی‌اچ‌پی، داخل پوشهٔ oop پوشه‌ای با نامی دلخواه همچون constructor-and-destructor ساخته و ساختار زیر را برای آن در نظر می‌گیریم:

constructor-and-destructor
├── classes
│   └── User.php
├── composer.json
├── index.php
└── vendor
    ├── autoload.php
    └── composer
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        ├── autoload_real.php
        ├── autoload_static.php
        ├── ClassLoader.php
        └── LICENSE

در واقع، محتویات این پوشه یک کپی از کدهایی است که در آموزش گذشته در پروژهٔ class-and-object ایجاد کردیم سپس فایل‌های اضافی را حذف کرده و تنها کلاس User را داخل پوشهٔ classes نگاه داشته‌‌ایم که حاوی کدهای زیر است:

<?php
namespace SokanAcademy;

class User
{
    public function __construct()
    {
        echo "Constructor called\n";
    }

    public function __destruct()
    {
        echo "Destcutor called";
    }
}

طبق نکات مطرح شده در آموزش گذشته، ابتدا به ساکن نِیم‌اِسپیس این فایل را مشخص ساخته سپس کلاسی تحت عنوان User ساخته‌ایم که داخل آن دو به اصطلاح Magic Method نوشته‌ایم. متد ()construct__ یا همان کانستراکتور این وظیفه را دارا است تا به محض ساخت یک آبجکت جدید از روی کلاس User، به صورت خودکار فراخوانی شده و استرینگی که ملاحظه می‌شود را چاپ کند و پس از پایان اجرای اسکریپتی که داخل فایل index.phpخواهیم نوشت، متد ()desstruct__ یا  همان دیستراکتور فراخوانی می‌گردد. حال به فایل index.php که به منزلهٔ نقطهٔ شروع برنامه است مراجعه کرده و آن را به صورت زیر تکمیل می‌کنیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
new SokanAcademy\User();

می‌بینیم که صرفاً کلاس User را فراخوانی کرده‌ایم و در صورت اجرای این فایل به عنوان خروجی خواهیم داشت:

/var/www/oop/constructor-and-destructor$ php index.php
Constructor called
Destcutor called

می‌بینیم که به محض استفاده از این کلاس، کانستراکتور فراخوانی شده و دستور echo داخل آن اجرا گردیده است و پس از پایان این اسکریپت نیز که کلاس User دیگر بلااستفاده است، دیستراکتور فراخوانی شده و این آبجکت از داخل مموری حذف می‌گردد. حال به منظور درک بهتر سازوکار دیستراکتور، کدهای فوق را به صورت زیر تغییر می‌دهیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User();
sleep(10);
unset($user);

کاری که انجام داده‌ایم این است که آبجکت ساخته‌شده از روی کلاس User را داخل متغیری تحت عنوان user$ ریخته سپس از فانکشن به اصطلاح Built-in زبان پی‌اچ‌پی تحت عنوان ()sleep استفاده کرده و در نهایت با استفاده از فانکشن ()unset آبجکت user$ را از بین برده‌ایم. در حقیقت، فانکشن ()sleep یک پارامتر ورودی در قالب ثانیه می‌گیرد و به همان میزان صبر کرده سپس ادامهٔ کدها را اجرا می‌کند به طوری که در صورت اجرای اسکریپت فوق خواهیم داشت:

/var/www/oop/constructor-and-destructor$ php index.php
Constructor called

می‌بینیم که به محض اجرای اسکریپت فوق، کانستراکتور به صورت خودکار فراخوانی شده اما از آنجا که اسکریپت به پایان نرسیده و بالتبع آبجکت user$ از بین نرفته است،‌ دیستراکتور فراخوانی نشده بلکه پس از ۱۰ ثانیه وقفه که اجرای اسکریپت به پایان برسد کال خواهد شد.

گفتیم که کانستراکتورها همچون متدهای معمولی می‌توانند پارامتر ورودی بگیرید و همین مسئله باعث می‌گردد تا به سادگی بتوانیم پراپرتی‌های موجود در بدنهٔ کلاس را برای هر آبجکت خاص مقداردهی کنیم که برای درک بهتر این موضوع، کلاس User را به صورت زیر تکمیل می‌کنیم:

<?php
namespace SokanAcademy;

class User
{
    public $fName;
    public $lName;

    public function __construct($firstname, $lastname)
    {
        $this->fName = $firstname;
        $this->lName = $lastname;
        echo "This user`s firstname is $this->fName and lastname is $this->lName \n";
    }

    public function __destruct()
    {
        echo "Destcutor called";
    }
}

همان‌طور که ملاحظه می‌شود، دو پراپرتی تحت عناوین fName$ و lName$ در بدنهٔ کلاس خود تعریف کرده‌ایم سپس برای کانستراکتور این کلاس دو پارامتر ورودی با نام‌هایی دلخواه همچون firstname$ و lastname$ در نظر گرفته‌ایم و داخل بدنهٔ این متد نیز با استفاده از دستور this$ پراپرتی‌ها را هدف قرار داده و مقادیر آن‌ها را برابر با مقدار پارامترهای ورودی کانستراکتور قرار داده‌ایم و در نهایت آن‌ها را در قالب یک استرینگ چاپ کرده‌ایم. در این مرحله از کار، فایل index.php نیز به صورت زیر خواهد بود:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User();

که پس از اجرای آن خواهیم داشت:

PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function SokanAcademy\User::__construct(), 0 passed in /var/www/oop/constructor-and-destructor/index.php on line 4 and exactly 2 expected in /var/www/oop/3-constructor-and-destructor/classes/User.php:8

در واقع، از آنجا که پارامترهای ورودی کانستراکتور کلاس User اجباری هستند، پس حین ساخت کلاس نیز می‌باید آن‌ها را پاس دهیم که برای رفع این ارور، کدهای فوق را به صورت زیر تکمیل می‌کنیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User("Behzad", "Moradi");

که در صورت اجرای مجدد این اسکریپت در خروجی خواهیم دید:

This user`s firstname is Behzad and lastname is Moradi
Destcutor called

با این توضیحات، هر زمانی که کانستراکتور موجود داخل کلاس پارامتر ورودی می‌گیرد، در حین ساخت کلاس می‌باید علائم () را پس از نام کلاس درج کرده و پارامتر/پارامترهای ورودی را پاس دهیم و در غیر این صورت، صرفاً می‌توان نام کلاس را نوشته و علائم () را حذف کرد. همچنین به صورت زیر می‌توان یک مقدار پیش‌فرض برای پارامترهای ورودی کانستراکتور در نظر گرفت تا آن‌ها را از حالت اجباری بودن خارج ساخت:

public function __construct($firstname = null, $lastname = null)
{
    $this->fName = $firstname;
    $this->lName = $lastname;
    echo "This user`s firstname is $this->fName and lastname is $this->lName \n";
}

یکی دیگر از کاربردهای کانستراکتورها در زبان پی‌اچ‌پی آن است که از طریق آن‌ها متدی را فراخوانی کنیم که برای درک بهتر این موضوع، مجدد به کلاس User باز می‌گردیم:

<?php
namespace SokanAcademy;

class User
{
    public $fName;
    public $lName;

    public function __construct($firstname, $lastname)
    {
        $this->fName = $firstname;
        $this->lName = $lastname;
        echo "This user`s firstname is $this->fName and lastname is $this->lName \n";
    }

    public function doSomething()
    {
        echo "This method is going to do something in the future. \n";
    }

    public function __destruct()
    {
        echo "Destcutor called";
    }
}

در واقع، متدی ساخته‌ایم تحت عنوان ()doSomething که این وظیفه را دارا است تا استرینگی را چاپ کند؛ سپس فایلindex.php را به صورت زیر آپدیت می‌کنیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User("Behzad", "Moradi");
$user->doSomething();

می‌بینیم که متد مذکور را روی آبجکت user$ فراخوانی کرده‌ایم به طوری که در خروجی خواهیم داشت:

This user`s firstname is Behzad and lastname is Moradi
This method is going to do something in the future.
Destcutor called

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

<?php
namespace SokanAcademy;

class User
{
    public $fName;
    public $lName;

    public function __construct($firstname, $lastname)
    {
        $this->fName = $firstname;
        $this->lName = $lastname;
        echo "This user`s firstname is $this->fName and lastname is $this->lName \n";
        $this->doSomething();
    }

    public function doSomething()
    {
        echo "This method is going to do something in the future. \n";
    }

    public function __destruct()
    {
        echo "Destcutor called";
    }
}

در حقیقت، به همان گونه‌ای که پراپرتی‌ها را داخل کانستراکتور فراخوانی کرده‌ایم، با استفاده از دستور this$ متد مذکور را کال کرده‌ایم و در ادامه نیز فایل index.php را به صورت زیر تغییر می‌دهیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User("Behzad", "Moradi");

می‌بینیم که دیگر به صورت صریح متد مذکور را کال (فراخوانی) نکرده‌ایم و این در صورتی است که پس از اجرای این اسکریپت، پیش از هر چیز کانستراکتور اجرا شده و از آنجا که متد ()doSomething را داخل آن فراخوانی کرده‌ایم، این متد اجرا شده و استرینگ مرتبط با آن نیز در معرض دیدمان قرار خواهد گرفت و وقتی این کار با موفقیت انجام شد، دیستراکتور کال خواهد شد و آبجکت ساخته‌شده از روی کلاس User تحت عنوان user$ اصطلاحاً Destroy خواهد شد.

جمع‌بندی
به طور کلی، اگر کانستراکتور را داخل کلاس‌های خود تعریف نکنیم، این کار به صورت خودکار توسط خود مُفسر پی‌اچ‌پی صورت می‌گیرد اما در پروسهٔ‌ توسعهٔ نرم‌افزار مواقعی پیش می‌آید که نیاز داریم تا بلافاصله پس از ساخت کلاس، متد خاصی اجرا گردد و یا نیاز داریم تا یک آبجکت از کلاسی دیگر به کلاس مذکور پاس دهیم که چنین چیزی از طریق ساخت کانستراکتور به سادگی امکان‌پذیر است (لازم به یادآوری است که این قابلیت تحت عنوان Dependency Injection شناخته می‌شود که در آموزش‌‌های آتی آن را مورد بررسی قرار خواهیم داد.)

مطالب مرتبط

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *