如何以编程方式从里面它的方法之一找到一类的公共属性(How to programmatically

2019-08-02 02:25发布

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

什么是最简洁的方式从内部类的自己的方法,其中包括公共和保护的可见得到的唯一对象的公共属性?

我已经看了:

  • 什么是看一个PHP类实例(对象)来查看所有可用的公共属性和方法内的最佳方式?

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

Answer 1:

正如你已经意识到,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);

其中有,你并不需要在全局命名空间引入的另一功能的好处。



Answer 2:

不与PHP版本工作> = 7
因此,我真的不能推荐解决方案的任何更长的时间。
使用反射,而不是

若要从类中获取的公共属性

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

“特技”是get_object_vars正在从的范围称为call_user_func而不是对象的范围

没有必要进行反思,单机功能,关闭等



Answer 3:

根据这篇文章 (由万斯卢卡斯写的),你可以创建一个使用“ 匿名 ”功能,您的“富”类定义一个新的呼叫范围,然后你可以调用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);

和输出将是:

Array
(
    [beer] => yum
    [tricky] => dynamically added var
)

有上面提到的文章中第二个例子显示了另一种方式利用所谓的“倒闭潮”(从PHP 5.3),但由于某种原因,它不适合我用PHP V5.4工作,所以私人做同样的和保护性保持包括所得到的阵列英寸



文章来源: How to programmatically find public properties of a class from inside one of it's methods