آنچه در این آموزش قصد داریم مورد بررسی قرار دهیم مفهومی است تحت عنوان Method Chaining که در برخی مواقع خاص در پروژههایی که بر اساس متودولوژی OOP توسعه داده میشوند کاربر دارد. برای شروع، داخل پوشهٔ oop پروژهای تحت عنوان method-chaining ساخته و ساختاری که تاکنون مورد استفاده قرار میدادیم را داخل آن ایجاد میکنیم به طوری که داریم:
mathod-chaining/
├── 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
حال داخل پوشهٔ classes فایل User.php را به صورت زیر تکمیل میکنیم:
<?php
namespace SokanAcademy;
class User
{
public function showFirstname()
{
echo 'Behzad ';
return $this;
}
public function showLastname()
{
echo 'Moradi';
}
}
ابتدا داخل فایل index.php آبجکتی از روی کلاس User ساخته و آن را اجرا میکنیم سپس به بررسی کدهای داخل این کلاس خواهیم پرداخت:
<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User();
$user->showFirstname()->showLastName();
همانطور که میبینیم، آبجکتی تحت عنوان user$ از روی کلاس User ساخته سپس متدهای ()showFirstname و ()showLastname را یکی پس از دیگری با درج علامت <- فراخوانی کردهایم به طوری که در خروجی خواهیم داشت:
Behzad Moradi
در واقع، در این پروژه توانستهایم صرفاً در قالب یک خط هر دو متد موجود داخل کلاس مذکور را فراخوانی نماییم. اگر مجدد به کلاس User برگردیم، میبینیم که داخل متد ()showFirstname پس از echo کردن استرینگ مذکور از دستور ;return $this استفاده کردهایم. کاری که این دستور انجام میدهد این است که پس از چاپ کردن استرینگ موجود، مقدار this$ ریترن میشود و تا این مرحله از دورهٔ آموزش OOP در PHP بارها و بارها تذکر دادهایم که this$ به کلاسی که داخل آن قرار داریم بازمیگردد؛ به عبارت دیگر، با فراخوانی متد ()showFirstname، در نهایت کلاس User داخل این متد ریترن میگردد و همین میشود که میتوان همچون یک آبجکت با آن رفتار کرده و علائم <- را قرار داده و متد بعدی که ()showLastname است را روی آن فراخوانی کرد. لازم به یادآوری است که همین کار را نیز میتوان برای متد ()showLastname انجام داد به طوری که داریم:
<?php
namespace SokanAcademy;
class User
{
public function showFirstname()
{
echo 'Behzad ';
return $this;
}
public function showLastname()
{
echo 'Moradi ';
return $this;
}
public function showDateOfBirth()
{
echo 1984;
}
}
همانطور که ملاحظه میشود، داخل متد ()showLastname نیز از دستور ;return $this استفاده کردهایم سپس متد دیگری تحت عنوان ()showDateOfBirth نوشتهایم که این وظیفه را دارا است تا تاریخ تولد کاربر را ریترن کند. حال به فایل index.php بازگشته و آن را به صورت زیر آپدیت میکنیم:
<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';
$user = new SokanAcademy\User();
$user->showFirstname()->showLastName()->showDateOfBirth();
چنانچه این فایل را اجرا کنیم، در خروجی خواهیم داشت:
Behzad Moradi 1984
در حقیقت، آبجکت اصلی user$ است اما متدهای ()showFirstname و ()showLastName نیز از آنجا که دستور this$ را ریترن کردهاند، به صورت انتزاعی حاوی کلاس User هستند و از همین روی میتوان با استفاده از علامت <- که در ارتباط با آبجکتها کاربرد دارد استفاده نمود.
