如何在 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 中返回对象属性的访问修饰符级别?的主要内容,如果未能解决你的问题,请参考以下文章