检测对象属性在 PHP 中是否私有

2022-08-30 16:32:48

我正在尝试创建一个PHP(5)对象,该对象可以循环访问其属性,仅基于其公共属性而不是其私有属性构建SQL查询。

由于此父对象方法将由子对象使用,因此我不能简单地选择按名称跳过私有属性(我不知道它们在子对象中是什么)。

有没有一种简单的方法可以从对象内部检测其哪些属性是私有的?

以下是到目前为止我所得到的简化示例,但此输出包括$bar的值:

class testClass {

    public $foo = 'foo';
    public $fee = 'fee';
    public $fum = 'fum';

    private $bar = 'bar';

    function makeString()
    {
        $string = "";

        foreach($this as $field => $val) {

            $string.= " property '".$field."' = '".$val."' <br/>";

        }

        return $string;
    }

}

$test = new testClass();
echo $test->makeString();

给出输出:

property 'foo' = 'foo'
property 'fee' = 'fee'
property 'fum' = 'fum'
property 'bar' = 'bar' 

我希望它不包括“酒吧”。

如果有更好的方法可以仅循环访问对象的公共属性,那么在这里也可以使用。


答案 1

http://php.net/manual/reflectionclass.getproperties.php#93984 检查此代码

  public function listProperties() {
    $reflect = new ReflectionObject($this);
    foreach ($reflect->getProperties(ReflectionProperty::IS_PUBLIC /* + ReflectionProperty::IS_PROTECTED*/) as $prop) {
      print $prop->getName() . "\n";
    }
  }

答案 2

可以使用反射来检查类的属性。若要仅获取公共和受保护的属性,请将合适的筛选器分析为 ReflectClass::getProperties 方法。

下面是使用它的方法的快速示例。makeString

public function makeString()
{
    $string = "";
    $reflection = new ReflectionObject($this);
    $properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
    foreach ($properties as $property) {
        $name    = $property->getName();
        $value   = $property->getValue($this);
        $string .= sprintf(" property '%s' = '%s' <br/>", $name, $value);
    }
    return $string;
}

推荐