文字

范例

在反射文档中存在很多例子,通常位于每个类的 __construct 文档中。

Example #1 Shell 里的一个反射例子(一个终端)

$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom

以上例程的输出类似于:

Function [ <internal:Core> function strlen ] {  - Parameters [1] {
    Parameter #0 [ <required> $str ]
  }
}Class [ <internal:fileinfo> class finfo ] {  - Constants [0] {
  }  - Static properties [0] {
  }  - Static methods [0] {
  }  - Properties [0] {
  }  - Methods [4] {
    Method [ <internal:fileinfo, ctor> public method finfo ] {      - Parameters [2] {
        Parameter #0 [ <optional> $options ]
        Parameter #1 [ <optional> $arg ]
      }
    }    Method [ <internal:fileinfo> public method set_flags ] {      - Parameters [1] {
        Parameter #0 [ <required> $options ]
      }
    }    Method [ <internal:fileinfo> public method file ] {      - Parameters [3] {
        Parameter #0 [ <required> $filename ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }    Method [ <internal:fileinfo> public method buffer ] {      - Parameters [3] {
        Parameter #0 [ <required> $string ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }
  }
}Extension [ <persistent> extension #23 json version 1.2.1 ] {  - Constants [10] {
    Constant [ integer JSON_HEX_TAG ] { 1 }
    Constant [ integer JSON_HEX_AMP ] { 2 }
    Constant [ integer JSON_HEX_APOS ] { 4 }
    Constant [ integer JSON_HEX_QUOT ] { 8 }
    Constant [ integer JSON_FORCE_OBJECT ] { 16 }
    Constant [ integer JSON_ERROR_NONE ] { 0 }
    Constant [ integer JSON_ERROR_DEPTH ] { 1 }
    Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 }
    Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 }
    Constant [ integer JSON_ERROR_SYNTAX ] { 4 }
  }  - Functions {
    Function [ <internal:json> function json_encode ] {      - Parameters [2] {
        Parameter #0 [ <required> $value ]
        Parameter #1 [ <optional> $options ]
      }
    }
    Function [ <internal:json> function json_decode ] {      - Parameters [3] {
        Parameter #0 [ <required> $json ]
        Parameter #1 [ <optional> $assoc ]
        Parameter #2 [ <optional> $depth ]
      }
    }
    Function [ <internal:json> function json_last_error ] {      - Parameters [0] {
      }
    }
  }
}domDOM/XML => enabled
DOM/XML API Version => 20031129
libxml Version => 2.7.3
HTML Support => enabled
XPath Support => enabled
XPointer Support => enabled
Schema Support => enabled
RelaxNG Support => enabled

用户评论:

[#1] spectrum at bigmir dot net [2010-12-28 02:11:39]

Simple table generation using Reflection:

<?php

class A
{
    public    
$name 'Vasiliy';
    public    
$text 'Once upon a time';
}

class 
B
{
    public    
$name 'Had bought a cat';
    public    
$text 'named Valentine';
}

class 
grid
{
    public function 
build(  $dataSource$headers$fields  )
    {
        
$result '<table border="1">';
        
$result .= $this -> make_head$headers );
        
        foreach (
$dataSource as $source):
            
$class_name get_class($source);
            if ( 
$class_name != FALSE ):
                
$reflector = new ReflectionClass($source);
                echo 
'Class "'$class_name .'" found.<br />';
                
$result .= $this -> make_row$reflector$fields$source );
            endif;
        endforeach;
        
        
$result .= '</table>';
        return 
$result;
    }
    
    private function 
make_head$headers )
    {
        
$result '<tr>';
        foreach ( 
$headers as $header):
            
$result .= "<th>$header</th>";
        endforeach;
        
$result .= '</tr>';
        return 
$result;
    }
    
    private function 
make_row$reflector$fields$source )
    {
        
$result '<tr>';
        foreach ( 
$fields as $field ):
            if ( 
$reflector -> hasProperty($field) ):
                
$property $reflector -> getProperty($field);
                
$result .= '<td>'$property -> getValue($source) .'</td>';
            endif;
        endforeach;
        
$result .= '</tr>';
        return 
$result;
    }
}

$A = new A;
$B = new B;
$C 'Test';

$dataSource = array( $A$B$C );
$headers = array( 'H1''H2' );
$fields = array( 'name''text' );

$grid = new grid;
$table $grid -> build$dataSource$headers$fields );
echo 
$table;

?>

[#2] Kovin [2009-05-18 14:00:03]

If you want to use method closures and don't have PHP 5.3, perhaps you find useful the following function
<?php
    
function get_method_closure($object,$method_name){
        if(
method_exists(get_class($object),$method_name)){
            
$func            create_function'',
                            
'
                                $args            = func_get_args();
                                static $object    = NULL;
                                
                                
                                if(is_null($object) && count($args) && get_class($args[0])=="'
.get_class($object).'"){
                                    $object = $args[0];
                                    return;
                                }

                                if(!is_null($object)){
                                    return call_user_func_array(array($object,"'
.$method_name.'"),$args);
                                }else{
                                    return FALSE;
                                }'
                            
);
            
            
//Initialize static $object
            
$func($object);
            
            
//Return closure
            
return $func;
        }else{
            return 
false;
        }        
    }
?>

Here is how you would use it:
<?php
class foo{
    public function 
bar($foo){
        return 
strtolower($foo);
    }
}

$foo = new foo();
$f get_method_closure($foo,'bar');
echo 
$f("BAR");//Prints 'bar'
?>

上一篇: 下一篇: