Reflection
在线手册:中文 英文
PHP手册

The ReflectionProperty class

(PHP 5)

简介

The ReflectionProperty class reports information about classes properties.

类摘要

ReflectionProperty implements Reflector {
/* 常量 */
const integer IS_STATIC = 1 ;
const integer IS_PUBLIC = 256 ;
const integer IS_PROTECTED = 512 ;
const integer IS_PRIVATE = 1024 ;
/* 属性 */
public $name ;
public $class ;
/* 方法 */
final private void __clone ( void )
__construct ( mixed $class , string $name )
public static string export ( mixed $class , string $name [, bool $return ] )
public ReflectionClass getDeclaringClass ( void )
public string getDocComment ( void )
public int getModifiers ( void )
public string getName ( void )
public mixed getValue ( object $object )
public bool isDefault ( void )
public bool isPrivate ( void )
public bool isProtected ( void )
public bool isPublic ( void )
public bool isStatic ( void )
public void setAccessible ( bool $accessible )
public void setValue ( object $object , mixed $value )
public string __toString ( void )
}

属性

name

Name of the property. Read-only, throws ReflectionException in attempt to write.

class

Name of the class where the property is defined. Read-only, throws ReflectionException in attempt to write.

预定义常量

ReflectionProperty Modifiers

ReflectionProperty::IS_STATIC

Indicates static properties.

ReflectionProperty::IS_PUBLIC

Indicates public properties.

ReflectionProperty::IS_PROTECTED

Indicates protected properties.

ReflectionProperty::IS_PRIVATE

Indicates private properties.

Table of Contents


Reflection
在线手册:中文 英文
PHP手册
PHP手册 - N: The ReflectionProperty class

用户评论:

james at digitaledgeit dot com dot au (30-Aug-2010 04:30)

Please ignore my previous note. I didn't fully understand what the previous notes were referring to as "runtime". I now see they were referring to a slightly different question.

Apologies!

james at digitaledgeit dot com dot au (30-Aug-2010 04:22)

You CAN reflect an object at runtime:

<?php

class Abc {
   
    private
$_abc = 123;
   
    public function
__construct($abc) {
       
$this->_abc = $abc;
    }
   
}
 
$obj = new Abc('def');

$refl = new \ReflectionObject($obj);
$prop = $refl->getProperty('_abc');
$prop->setAccessible(true);
echo
$prop->getValue($obj);

?>

This outputs 'def', the value of _abc set at runtime.

rasmus at mindplay dot dk (30-Jul-2010 01:06)

I think a more accurate explanation is this:

The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.

I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:

<?php

// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');

// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');

?>

Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.

In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.

Clearly this very useful library could use some real documentation...

CodeDuck at gmx dot net (08-Feb-2006 04:07)

Beware, the Reflection reflects only the information right after compile time based on the definitions, not based on runtime objects. Might be obvious, wasn't for me, until the app throws the exception at my head.

Example:

<?php

class A {
    public
$a = null;

    function
set() {
     
$this->foo = 'bar';
    }
}

$a = new A;
$a->set();

// works fine
$Reflection = new ReflectionProperty($a, 'a');

// throws exception
$Reflection = new ReflectionProperty($a, 'foo');

?>