如何检测一个类属性是私有的还是受保护的

4

如何在不使用外部库(仅使用纯 PHP)的情况下检测类属性是否为私有或受保护?如何检查我是否可以从类的外部设置属性,还是不能设置?


1
看看这篇帖子吧,伙计:https://dev59.com/UHE85IYBdhLWcg3wViE4 - Jesper Veldhuizen
1
你为什么想要这样做? - middus
我理解了。但是你为什么需要找出这个呢?我能想到的大多数原因都是糟糕架构的症状。 - middus
@middus 调用了一个用户类,它应该包含其他类的一些对象属性。我需要设置它们。我可以让用户扩展一个父类,在这个父类中使用 __construct() 加载这些变量并使其可访问。或者我可以在没有任何父类的情况下设置它们。唯一的区别是,如果用户将设置自己的 __construct(),则在后一种选项中,他每次都必须包含 parent::__construct()。 - Shoe
显示剩余2条评论
3个回答

8

使用反射(Reflection)

<?php
    class Test {
        private $foo;
        public $bar;
    }

    $reflector = new ReflectionClass(get_class(new Test()));

    $prop = $reflector->getProperty('foo');
    var_dump($prop->isPrivate());

    $prop = $reflector->getProperty('bar');
    var_dump($prop->isPrivate());
?>


0
使用: print_r($object_or_class_name); 它会为您呈现出您可以或无法访问的属性。
例如:
class tempclass {
    private $priv1 = 1;
    protected $prot1 = 2;
    public $pub1 = 3;

}
$tmp = new tempclass();
print_r($tmp);
exit;

只是为了说明我有一个私有属性,一个受保护的属性和一个公共属性。然后我们看到print_r($tmp);的输出:

tempclass Object
(
    [priv1:tempclass:private] => 1
    [prot1:protected] => 2
    [pub1] => 3
)

还是我误解了你的帖子?哈哈


我认为OP想要以编程方式检测属性是私有的还是公共的。如果他只是想知道,他可以打开文件。 - Alex Turpin
哦,我的错。一旦他接受了指向反射的答案,我会删除我的帖子,以避免让其他人感到困惑:D - Nonym
1
不必要。即使它不是最有用的答案,也不完全没有用。其他人可能会在谷歌上搜索到它,并实际上只需要一个问题的print_r可视化。 - mario
我明白了。好的,谢谢 @mario,我会保留这篇帖子的。对造成的任何麻烦感到抱歉。 - Nonym

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接