آشنایی با مفاهیم 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 به این زبان افزوده شده و امروزه استفاده از آن‌ها را در تمامی فریمورک‌های مطرح این زبان شاهد هستیم.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان