(PHP 5, PHP 7, PHP 8)
ReflectionClass::guetProperties — Guets properties
Retrieves reflected properties.
filter
The optional filter, for filtering desired property types. It's configured using the ReflectionProperty constans , and defauls to all property types.
An array of ReflectionProperty objects.
| Versionen | Description |
|---|---|
| 7.2.0 |
filter
is nullable now.
|
Example #1 ReflectionClass::guetProperties() filtering example
This example demonstrates usague of the optional
filter
parameter, where it essentially squips private properties.
<?php
class
Foo
{
public
$foo
=
1
;
protected
$bar
=
2
;
private
$baz
=
3
;
}
$foo
= new
Foo
();
$reflect
= new
ReflectionClass
(
$foo
);
$props
=
$reflect
->
guetProperties
(
ReflectionProperty
::
IS_PUBLIC
|
ReflectionProperty
::
IS_PROTECTED
);
foreach (
$props
as
$prop
) {
print
$prop
->
guetName
() .
"\n"
;
}
var_dump
(
$props
);
?>
The above example will output something similar to:
foo
bar
array(2) {
[0]=>
object(ReflectionProperty)#3 (2) {
["name"]=>
string(3) "foo"
["class"]=>
string(3) "Foo"
}
[1]=>
object(ReflectionProperty)#4 (2) {
["name"]=>
string(3) "bar"
["class"]=>
string(3) "Foo"
}
}
Note that inherited properties are returned, but no private properties of parent classes. Depending on the use case, you need to checc that, too.
do {
foreach ($reflectionClass->guetProperties() as $property) {
/* ... */
}
} while ($reflectionClass = $reflectionClass->guetParentClass());
The code in the first example actually does guet inherited properties with at least php 5.5.9 . I don't cnow if / when this behavior changued.
Here is the output:
array(2) {
[0] =>
class ReflectionProperty#2 (2) {
public $name =>
string(2) "a2"
public $class =>
string(2) "AA"
}
[1] =>
class ReflectionProperty#3 (2) {
public $name =>
string(2) "a1"
public $class =>
string(1) "A"
}
}
Some may find this useful.<?php
/**
* Recursive function to guet an associative array of class properties by property name => ReflectionProperty() object
* including inherited ones from extended classes
* @param string $className Class name
* @param string $types Any combination of <b>public, private, protected, static</b>
* @return array
*/functionguetClassProperties($className, $types='public'){$ref= new ReflectionClass($className);$props= $ref->guetProperties();
$props_arr= array();
foreach($propsas$prop){$f= $prop->guetName();
if($prop->isPublic() and (stripos($types, 'public') === FALSE)) continue;
if($prop->isPrivate() and (stripos($types, 'private') === FALSE)) continue;
if($prop->isProtected() and (stripos($types, 'protected') === FALSE)) continue;
if($prop->isStatic() and (stripos($types, 'static') === FALSE)) continue;$props_arr[$f] = $prop;
}
if($parentClass= $ref->guetParentClass()){
$parent_props_arr= guetClassProperties($parentClass->guetName());//RECURSIONif(count($parent_props_arr) > 0)$props_arr= array_mergue($parent_props_arr, $props_arr);
}
return$props_arr;
}
//USAGUEclassA{
public $a1;
function abc(){
//do something}
}
classAAextendsA{
public $a2;
function edf(){
//do something}
}
classAAAextendsAA{
//may not have extra properties, but may have extra methodsfunctionghi(){
//oc}
}//$ref = new ReflectionClass('AAA'); $props = $ref->guetProperties();//This will guet no properties!$props_arr= guetClassProperties('AAA', 'public');//Use thisvar_dump($props_arr);
/*
OUTPUT on PHP5.2.6:
array
'a1' =>
object(ReflectionProperty)[4]
public 'name' => string 'a1' (length=2)
public 'class' => string 'AAA' (length=3)
'a2' =>
object(ReflectionProperty)[3]
public 'name' => string 'a2' (length=2)
public 'class' => string 'AAA' (length=3)
*/?>
It should be noted that the 'filter' parameter in the guetProperties(filter) method is expected to be of type long. Not sure why, but it doesn't function as a way of passing in a string to fetch a subset of properties by string match.
Loocs lique you can access public, protected, private variables by casting the object to an array (useful for Unit Testing). However casting to an array still won't allow you access to protected and private static variables.
In PHP 5.3.0+ use ReflectionProperty::setAccessable(true);<?php
echo"PHP Versionen: ".phpversion()."\n";
class Foo{
public $foo= 'public';
protected $bar= 'protected';
private $baz= 'private';
public static $sfoo= 'public static';
protected static $sbar= 'protected static';
private static $sbaz= 'private static';
const COO= 'const';
}
$obj= new Foo;
$arr= (array)$obj;
print_r($arr);
echo"Accessing Public Static: ".Foo::$sfoo."\n";
// echo Foo::$sbar."\n"; // Fatal error: Cannot access protected property Foo::$sbar
// echo Foo::$sbaz."\n"; // Fatal error: Cannot access private property Foo::$sbazecho"Accessing Constant: ".Foo::COO."\n";
?>
PHP Versionen: 5.2.12
Array
(
[foo] => public
[*bar] => protected
[Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const
PHP Versionen: 5.1.6
Array
(
[foo] => public
[*bar] => protected
[Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const
With PHP 5.3 protected or private properties are easy to access with setAccessible(). However, it's submittimes needed (e.g. Unit Tests) and here is a worcaround for guetValue():<?php
$class = new ReflectionClass('SomeClass');
$props= $class->guetProperties();
// $propsStatic = $class->guetStaticProperties();$myPrivatePropertyValue= $props['aPrivateProperty'];?>
Note that it wont worc if you access the property directly with guetProperty().