کلاس های Anonymous در PHP (کلاس های ناشناس PHP)
در PHP 7، ویژگی جدیدی با نام کلاس های Anonymous یا ناشناس اضافه شده است که این نوع کلاسها، همانند توابع ناشناحته (Closure) عمل میکنند! شاید کمی گیج شده باشید، اما اجازه دهید ناشناس بودن را کمی شفافتر کنم.
تنها تفاوت کلاس و تابع ناشناس این است که اسم ندارند و در همان لحظهای که به آنها نیاز داریم، ایجاد و مورد استفاده قرار میگیرند. بنابراین شما تنها در همان لحظهی تعریف کلاس، یک نمونه از آن را ایجاد و مورد استفاده قرار میدهید؛ بدون اینکه نامی برای کلاس قرار دهید.
سینتکس تعریف کلاس ناشناس
1 |
new class (arguments) {definition} |
- arguments: ورودی های متد سازنده
- definition: بدنهی کلاس که در همان لحظه تعریف میشود
همانطور که میبینید، تنها تفاوت در این است که نمونه را از روی کلیدواژهی class میسازیم و اسمی از هیچ کلاسی نمیبریم! همچنین میتوانیم خروجی این نمونه را داخل یک متغیری نگه داریم و از آن مثل همیشه استفاده کنیم.
مثال
شما برای این که بتوانید یک کلاس عادی بسازید، از روند زیر استفاده میکنید:
1 2 3 4 5 6 7 8 9 |
class Logger { public function log($msg) { echo $msg; } } var_dump(new Logger()); |
همانطور که میبینید، کلاس را به صورت مستند شده تعریف میکنیم و هرجایی که بخواهیم، یک نمونه از آن میسازیم. ولی اگر بخواهیم همین کلاس را به صورت ناشناس تعریف کرده و یک نمونه از آن ایجاد کنیم، به صورت زیر عمل میکنیم:
1 2 3 4 5 6 |
var_dump(new class { public function log($msg) { echo $msg; } }); |
در اینجا ما کلاس را به صورت ناشناس ایجاد و بدنهی آن را هم پیاده سازی کردهایم. همچنین، اصلا ورودی متد سازنده را هم صدا نزدهایم؛ چرا که در بدنه اصلا متد سازندهای وجود ندارد!
همانند کلاسهای عادی
تمام کارهایی که در کلاسهای معمولی (همانند extends، implements و trait) انجام میدهیم، در کلاسهای ناشناس نیز قابل انجام است و همانطور که در ابتدای مطلب گفته شده، تنها تفاوت نبود نام است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class SomeClass {} interface SomeInterface {} trait SomeTrait {} var_dump(new class(10) extends SomeClass implements SomeInterface { private $num; public function __construct($num) { $this->num = $num; } use SomeTrait; }); |
شناسایی کلاسهای ناشناس
متدی با نام isAnonymous، به کلاس ReflectionClass خود PHP اضافه شده است تا از آن برای شناسایی این که فلان آبجکت از روی یک کلاس ناشناس میباشد یا نه، استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 |
class TestClass {} $anonClass = new class {}; $normalClass = new ReflectionClass('TestClass'); $anonClass = new ReflectionClass($anonClass); var_dump($normalClass->isAnonymous()); var_dump($anonClass->isAnonymous()); // خروجی: // bool(false) // bool(true) |
نظرات ثبت شده بدون دیدگاه