0
在线手册:中文 英文

范例

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

示例 #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] {
      }
    }
  }
}
dom
DOM/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
0
在线手册:中文 英文

3位用户评论

[#1] ▲-4▼ paulo.castro48@gmail.com [30%] (2017-02-19 02:18:00)

Note: This is useful when you're manually parsing php by file before to get work done, wich is impossible to do without getting files externally. Now you can parse without getting the file contents by using refection objects.

[#2] ▲7▼ spectrum@bigmir.net [63%] (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;

?>

[#3] ▲12▼ kovin [65%] (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;
                                
                                /*
                                * Check if this function is being called to set the static $object, which 
                                * containts scope information to invoke the method
                                */
                                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'
?>