PHP 8.3.0 RC 6 available for testing

示例

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

User Contributed Notes 3 notes

up
16
Kovin
14 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'
?>
up
9
spectrum at bigmir dot net
12 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;

?>
up
-12
paulo dot castro48 at gmail dot com
6 years ago
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.
To Top