(PHP 5, PHP 7, PHP 8)
The ReflectionProperty class reports information about class properties.
Name of the property. Read-only, throws ReflectionException in attempt to write.
Name of the class where the property is defined. Read-only, throws ReflectionException in attempt to write.
ReflectionProperty::IS_STATIC
int
Indicates static
properties.
Prior to PHP 7.4.0, the value was 1
.
ReflectionProperty::IS_READONLY
int
Indicates readonly properties. Available as of PHP 8.1.0.
ReflectionProperty::IS_PUBLIC
int
Indicates public
properties.
Prior to PHP 7.4.0, the value was 256
.
ReflectionProperty::IS_PROTECTED
int
Indicates protected
properties.
Prior to PHP 7.4.0, the value was 512
.
ReflectionProperty::IS_PRIVATE
int
Indicates private
properties.
Prior to PHP 7.4.0, the value was 1024
.
ReflectionProperty::IS_ABSTRACT
int
ReflectionProperty::IS_PROTECTED_SET
int
ReflectionProperty::IS_PRIVATE_SET
int
ReflectionProperty::IS_VIRTUAL
int
ReflectionProperty::IS_FINAL
int
Note:
The values of these constants may change between PHP versions. It is recommended to always use the constants and not rely on the values directly.
Version | Description |
---|---|
8.4.0 | The class constants are now typed. |
8.4.0 |
Added ReflectionProperty::IS_VIRTUAL ,
ReflectionProperty::IS_PRIVATE_SET ,
ReflectionProperty::IS_PROTECTED_SET ,
ReflectionProperty::IS_ABSTRACT ,
and ReflectionProperty::IS_FINAL .
|
8.0.0 | ReflectionProperty::export() was removed. |
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...