15

人们一直告诉我,我应该在我的所有类属性和方法前使用公共、私有或受保护的访问修饰符。我真的不明白为什么。我是新手,所以请多多包涵,但我的看法是这样的:

  • 我是唯一一个会处理我的代码的人。不是一个团队。

  • 我已经知道一切意味着什么,加上使用告诉我所有声明的变量和属性的编辑器,我知道我不会踩到我使用过的变量。

我得到的一个解释是它“保护或隐藏”你的代码,不让那些可以看到它的人看到......但是在 PHP 中,我不知道用户首先会看到你的代码,谁我在隐瞒吗?如果他们可以看到我的代码,那么他们要么是黑客,要么在我的帐户中,所以我无论如何都无法阻止他们。

如果我在团队中处理大量代码,我可以理解,但对于小事情,这似乎没有必要。

4

4 回答 4

29

你不是在向任何人“隐藏”你的代码,那是胡说八道。

protectedprivate属性所做的是告诉 PHP你打算如何使用它们。当您创建一个类时,您通常应该知道您希望如何使用该类。您将拥有public其他代码可以与之交互的部分,以及您不希望其他代码直接访问的其他部分。通常,您希望将public类的各个部分限制为一组非常小的定义明确的方法,这些方法不会改变。因为一旦您在代码的其他部分使用它们,更改它们就会变得很痛苦。所有的privateprotected东西都应该只能在类本身中访问,所以以后改变它就不成问题了。

如果您是唯一一个编写代码的人,您可能会说这就像不使用“私有部分”一样简单。但是你会犯错误,随着时间的推移你会忘记哪个部分属于哪里。将这些属性显式标记为protectedprivate让 PHP 帮助您不违反您自己的“使用条款”。这是“不要碰这个”的心理笔记和实际上锁定某物之间的区别。

于 2012-06-06T05:44:42.737 回答
6

所谓的“封装”并不能保护您的代码免受他人侵害。任何有权访问您的源代码的人都已经知道那里有什么。如果他们没有来源,那么他们也无法对您的公开内容做任何特别的事情。

它的作用是防止不在类中的代码(因此不必知道类是如何做事的)不小心弄乱内部变量。这样,变量就不太可能以古怪的值结束——当它们出现时,您可以指向类并说损坏的代码在那里,而不是在应用程序的中间。

请注意,为了使它完全有用,您不能只为所有事情使用琐碎的设置器public function setX($x) { $this->x = $x; }- 这会破坏整个目的。你的对象应该尽可能地成为一个“黑匣子”,这在一定程度上意味着外部代码应该能够看到和修改尽可能少的内部状态。让类管理自己的状态,并使用方法来获取完成工作所需的其他内容。(这里的一个半明显的例外是其主要目的是传送数据的类型,但即使在那里,您也应该限制对任何非该数据的访问,并且此类数据的设置器理想情况下会验证它等等。)

于 2012-06-06T05:42:37.647 回答
6

我发现运营商会帮助您不要踩到自己的脚。随着我的应用程序变得越来越大,我有时会在制作一些早期的课程时忘记我最初的想法,并且使用访问修饰符来保护我有所帮助。它还有助于更好地组织您的代码,以便您了解什么是什么,而不是最终编写意大利面条式代码。此外,万一有一天你最终为别人编程,而有人可能会查看你的代码,你不会因为习惯使用语言的结构而对自己的编码风格感到尴尬结构化你的代码将帮助你改进你的编码风格。结构就在那里,为什么不使用它们呢?

因此,对于您目前的具体情况,我想说的是,您目前所做的只是对未来的自己隐藏它,这样您就不会像“嗯……我在 2 年前为我的一个项目开设了这门课,并且我现在就使用它”,然后尝试以一种它们不应该被弄乱的方式弄乱内部结构,这可能会导致问题,因为你可能不记得了。

确实,除非您使用 C# 或 C++ 之类的编译语言,否则修饰符不会对潜在的最终用户隐藏您的实际代码。当使用这些语言创建库时,修饰符变得更加重要,因为它们实际上对最终用户隐藏了您的代码,并且如果您最终在一个可能很重要的专有系统上工作(尽管有时对最终用户来说很烦人)。

于 2012-06-06T05:43:07.383 回答
2

它需要的主要是代码封装和一致性,因此您可以在代码周围拥有一致的接口。

当你创建你的类时,你是在指出你希望哪些部分受到公私保护,你还要提前考虑并构建你的应用程序数据应该如何与其他类交互,以应对,这对于小型应用程序来说也是一件好事项目。

虽然对于小型项目看起来没什么用,但我强烈建议您开始使用它,并养成使用它们的习惯,当您开始使用可见性修饰符时,您会发现它们非常有用。

于 2012-06-06T05:45:07.803 回答