例
リフレクションのドキュメントの中には多くの例が示されています。 特に、各クラスの __construct のドキュメントを見るといいでしょう。
例1 シェル (ターミナル) からのリフレクションの例
$ 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
+add a note
User Contributed Notes 2 notes
Kovin ¶
15 years ago
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'
?>
spectrum at bigmir dot net ¶
13 years ago
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;
?>
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google