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

Posted

技术标签:

【中文标题】如何在 PHP 中返回对象属性的访问修饰符级别?【英文标题】:How to return the access-modifier level of an Object's property in PHP? 【发布时间】:2016-04-11 18:15:33 【问题描述】:

说我有这门课:

class Foo 
  var $pu = 0;
  private $pr = 1;

我需要找到一种方法来检查一个属性的访问修饰符级别,例如:

class Foo 
  var $pu = 0;
  private $pr = 1;

  function return_all_public () 
    $publics = [];
    for (get_object_vars($this) as $key => $value) 
      // if $this->$key is public then array_push($publics, $key);
    
    return $publics;
  

这只是一个例子,功能不是我试图实现的,只是我想知道如何检查一个属性的访问修饰符的级别(公共、受保护或私有?)

【问题讨论】:

【参考方案1】:

编辑澄清 - 不要使用它,这显然是一个错误,似乎已在 php 版本 7 中修复。 http://codepad.viper-7.com/lyULdW(将版本更改为

@deceze 的答案是最可靠的,但正如您所指出的,在不实例化新对象的情况下更喜欢函数调用:

class Foo 

    var $pu = 0;
    private $pr = 1;

    function return_all_public () 
        return call_user_func('get_object_vars', $this);
    

这个范围问题是功能还是错误尚不清楚!

【讨论】:

O_o 这是什么,我什至不... 请不要在实际代码中这样做,它介于误导和混淆之间。 @deceze 是的,我知道 - 我赞成你的回答,并希望明确表示这个“功能”可能会得到修复! @deceze 经过进一步调查,它已经修复了!我进行了编辑【参考方案2】:

使用ReflectionObject

foreach ((new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC) as $property) 
    $publics[] = $property->getName();

甚至:

$publics = array_map(function (ReflectionProperty $property) 
    return $property->getName();
, (new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC));

参考:http://php.net/manual/en/class.reflectionobject.phphttp://php.net/manual/en/reflectionclass.getproperties.php http://php.net/manual/en/class.reflectionproperty.php

【讨论】:

谢谢,这是唯一的方法吗?我的意思是不能只使用 php 的本机函数产生相同的结果吗? (不使用额外的对象实例化) 我不知道有这样的“本机功能”,不。这也是完美的“原生”代码,它恰好使用了 OO 接口。这不应该成为反对使用它的任何理由。

以上是关于如何在 PHP 中返回对象属性的访问修饰符级别?的主要内容,如果未能解决你的问题,请参考以下文章

使用属性升级MyBank

类的高级概念

面向对象中对象和类以及如何访问类中属性和方法

面向对象封装 命名空间 访问修饰符等

Java 访问修饰符总结

php面向对象3