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

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


دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *