如何从其中一个方法中以编程方式查找类的公共属性

Ray*_*Ray 13 php oop reflection

我有一个Foo有公共和受保护财产的课程. Foo需要有一个非静态方法,getPublicVars()它返回一个包含所有公共属性的列表Foo(这只是一个例子,我从外部知道Foo调用的对象get_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'   
Run Code Online (Sandbox Code Playgroud)

从类本身的方法中获取对象的唯一公共属性的最简洁方法是什么?public和protected都可见?

我看过:

但这似乎并没有解决我的问题,因为它指向get_object_vars()从对象外部使用.

hak*_*kre 22

正如您已经意识到的那样,PHP的内置对get_object_vars范围敏感.您只需要公共 对象属性.

因此,从该功能到公共变体不是一大步:

function get_object_public_vars($object) {
    return get_object_vars($object);
}
Run Code Online (Sandbox Code Playgroud)

调用get_object_public_vars它将只为您提供公共属性,因为它超出了当前对象的范围.

如果您需要更细粒度的控制,您还可以使用ReflectionObject:

(new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC);
Run Code Online (Sandbox Code Playgroud)

这样做的好处是您不需要在全局命名空间中引入另一个函数.

  • +1(我通常会使用ReflectionObject). (4认同)

Bra*_*ent 17

不适用于php版本> = 7
因此,我不能再推荐解决方案了.
改为使用反射

从班级中获取公共财产

$publicProperties = call_user_func('get_object_vars', $this);
Run Code Online (Sandbox Code Playgroud)

"技巧"是get_object_vars从对象的范围call_user_func而不是范围调用

不需要反射,独立功能,闭包等

  • **不适用于php版本> = 7**看起来像这依赖于在PHP 7中修复的错误.虽然在撰写本文时是一个有效的答案,但使用它不再是一个好主意 - 使用`而不是ReflectionObject` (5认同)