我曾经使用像这样的Closure从类中获取所有公共变量:
Class myClass
{
public $foo;
private $bar;
private function GetFields()
{
$lambda = function( $obj ) { return get_object_vars( $obj ); };
return $lambda( $this );
}
public function SomeFunction()
{
$fields = $this->GetFields();
}
}
这完美无缺,并且在课堂上给了我所有公共场合。
现在,我将服务器升级到PHP 5.4并获得所有私有和受保护的变量。 这是一个新的“功能”还是一个Bug?
答案 0 :(得分:2)
来自get_object_vars()
的文档。
返回范围内指定对象的已定义对象可访问非静态属性的关联数组。
我假设,当您使用$this
上下文get_object_vars()
时,会为您提供所有可访问的属性。其中包括private
和protected
。
在PHP 5.4中,您现在可以在匿名函数中使用$this
。向下滚动并查看更改日志。 http://php.net/manual/en/functions.anonymous.php
更新日志
5.4.0 | $ this可用于匿名函数
答案 1 :(得分:1)
在手册中查看此功能的用例:http://php.net/manual/en/function.get-object-vars.php
你必须在那里,第一个是在一个对象上创建实例而第二个在一个类中。这两种情况有不同的结果。第一个显示公共属性,第二个显示所有属性。
差异来自get_object_vars()
返回对象的所有可访问属性的事实。当您创建对象的实例并将其作为参数传递给函数时,它只能访问公共属性,但是当您在类中并且将$this
作为参数传递时,它可以访问所有属性。
答案 2 :(得分:1)
要回答我自己的问题,将闭包移到课堂范围内会产生不必要的副作用。
查看:https://wiki.php.net/rfc/closures/object-extension
最后我认为它是 bug 或至少是一个不需要的'功能'。
在类中,我必须考虑另一种策略来查找类的所有公共属性。
<强>更新强>
这就是我提出的:
Class myClass
{
public $foo;
private $bar;
private function GetFields()
{
$fields = [];
$ref = (new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC);
foreach ( $ref as $value )
$fields[$value->name] = $this->{$value->name};
return $fields;
}
public function SomeFunction()
{
$fields = $this->GetFields();
}
}