• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Reflection یا Super Proxy
#1
سلام
امروز هم با یه کلاس جدید اشنا شدم
اسمش رو گذاشتن سوپر پروکسی
البته تو داکیومنت ش گفته که این کلاس یه جور رفلکشن انجام میده و اعضای پروتکتت و پرایوت یه کلاس دیگه رو قابل استفاده در بیرون از کلاس می کنه. صرف نظر از مورد استفاده رفلکشن و.... خود موضوع برام جالب بود.
کد پی‌اچ‌پی:
<?php
/**
 * This Software is open source and is published under GPL3
 *
 * @author Mathias Krieck [email protected]
 */

/**
 * Proxy class for accessing private and protected members and functions
 */
class SuperProxy
{
    
/**
     * Returns a Proxy class of $sSuperClassName that allows access to protected and private functions and members
     *
     * @param string $sSuperClassName class name
     * @param array  $aParams         constructor params
     *
     * @return object
     */
    
public static function getInstance$sSuperClassName, array $aParams = array() )
    {
        
$sClass          null;
        
$sProxyClassName "{$sSuperClassName}SUPERPROXY";

        if ( !
class_exists$sProxyClassNamefalse ) ) {

            
$oReflection = new ReflectionClass$sSuperClassName );

            
$aClass file$oReflection->getFileName() );
            
$iStart $oReflection->getStartLine() - 1;
            
$iEnd $oReflection->getEndLine() - 1;

            foreach ( 
$aClass as $iKey => $sValue ) {
                if ( 
$iStart <= $iKey && $iKey <= $iEnd ) {
                    
$sClass .= $sValue PHP_EOL;
                }
            }

            
$sClass str_replace$sSuperClassName$sProxyClassName$sClass );

            
$sClass preg_replace'/(.*)(protected|private) (.*function|.*\$.*)/i''$1public $3'$sClass );

            eval( 
$sClass );
        }

        if ( !empty( 
$aParams ) ) {
            
$oClass = new ReflectionClass$sProxyClassName );
            
$oInstance $oClass->newInstanceArgs$aParams );
        } else {
            
$oInstance = new $sProxyClassName();
        }

        return 
$oInstance;
    }
}
?>
http://www.phpclasses.org/browse/file/28447.html
یک مورد استفاده ش رو هم من می زارم



کد پی‌اچ‌پی:
class TestReflection
{
    private 
$VarPrivate="Test Reflection Private Var <BR>";    
    private function 
TestPrivateFunction()
    {
        echo 
$this->VarPrivate "Changed In Private Function";
    }
}

$ArrayConstructorInput = array();
$TestReflectionIns SuperProxy::getInstance("TestReflection",$ArrayConstructorInput);
echo 
$TestReflectionIns->VarPrivate;
echo 
$TestReflectionIns->TestPrivateFunction(); 

نکته ی قشنگ کار تو کد نویسی ورودی متد استاتیکه (getInstance) که یکیش حتما باید آرایه باشه. ( البته نمونه ش رو قبلا در غالب کلاس دیده بودیم)
نکته ی دیگه کار شیوه استفاده بود که برنامه نویس استفاده کرده. اون یه جورایی اومده کلاس رو باز نگری کرده. با استفاده از ابزار های رفلکشن پی اچ پی اونو از نو پیاده کرده.

مرجع استفاده از این امکانات :
http://ir.php.net/manual/en/class.reflectionclass.php
که البته باید زودتر کار ترجمه ش رو انجام بدم و بزارمش تو ویکی

Smile
علم تاج افتخار دنیا و یادگار پس از مرگ است
  پاسخ
تشکر شده توسط : admin Y.P.Y


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان