©
本文档使用 PHP中文网手册 发布
(PHP 5)
ReflectionProperty 类报告了类的属性的相关信息。
$class
, string $name
)$class
, string $name
[, bool $return
] )$object
] )$accessible
)$object
, mixed $value
)属性的名称。只读,在尝试赋值的时候抛出 ReflectionException。
定义的属性所在的类。只读,在尝试赋值的时候抛出 ReflectionException。
ReflectionProperty::IS_STATIC
指示了 static 的属性。
ReflectionProperty::IS_PUBLIC
指示了 public 的属性。
ReflectionProperty::IS_PROTECTED
指示了 protected 的属性。
ReflectionProperty::IS_PRIVATE
指示了 private 的属性。
[#1] Nanhe Kumar [2014-01-06 12:36:50]
<?php
//serialize static properties (class variable)
class Student {
private $members = array();
protected $name;
public static $noOfStudent;
public function __construct($name = 'Nanhe Kumar') {
$this->name = $name;
Student::$noOfStudent++;
}
public function __sleep() {
$vars = get_class_vars(get_class($this));
foreach ($vars as $key => $val) {
if (!empty($val))
$this->members[$key] = $val;
}
return array_keys(get_object_vars($this));
}
public function __wakeup() {
foreach ($this->members as $key => $val) {
$prop = new ReflectionProperty(get_class($this), $key);
$prop->setValue(get_class($this), $val);
}
$this->members = array();
}
public function getTotalStudent() {
return self::$noOfStudent;
}
}
$so1 = new Student();
$so2 = new Student();
$serialized = serialize($so1);
print_r($serialized); //O:7:"Student":2:{s:16:"Studentmembers";a:1:{s:11:"noOfStudent";i:2;}s:7:"*name";s:11:"Nanhe Kumar";}
$unserialized = unserialize($serialized);
print_r($unserialized); //Student Object ( [members:Student:private] => Array ( ) [name:protected] => Nanhe Kumar )
echo Student::$noOfStudent; //2
?>
[#2] james at digitaledgeit dot com dot au [2010-08-29 20:30:01]
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!
[#3] rasmus at mindplay dot dk [2010-07-30 05:06:14]
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...