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