آموزش Reflection در php

Image تحقیقات

آموزش Reflection در php

سلام دوستای عزیزم.

بحث امروز ما درباره Reflectionهست.

به صورت ساده و خلاصه میشه گفت زمانی که شما با برنامه های تحت وب در حاال کار و پیاده سازی هستین بعضی مواقع نیاز دارین تا اطلاعاتی درباره ساختار یک کلاس داشته باشید.برای این کار میتونید از Reflectionاستفاده کنید. حالا در ادامه بیشتر با این قضیه آشنا میشیم.

 

Reflection چیست ؟

از php5 به بعد Reflection API درمعرفی شد که البته زیاد بین توسعه دهنده ها شناخته شده نیست و نبود .Reflection یک کلاس از پیش ساخته شده در php است که کمک زیادی میکنه ما بتونیم اطلاعاتی درباره یک کلاس خاص رو بازیابی کنیم (مانند پروپرتی هاش ، متدهاش و exceptions ..). میشه گفت در اکثر پروژه های ما Reflection مورد نیاز یست و خودشو در پروژه های بزرگ و پیچیده نشون میده (به عنوان مثال ساخت یک فریک ورک).

 

Reflection API چیست ؟

Reflection API یک object-oriented extension در زبان php است که با کلاس ها و متدهایی که داره کمک زیادی میکنه به ما برای استفاده از Reflection در php . در ادامه با این کلاس ها آشنا میشیم .

  1. ReflactionClass
  2. ReflectionObject
  3. ReflectionMethod
  4. ReflectionProperty
  5. ReflectionExtension

برای آشنایی با این کلاس ها مثال هایی رو با هم بررسی میکنیم .

 

ReflactionClass

کلاس ReflectionClass به ما کمک میکنه اطلاعات اصلی یک کلاس خاص رو بکشیم بیرون.

برای این کار اول ما باید یک آبجکت از نوع کلاس ReflectionClass بسازیم و نام کلاس مد نظرمون رو به اون پاس بدیم.

مثال :

$reflectionObj = new ReflectionClass("Imagick");
 
echo "Class name: ".$reflectionObj->getName()."
";
echo "Class new Instance: ".print_r($reflectionObj->newInstanceArgs())."
";
echo "Contants: ".print_r($reflectionObj->getConstants())."
";
echo "Constructor: ".print_r($reflectionObj->getConstructor())."
";
echo "Comment:".print_r($reflectionObj->getDocComment())."
";
echo "Properties: ".print_r($reflectionObj->getDefaultProperties())."
";
echo "Class Method: ".print_r($reflectionObj->getMethods())."
";

فرض میکنیم با تو پروژه یه کلاسی به اسم Imagick داریم… حالا میتونیم با استفاده از ReflactionClass  به اطلاعات دلخواهمون دست پیدا کنیم مثلا در کد بالا اول ما اومدیم یه آبجکت ساختیم از کلاسه ReflactionClass.بعد به وسیله متدهایی که در اختیارمون قرار میده این کلاس ، به اطلاعات مورد نظرمون دست پیدا میکنیم.

 

ReflectionObject

کلاسه ReflectionObject هم دقیقا مانند کلاس بالایی هست.با این تفاوت که به جای نام کلاس باید بهش یک آبجکت از اون کلاس مورد نظر بدیم.

مثال :

 $obj= new JobController();
    $class=new ReflectionObject($obj);
    var_dump($class->getName());

در مثال بالا ابتدا یه آبجکت از کلاس JobController ساختیم سپس اون آبجکت را به  ReflectionObject دادیم. حالا با استفاده از متدهای کلاسه  ReflectionObject میتوانیم هر اطلاعاتی که لازم داشتیم از دل کلاس JobController بیرون بکشیم.در خط 3 به نام کلاس دست پیدا کردیم.

 

ReflectionFunction

با استفاده از ReflectionFunction اطلاعاتی درباره یک فانکشن خاص بدست می آوردیم.

مثال :

/**
 * this Comment is For Index Function
 * @return string
 */
function index(){
    return 'my name is index';
}
$class= new ReflectionFunction('index');
    echo 'Name: '.$class->getName() . '
';
    echo 'StartLine: '.$class->getStartLine().'
';
    echo 'EndLine: '.$class->getEndLine().'
';
    echo 'Comment: '.$class->getDocComment().'
';

در مثال بالا اطلاعاتی درباره فانکشن index بدست آوردیم.

 

ReflectionMethod

با استفاده از ReflectionMethod اطلاعاتی درباره یک متد خواست بدست می آوریم.

مثال :

class Example 
{ 
    /** 
     * This is my DocComment! 
     * 
     * @DocTag: prints Hello World! 
     */ 
    public function myMethod() 
    { 
        echo 'Hello World!'; 
    } 
} 

function getDocComment($str, $tag = '') 
{ 
    if (empty($tag)) 
    { 
        return $str; 
    } 

    $matches = array(); 
    preg_match("/".$tag.":(.*)(\\r\\n|\\r|\\n)/U", $str, $matches); 

    if (isset($matches[1])) 
    { 
        return trim($matches[1]); 
    } 

    return ''; 
} 

$method = new ReflectionMethod('Example', 'myMethod'); 

// will return Hello World! 
echo getDocComment($method->getDocComment(), '@DocTag'); 

 

در مثال بالا مشاهده میکنید که توانستیم کامنت های متد Mymethod از کلاس  Example را به دست بیاوردیم.

 

ReflectionProperty

با کمک ReflectionProperty اطلاعاتی درباره یک پروپرتی از یک کلاس به دست می آوریم .پارامتر اول نام کلاس و پاراکتر دوم نام متد اون کلاس می باشد.

class MyClass
{
  public $var = 1;
  protected $var1 = 2;
}
$reflectionObj = new ReflectionProperty('MyClass', 'var1');
print_r($reflectionObj);

ReflectionExtension

ReflectionExtension اطلاعاتی درباره یک اکستنشن خاص به ما می دهد.

مثال :

 $reflect = new ReflectionExtension('curl');
    echo 'name: '.$reflect->getName(). '
';
    echo 'version: '.$reflect->getVersion(). '
';
    echo 'info: '.$reflect->info(). '
';

در کد بالا تمام اطلاعات لازم برای اکستنشن ZipArchive را به ما می دهد.

خب اینم از آموزش Reflection . امیدوارم کمک کرده باشه بهتون.