1

私は、クラス内のクラスからすべての public vars を次のような 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 にアップグレードし、すべてのプライベート変数と保護された変数を取得しました。それは新しい「機能」ですか、それともバグですか?

4

3 に答える 3

2

のドキュメントからget_object_vars()

スコープ内の指定されたオブジェクトに対して、定義されたオブジェクトにアクセス可能な非静的プロパティの連想配列を返します。

$thisコンテキストを使用しているget_object_vars()場合、アクセス可能なすべてのプロパティが提供されていると思います。これにはとが含まprivateprotectedます。


$thisPHP 5.4では、無名関数内で使用できるようになりました。下にスクロールして、変更ログを確認します。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

ここでケースを作成する必要があります。最初のケースはオブジェクト上にインスタンスを作成するときで、2番目のケースはクラス内にあります。これらの2つのケースでは結果が異なります。1つ目はパブリック属性のみを表示し、2つ目はすべての属性を表示します。

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 に答える