رفلکشن در پی اچ پی - Reflection in PHP

به نام خداسلام و شب بخیرتو این پست میخوایم در مورد Reflection صحبت کنیم.این ویژگی توی بیشتر زبان های برنامه نویسی مثل Ruby, Java, PHP و ... هست ولی معمولا تو دوره های اموزشی در موردش صحبتی نمیشه، چون خودشو تو پروژه های بزرگ و فریم ورک ها نشون میده.Reflection in PHPاگه با فریم ورک لاراول کار کرده باشین با بحث IOC Container ش سروکار داشتین، احتمالا براتون سوال بوده که لاراول چجوری میاد dependency های یک کلاس رو بهش میده. مثلا تو متد سازنده کلاس پایین چجوری میفهمه و میاد user رو تزریق میکنه؟class UserController { public function __construct(User $user) { $this->user = $user; } }یا شاید دیده باشین فریم ورک هایی که کامنت های متد (annotation) براشون مهم هستن و ازشون استفاده میکنن (مثل بعضی از پکیج ها که فایل سوگر رو میسازن)فانکشن های get_class() یا method_exists() یا ... دیدیدن تو PHP؟ همه ی اینا و خیلی مثال های قشنگ دیگه همشون دارن از امکاناتی که reflection در اختیارشون میذاره استفاده میکنن.خب دیگه وقتشه که بریم داشته باشیم اموزش امروز رو ...تعریف 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) &quotApp\Commentable&quot [1]=> string(12) &quotApp\Likeable&quot }لیست متدهاش$methods = $reflection->getMethods(); var_dump($methods); // array(3) { [0]=> object(ReflectionMethod)#5 (2) { [&quotname&quot]=> string(11) &quot__construct // [&quotclass&quot]=> string(8) &quotApp\Post&quot } [1]=> object(ReflectionMethod)#6 (2) { [&quotname&quot]=> string(5) // &quotlikes&quot [&quotclass&quot]=> string(8) &quotApp\Post&quot } [2]=> object(ReflectionMethod)#7 (2) { [&quotname&quot]=> // string(8) &quotcomments&quot [&quotclass&quot]=> string(8) &quotApp\Post&quot } }گرفتن متد سازندش و پارامترهاش$constructor = $reflection->getConstructor(); $parameters = $constructor->getParameters(); var_dump($parameters); // array(1) { [0]=> object(ReflectionParameter)#9 (1) { [&quotname&quot]=> string(2) &quotdb&quot } } echo $parameters[0]->getType()->getName(); // App\DBخب تو این پست سعی کردم Reflection رو در PHP توضیح بدم، امیدوارم به قدرت این ابزار پی برده باشین و ایده های قشنگی به ذهنتون رسیده باشه. (حتما ی نگاه سطحی به کلاس ها و توابع اون بندازین)در پست بعدی میخوام نحوه استفاده از اون رو در کلاسی مثل IOC Container لاراول رو توضیح بدم. (تقلب: مثال اخر خیلی مهمه تو IOC Container)اینجا این پست به پایان میرسه، ممنون که تا اخر همراه بودینلطف میکنین اگه نظراتتون رو در کامنت بهم بگین، چون هم باعث میشه انرژی بگیرم و هم در پست های بعدی ازشون استفاده کنم