如何通过访问修饰符过滤属性

Posted

技术标签:

【中文标题】如何通过访问修饰符过滤属性【英文标题】:How to filter properties by access modifier 【发布时间】:2015-08-14 19:47:44 【问题描述】:

所以我想输出只在一个类中公开的属性。

class MyClass

    $public $var1, $var2, var3;
    $private $pVar1, $pVar2, pVar3;

    //outputs all variables and their values
    //lets assume they are all defined
    function outputPublic()
    
        foreach($this as $key=>$val)
            echo $key . ' : ' . $val . '<br>';
    

我已经通过使用外部函数循环遍历类的实例来完成此工作,但我想知道如何从内部执行此操作。 有没有办法获取访问修饰符?

外部检索公共属性的示例

$obj = new MyClass();
foreach($obj as $key=$val)
    echo $key . ' : ' . $val;

【问题讨论】:

看看phpsReflectionClass @Daan,谢谢看看 【参考方案1】:

有不同的方法。你可以使用get_object_vars

foreach(call_user_func('get_object_vars', $this) as $key => $val) 
    echo $key . ' : ' . $val . '<br>';

或者你可以使用ReflectionClass

$reflect = new ReflectionClass($this);
foreach($reflect->getProperties(ReflectionProperty::IS_PUBLIC) as $props) 
    echo $props->getName() . ' : ' . $props->getValue($this) . '<br>';

我建议使用 ReflectionClass 而不是 get_object_vars,从 php 7 开始你会得到另一种行为。

【讨论】:

以上是关于如何通过访问修饰符过滤属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中返回对象属性的访问修饰符级别?

Java中成员属性默认访问修饰符是啥

Java中各种(类方法属性)访问修饰符与修饰符的说明

访问修饰符 VS 属性

访问修饰符也会影响反射吗?

Java中各种(类方法属性)访问修饰符与修饰符的简单说明