18

Fooパブリック プロパティとプロテクト プロパティを 持つクラスがあります。のすべてのパブリックプロパティのリストを返すFoo非静的メソッドが必要です(これは単なる例です。オブジェクト呼び出しの外部からこれを達成することがわかっており、私のメソッドは必要ありません)。getPublicVars()FooFooget_object_vars()getPublicVars()

注:これは、実行時にクラスの定義で定義されていないクラス インスタンス (オブジェクト) に割り当てられた、動的に宣言されたプロパティも返す必要があります。

次に例を示します。

class Foo{
    private $bar = '123';
    protect $boo = '456';
    public   $beer = 'yum';

   //will return an array or comma seperated list
   public function getPublicVars(){
      // thar' be magic here...
   } 
}

 $foo = new Foo();
 $foo->tricky = 'dynamically added var';

 $result = $foo->getPublicVars();  
 var_dump($result); // array or comma list with 'tricky' and 'beer'   

public と protected の両方が表示されるクラス独自のメソッド内からオブジェクトの public プロパティのみを取得する最も簡潔な方法は何ですか?

私は見てきました:

get_object_vars()しかし、これはオブジェクトの外部からの使用を指しているため、私の質問に対処していないようです。

4

3 に答える 3

31

既にお気づきのように、PHP の組み込みget_object_varsはスコープに依存します。パブリック オブジェクト プロパティのみが必要です。

したがって、その関数からパブリック バリアントへの移行は大きなステップではありません。

function get_object_public_vars($object) {
    return get_object_vars($object);
}

これを呼び出すget_object_public_varsと、現在のオブジェクトの範囲外にあるため、パブリック プロパティのみが提供されます。

よりきめ細かい制御が必要な場合は、以下を使用することもできますReflectionObject

(new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC);

これには、グローバル名前空間に別の関数を導入する必要がないという利点があります。

于 2012-10-29T15:00:49.380 に答える
20

PHPバージョン> = 7では機能しませ
ん。そのため、これ以上の解決策はお勧めできません。
代わりにリフレクションを使用する

クラス内からパブリック プロパティを取得するには

$publicProperties = call_user_func('get_object_vars', $this);

「トリック」は、オブジェクトのスコープではなく、スコープget_object_varsから呼び出されていることですcall_user_func

リフレクション、スタンドアロン関数、クロージャなどは不要

于 2014-11-13T17:10:35.950 に答える
-1

この記事(Vance Lucas 著)によると、「匿名」関数を使用して「Foo」クラス定義内に新しい呼び出しスコープを作成し、その中get_object_vars()から呼び出すことができます。これにより、後で外部から動的に作成された場合でも、クラス内からパブリック プロパティのみを取得できます。

したがって、あなたの例に合わせて次のようになります。

<?php
class Foo {
    private $bar = '123';
    protected $boo = '456';
    public   $beer = 'yum';

   // return an array of public properties 
   public function getPublicVars(){
      $publicVars = create_function('$obj', 'return get_object_vars($obj);');
        return $publicVars($this);
   } 
}

 $foo = new Foo();
 $foo->tricky = 'dynamically added var';

 $result = $foo->getPublicVars();  
 print_r($result);

出力は次のようになります。

配列
(
    [ビール] => おいしい
    [トリッキー] => 動的に追加された変数
)

上記の記事には、いわゆる「クロージャー」(php 5.3から)を使用して同じことを行う別の方法を示す2番目の例がありますが、何らかの理由でphp v5.4では機能しないため、プライベート保護されたプロパティは、結果の配列に含まれたままになります。

于 2013-04-06T04:36:35.040 に答える