آنچه در این آموزش قصد داریم مورد بررسی قرار دهیم مفهومی است تحت عنوان 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
هستند و از همین روی میتوان با استفاده از علامت <-
که در ارتباط با آبجکتها کاربرد دارد استفاده نمود.