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


Are there any valid use case for using public variables in PHP OOP?

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

事实上,

情况正好相反:理论上,getters/setters是错误的。属性定义对象的状态,其中方法定义行为。Getters/Setters只拦截对属性的读写访问,但它们完全打破了语义:现在读取对象的状态是对象的行为。

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

Set/Get 方法是最佳实践,但如果无论如何都不打算使用变量,为什么我们有机会声明变量 public?

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

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

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

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

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

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

让我们看看..这是来自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();

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

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

相关文章: