编辑
根据评论要求:
class A {
private $member = 1000;
public static function test(A $a) {
echo $a->member;
}
}
echo A::test(new A()); // outputs 1000
编辑
完成评论中的另一个请求:
除非您使用的是php 5.3(其中需要的特性),否则您无法知道在哪个类上调用了静态方法。(
late static binding
)介绍。你能做什么来模仿
get_called_class()
通过分析当前堆栈(使用
debug_backtrace()
)如果你有工作
get_called_class()
函数,可以执行以下操作:
class BaseClass {
public static function __set_state($state) {
$class = get_called_class();
// Assumption: Constructor can be invoked without parameters!
$object = new $class();
foreach (get_class_vars($class) as $member) {
if (!isset($state[$member])) {
// Member was not provided, you can choose to ignore this case
throw new Exception("$class::$member was not provided");
} else {
// Set member directly
// Assumption: members are all public or protected
$object->$member = $state[$member];
// Or use the setter-approach given by Chaos.
$setter = 'set' . ucfirst($member);
$object->setter($state[$member]);
}
}
return $object;
}
}