范例

在反射文档中存在很多例子,通常位于每个类的 __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] {
      }
    }
  }
}

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

User Contributed Notes

paulo dot castro48 at gmail dot com 19-Feb-2017 11:18
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.
spectrum at bigmir dot net 28-Dec-2010 11:11
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;

?>
Kovin 18-May-2009 11:00
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'
?>