7

变量封装、Set/Get 方法是最佳实践,但如果它不打算使用,为什么我们有机会声明一个公共变量?如果变量在默认情况下始终是私有的并且没有机会将它们公开,因为我阅读的所有教程都说它们应该用 set/get 方法封装,那会更好吗?至少在 PHP OOP 中是否有任何有效的公共变量用例?

4

3 回答 3

8

事实上恰恰相反:理论上 getter/setter 是错误的。属性定义对象的状态,方法定义行为。Getters/Setters 只是拦截了对属性的读写访问,但它们完全打破了语义:现在读取对象的状态是对象的一种行为。

为了使属性再次看起来像属性,路上有一个 RFC :) https://wiki.php.net/rfc/propertygetsetsyntax

于 2012-04-20T11:32:26.357 回答
1

Set/Get 方法是最佳实践,但如果它不打算使用,为什么我们有机会声明一个公共变量?

最佳实践和不打算使用是不一样的。一种语言需要为不同的用例提供不同的工具,并且应该保持一致。

PHP 对象始终支持公共成员,当引入差异化可见性时,出于向后兼容的原因,公共成员非常有用。

如果变量在默认情况下始终是私有的并且没有机会将它们公开,因为我阅读的所有教程都说它们应该用 set/get 方法封装,那会更好吗?

这个问题无法具体回答,它太主观了,而且有太多不同的用例会导致不同的答案。

至少在 PHP OOP 中是否有任何有效的公共变量用例?

从向后兼容性开始。如果你不能重构你的代码但需要一直完全重写它,这将是非常昂贵的。

于 2012-04-20T11:35:14.313 回答
-1

让我们看看.. 这是来自CakePHP EmailComponent的真实世界电子邮件 API 类。要使用这个类,你只需要“设置”一些属性然后就可以了send()

$this->Email->to = 'ss@b.co';
$this->Email->from = 'me@b.co';
$this->Email->title = 'xxx';
$this->Email->msg = 'blabla..';
$this->Email->send();

事实上,这个类中有很多私有属性和函数,但它是私有的。

班级有(单一)责任做某事。 封装是只发布人们用来做那件事的东西,并将内部的技术/基础设施保持为私有

于 2012-04-20T11:54:42.053 回答