به نام خدا
سلام و شب بخیر
تو این پست میخوایم در مورد Reflection صحبت کنیم.
این ویژگی توی بیشتر زبان های برنامه نویسی مثل Ruby, Java, PHP و ... هست ولی معمولا تو دوره های اموزشی در موردش صحبتی نمیشه، چون خودشو تو پروژه های بزرگ و فریم ورک ها نشون میده.
اگه با فریم ورک لاراول کار کرده باشین با بحث IOC Container ش سروکار داشتین، احتمالا براتون سوال بوده که لاراول چجوری میاد dependency های یک کلاس رو بهش میده. مثلا تو متد سازنده کلاس پایین چجوری میفهمه و میاد user رو تزریق میکنه؟
class UserController { public function __construct(User $user) { $this->user = $user; } }
یا شاید دیده باشین فریم ورک هایی که کامنت های متد (annotation) براشون مهم هستن و ازشون استفاده میکنن (مثل بعضی از پکیج ها که فایل سوگر رو میسازن)
فانکشن های get_class() یا method_exists() یا ... دیدیدن تو PHP؟
همه ی اینا و خیلی مثال های قشنگ دیگه همشون دارن از امکاناتی که reflection در اختیارشون میذاره استفاده میکنن.
خب دیگه وقتشه که بریم داشته باشیم اموزش امروز رو ...
این توضیحی هست که خود سایت php.net داده:
PHP comes with a complete reflection API that adds the ability to introspect classes, interfaces, functions, methods and extensions. Additionally, the reflection API offers ways to retrieve doc comments for functions, classes and methods.
رفلکشن تو PHP ابزاریه که بهتون امکان اینو میده تا بتونین تقریبا به تمام ساختار یک کلاس، اینترفیس، فانکشن، متد، اکستنشن دسترسی داشته باشین. حتی میتونین به کامنت های نوشته شده هم دسترسی داشته باشین (چقدر جذاب)
خب تا اینجای کار تونستیم رفلکشن رو تعریف کنیم
کلی کلاس و متد توی PHP برای استفاده از رفلکشن وجود داره که میتونین تو این لینک در موردشون بخونین.
من اینجا بعضی از پرکاربردترین هاشو براتون مثال میزنم
قطعه کد پایین رو در نظر بگیرین:
<?php namespace App; interface Commentable {} interface Likeable {} class DB {} class BaseModel {} class Post extends BaseModel implements Commentable, Likeable { public function __construct(DB $db) {} public function likes() {} public function comments() {} }
خب حالا با کمک رفلکشن میخوایم یسری اطلاعات از این کلاس داشته باشیم.
$reflection = new \ReflectionClass(App\Post::class);
بریم اسم و namespace بگیریم
echo $reflection->getName(); // App\Post echo $reflection->getShortName(); // Post echo $reflection->getNamespaceName(); // App
بریم اسم پدرش رو بگیریم
$parent = $reflection->getParentClass(); echo $parent->getName(); //App\BaseModel
اسم اینترفیس هاش
$interfaces = $reflection->getInterfaceNames(); var_dump($interfaces); // array(2) { [0]=> string(15) "App\Commentable" [1]=> string(12) "App\Likeable" }
لیست متدهاش
$methods = $reflection->getMethods(); var_dump($methods); // array(3) { [0]=> object(ReflectionMethod)#5 (2) { ["name"]=> string(11) "__construct // ["class"]=> string(8) "App\Post" } [1]=> object(ReflectionMethod)#6 (2) { ["name"]=> string(5) // "likes" ["class"]=> string(8) "App\Post" } [2]=> object(ReflectionMethod)#7 (2) { ["name"]=> // string(8) "comments" ["class"]=> string(8) "App\Post" } }
گرفتن متد سازندش و پارامترهاش
$constructor = $reflection->getConstructor(); $parameters = $constructor->getParameters(); var_dump($parameters); // array(1) { [0]=> object(ReflectionParameter)#9 (1) { ["name"]=> string(2) "db" } } echo $parameters[0]->getType()->getName(); // App\DB
خب تو این پست سعی کردم Reflection رو در PHP توضیح بدم، امیدوارم به قدرت این ابزار پی برده باشین و ایده های قشنگی به ذهنتون رسیده باشه. (حتما ی نگاه سطحی به کلاس ها و توابع اون بندازین)
در پست بعدی میخوام نحوه استفاده از اون رو در کلاسی مثل IOC Container لاراول رو توضیح بدم.
(تقلب: مثال اخر خیلی مهمه تو IOC Container)
اینجا این پست به پایان میرسه، ممنون که تا اخر همراه بودین
لطف میکنین اگه نظراتتون رو در کامنت بهم بگین، چون هم باعث میشه انرژی بگیرم و هم در پست های بعدی ازشون استفاده کنم