18

我有一个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'   

从公共和受保护都可见的类自己的方法中获取对象的唯一公共属性的最简洁方法是什么?

我看过:

但这似乎并没有解决我的问题,因为它指向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 version >=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);

输出将是:

大批
(
    [啤酒] => 好吃
    [棘手] => 动态添加 var
)

上面提到的文章中有第二个示例,它显示了使用所谓的“闭包”(来自 php 5.3)的另一种方法,但由于某种原因,它不适用于我使用 php v5.4 所以私有并且受保护的属性仍然包含在结果数组中。

于 2013-04-06T04:36:35.040 回答