我是一名新手,对于OOP/PHP不太熟悉。类中的可见性和可扩展性有什么实际作用呢?

15

显然我对这些概念是全新的。我不理解为什么你要限制访问属性或方法。似乎你只需按预期结果编写代码即可。为什么要创建私有方法而不是简单地不调用该方法?这是为了迭代对象创建(如果我正确陈述的话),多个开发人员的情况(不要破坏其他人的工作),还是仅仅为了不会意外破坏你自己的工作?

8个回答

8
我们创建私有方法,这样我们类的使用者就不必关心实现细节 - 他们可以专注于我们的类为他们提供的少数精妙功能。此外,我们有责任考虑公共方法的每种可能用法。通过将方法设为私有,我们减少了类需要支持的特性数量,并且我们有更多的自由来改变它们。
假设您有一个“队列”类 - 每次调用者向队列添加项时,可能需要增加队列的容量。由于底层实现的原因,设置容量并非简单易行,因此您将其拆分成单独的函数以提高“Enqueue”函数的可读性。由于调用者不关心队列的容量(您正在为他们处理它),因此您可以将方法设为私有:调用者不会被无关的方法所干扰,您也不必担心调用者会对容量做出荒谬的事情,并且可以随意更改实现,而不会破坏使用您类的代码(只要仍然在您类定义的有限用例中设置容量)。

8

你的最后两点非常准确 - 你不需要多个开发人员就可以让你的代码出现问题。如果你长时间地工作在一个项目上,你会意识到你已经忘记了开始时做过的很多事情。

隐藏某些内容最重要的原因之一是允许你稍后安全地进行更改。如果一个字段是public的,然后几个月后你想要更改它,使得每次这个字段变化时,其他事情也发生变化,那么你就会遇到麻烦。因为它是public的,没有办法知道或记住有多少其他地方直接访问了该字段。如果它是private的,你就可以保证它不会在这个类的外部被修改。你可能会在它周围包装一个public方法,并且你可以轻松地更改该方法的行为。

一般来说,你越公开的东西,你就越需要担心与其他代码的兼容性。


7
一切都归结于封装。这意味着隐藏类的内部,只关心它所做的事情。如果你想要一个信用卡处理类,你并不关心它如何处理信用卡。你只想能够这样做:$creditCardProcessor->charge(10.99, $creditCardNumber); 并期望它能正常工作。
通过将一些方法公开,其他方法则变为私有或受保护的,我们为他人留下了一个入口,以便他们知道从哪里可以安全地调用代码。公共方法和变量被称为“接口”。
对于任何类,都有一个实现。这是类如何执行其职责。如果它是一个制作冰沙的类,它如何添加成分,添加什么成分等都是实现的一部分。外部代码不应该知道或关心实现细节。
类的另一面是其接口。接口是类的开发者打算由外部代码调用的公共方法。这意味着你应该能够调用任何公共方法,并且它将正常工作。

5

使用封装的原因有很多,其中最强的一点是:假设您正在使用由他人编写的大型复杂库。如果每个对象都没有受到保护,您可能会无意中访问或更改开发人员从未打算以那种方式进行操作的值。

隐藏数据使程序更易于概念化和实现。


4

重点在于封装。方法是私有的,它们执行内部工作,同时暴露优雅的函数使事情变得容易。例如,您可能会有一个$product->insert()函数,它利用4个内部函数来验证单例数据库对象、使查询安全等 - 这些是不需要公开的内部函数,如果调用了它们,可能会破坏其他结构或流程,这些结构或流程是由您作为开发人员放置的。


2
您需要让一个项目有多个开发者时不会错误地修改其他人的工作,或仅为了避免意外地破坏自己的工作吗?
主要是这两点。将方法设置为公共方法表示“这是该类应该由其客户端使用的方式”,将其设置为私有方法表示“这是可能会在没有警告的情况下更改且客户端不应关注的实现细节”并强制客户端遵循此建议。
一个只有少量、有良好文档的公共方法的类,比起所有东西都是公共的那种类,更容易被不熟悉它的人使用(其中可能包括其原始作者,在6个月后第一次看到它时)。

1

它使协作更容易,你告诉类的用户哪些部分不应经常更改,而且你可以保证如果他们只使用公共方法,你的对象将处于有意义的状态。

它不需要像区分私有/公共/其他那样严格(我指的是由语言强制执行)。例如,在Python中,这是通过命名约定来实现的。你知道你不应该去碰任何标记为非公共的东西。


0
例如 - 私有/受保护的方法可能是某个类的一部分,该类在另一个(公共)方法中被调用。如果该部分在更多的公共方法中被调用,那么这是有意义的。但你不希望这些方法被任何其他地方调用。
类属性也是如此。是的,你可以编写所有公共类,但这有什么乐趣呢?

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