رفلکشن قابلیتی در یک برنامه کامپیوتر است که میتوان ساختار و رفتار خود برنامه در زمان اجرا را بررسی کرد و تغییر داد.
طبق تعریف php.net : رفلکشن به ما قابلیت مهندسی معکوس کلاس ها، اینترفیس ها، توابع، متد ها و اکستنشن ها را میدهد به این معنی که بدانیم چه قابلیت هایی دارد. بعلاوه میتوان برای دریافت راهنمای (doc comments) کلاس ها، متدها و فانکشن ها از رفلکشن استفاده کرد.
این قابلیت از نسخه 5.6 به php اضافه شده است.
برای شروع چند دستور را که با این قابلیت در php وجود دارد را بررسی میکنیم
$ php --rf strlen اطلاعات تابع $ php --rc finfo اطلاعات کلاس $ php --re json اطلاعات اکستنشن $ php --ri dom اطلاعات کانفیگ اکستنشن
با اجرای php –rf strlen
Function [ <internal:Core> function strlen ] { - Parameters [1] { Parameter #0 [ <required> $str ] } }
اطلاعاتی که به ما میده این است که تابع مربوط به هسته اصلی php است و تعداد پارامتر های آن یکی است و آن پارامتر هم اجباری است. برای مقایسه میتوان خروجی های توابع دیگر را هم دید.
php --rf json_encode php --rf sprintf
و همچنین با با دستورات بالا میتوان اطلاعات کاملی در مورد تابع، کلاس، اکستنش و کانفیگ اکستنشن دریافت کرد. یعنی میتوان اطلاعاتی در مورد کلاس به دست آورد
php --rc DateTime Class [ class DateTime implements DateTimeInterface ] { - Constants [13] { Constant [ public string ATOM ] { Y-m-d\TH:i:sP } ... } - Static properties [0] { } - Static methods [3] { Method [ static public method __set_state ] { } ... } - Properties [0] { } - Methods [15] { Method [ <internal:date, ctor> public method __construct ] { - Parameters [2] { Parameter #0 [ $time ] Parameter #1 [ $timezone ] } } ... } }
اطلاعات کاملی از کلاس DateTime به ما میدهد از تعداد ثابت ها و پروپرتی ها و متد های استاتیک و سایر متد ها و برای هر متد و پروپرتی هم اطلاعات کلی از آن به ما می دهد.
برای اطلاعات اکستنشن و کانفیگ اکستنشن ها هم می توانیم از دستورات بالا استفاده کنیم و جزئیات آنها را بررسی کنیم.
خوب حالا برای کلاس ها و توابعی که خودمون تعریف کردیم باید چه کنیم ؟ (با یه پرش بلند خودمون رو به اعماق رفلکشن می رسونیم 🙂 )
ابتدا یک تابع می نویسیم
<?php
/**
* Echo bar
*/
function hello($name = 'World') : string
{
return 'Hello ' . $name . "\n";
}
// echo hello();
$rf = new \ReflectionFunction('hello');
echo $rf->getName();
// hello
echo $rf->getStartLine();
// 6
echo $rf->getEndLine();
// 9
echo $rf->getFileName();
// /home/user/Desktop/Reflection/function.php
echo $rf->getShortName();
// hello
echo $rf->getNamespaceName();
// hello
echo $rf->getDocComment();
// /**
// * Echo bar
// */
echo $rf->getReturnType();
// string
print_r($rf->getParameters());
/*
(
[0] => ReflectionParameter Object
(
[name] => name
)
)
*/
با استفاده از کلاس ReflectionFunction توانستیم کلی اطلاعات از یک فانکشن دریافت کنیم. از نام تابع، تا لاین شروع و پایان و فایلی که در آن وجود دارد و return type و … . حتی توانستیم کامنتی که خودمان نوشته بودیم هم دریافت کنیم.
و با کمی کنجکاوی می توانید اطلاعات بامزه دیگری هم با خواندن راهنمای کلاس ReflectionFunction پیدا کنید.
کاربرد : اگر از لاراول استفاده میکنید و دوست دارید بدانید تابع dd یا config در کدام فایل تعریف شده اند می تواند از این رفلکشن استفاده کنید.
به خروجی پارامتر ها دقت میکنید، یک پارامتر از نوع ReflectionParameter دارد و نام آن name است و خود یک آبجکت است که می توانیم خود پارامتر را هم دوباره بررسی کنیم (با رفلکشن مهندسی معکوس انجام بدیم). جالبه نه می توانیم ببینیم یک پارامتر فانکشن در php چه ویژگی هایی دارد 🙂 . و به همین صورت برای کلاس و ثابت ها و پروپرتی ها، نوع ها و ابجکت و … هم رفلکشن داریم.
ایده : با کنجکاوی کردن در اعماق رفلکشن ها می توانیم بفهمیم چقدر ساختار OOP در PHP را مسلط هستیم و با مفاهیم جالبی برخورد میکنیم که ارزش وقت گذاشتن دارد.
کلاس های تعریف شده برای رفلکشن کلاس ها، متد ها و …
Reflector
ReflectionClassConstant implements Reflector
ReflectionProperty implements Reflector
ReflectionClass implements Reflector
ReflectionObject extends ReflectionClass implements Reflector
ReflectionZendExtension implements Reflector
ReflectionExtension implements Reflector
ReflectionFunctionAbstract implements Reflector
ReflectionFunction extends ReflectionFunctionAbstract implements Reflector
ReflectionMethod extends ReflectionFunctionAbstract implements Reflector
ReflectionType
ReflectionNamedType extends ReflectionType
ReflectionParameter implements Reflector
ReflectionGenerator
Reflection
ReflectionException extends Exception
در پست بعدی در مورد ReflectionClass و ReflectionObject این بحث را ادامه می دهیم.
فایل های این بخش
منبع و مطاله بیشتر https://www.php.net/manual/en/book.reflection.php
Leave a Reply