what is the use of public, private, protected class where it can be access via reflection class?
为了安全目的和封装我们有
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php class GrandPas // The Grandfather's class { public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier protected $name2 = 'John Clash'; // This grandpa is mapped to a protected modifier private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier } #Scenario: Using reflection $granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class $granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private) echo"Printing members the 'reflect' way.."; foreach($granpaNames as $k=>$v) { echo"The name of grandpa is $v and he resides in the variable $k"; } |
输出将是:
1 2 3 4 5 | #Scenario Using reflection Printing members the 'reflect' way.. The name of grandpa is Mark Henry and he resides in the variable name1 The name of grandpa is John Clash and he resides in the variable name2 The name of grandpa is Will Jones and he resides in the variable name3 |
正如我们所看到的,这个类的所有成员是否都是
附:以山卡尔·达莫达兰为例。
TL;DR;
如果你能做点什么-那并不意味着你应该做。
反射
这是一个旨在提供实体元信息的东西,但是它的实际用例是有争议的,而且几乎总是可以用一些东西来代替它。重点不是说它不好,而是说——如果你想在你的体系结构中使用它,那么很可能你有一个缺陷。
一种"去"的方式。
实际上,您可以在PHP中访问受保护/私有属性,而无需使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Test { private $x = 'foo'; } $z = new Test(); $y = function() { return $this->x; }; $y = $y->bindTo($z, $z); echo $y(); //foo |
并且…那又怎么样?每种语言功能都可以用于好坏。我们称之为"好的实践"和"坏的实践"(好吧,老实说,我很难记住"好的实践",比如PHP中的
您可以想象一种访问隐藏属性的方法,即使是像
以及如何处理
不要这样使用
正确使用物品。这是唯一的出路。如果你不知道什么是正确的用法,那就学习。这是我们一直在做的事情。每一天。
可见性用于区分:
反射主要是用来帮助提供诸如AOP、DIC、代理等好处;具体来说,它不是黑客工具。使用您的代码的人可以简单地阅读它来获得他们想要的,不,为了他们自己的"邪恶"目的而编辑它。