关于php:公共的、私有的、受保护的类在哪里可以通过反射类访问?

what is the use of public, private, protected class where it can be access via reflection class?

本问题已经有最佳答案,请猛点这里访问。

为了安全目的和封装我们有Public,Private, Protected类而做的一些东西,但有一个问题仍然在头脑中浮现:如果我们仍然可以访问或了解这些类的所有成员,不管它是Public, PrivateProtected,这意味着什么??

例如:

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

正如我们所看到的,这个类的所有成员是否都是Private, Protected or Public。那么OOP的概念是什么呢?

附:以山卡尔·达莫达兰为例。


TL;DR;

如果你能做点什么-那并不意味着你应该做。

反射

这是一个旨在提供实体元信息的东西,但是它的实际用例是有争议的,而且几乎总是可以用一些东西来代替它。重点不是说它不好,而是说——如果你想在你的体系结构中使用它,那么很可能你有一个缺陷。

一种"去"的方式。

实际上,您可以在PHP中访问受保护/私有属性,而无需使用Reflection。例如,Closure::bindTo()类:

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中的global,但这是不可能的)。更重要的是,在PHP中,有很多东西可以用错误的方式使用——这会使语言变得困难——从某种意义上说,学习语言并不难,但是很难正确地使用所有的功能,因为这需要扎实的体系结构和良好的实践知识。

您可以想象一种访问隐藏属性的方法,即使是像var_dump()ob_函数这样的东西,但这只会说明使用一些体面的功能有多可怕。

以及如何处理

不要这样使用Reflection。当然,在构建您的体系结构时不要指望这一点。它不是应该用来做的。如果你想从外面进入你的房产,那就把它们声明为public

正确使用物品。这是唯一的出路。如果你不知道什么是正确的用法,那就学习。这是我们一直在做的事情。每一天。


publicprotectedprivate令牌用于定义属性的可见性,而不是以任何方式提供安全性。

可见性用于区分:

  • 你的公共接口,
  • 向类扩展公开的接口,或者,
  • 内部状态。
  • 反射主要是用来帮助提供诸如AOP、DIC、代理等好处;具体来说,它不是黑客工具。使用您的代码的人可以简单地阅读它来获得他们想要的,不,为了他们自己的"邪恶"目的而编辑它。