在版本5.4中是否更改了get_object_vars?

时间:2012-09-08 14:19:35

标签: php

我曾经使用像这样的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?

3 个答案:

答案 0 :(得分:2)

来自get_object_vars()的文档。

  

返回范围内指定对象的已定义对象可访问非静态属性的关联数组。

我假设,当您使用$this上下文get_object_vars()时,会为您提供所有可访问的属性。其中包括privateprotected


在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();
  }
}