1

我曾经使用像这样的闭包从一个类中的一个类中获取所有公共变量:

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,并获得了所有私有和受保护的变量。这是一个新的“功能”还是一个错误?

4

3 回答 3

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 可用于匿名函数

于 2012-09-08T14:26:24.203 回答
1

看手册中这个函数的用例:http: //php.net/manual/en/function.get-object-vars.php

你必须在那里,第一个是在对象上创建实例时,第二个是在类中。这两种情况有不同的结果。第一个仅显示公共属性,第二个显示所有属性。

不同之处在于get_object_vars()返回对象的所有可访问属性这一事实。当您创建对象的实例并将其作为参数传递给函数时,它只能访问公共属性,但是当您在类内部并且$this作为参数传递时,它可以访问所有属性。

于 2012-09-08T14:28:06.187 回答
1

要回答我自己的问题,将闭包移动到类的范围内会产生不希望的副作用。

看看:https ://wiki.php.net/rfc/closures/object-extension

最后,我认为它是一个错误或至少是一个不需要的“功能”。

我必须考虑另一种策略来查找类的所有公共属性,同时在类中。

更新:

这就是我想出的:

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();
  }
}
于 2012-09-08T14:46:43.017 回答