变量封装、Set/Get 方法是最佳实践,但如果它不打算使用,为什么我们有机会声明一个公共变量?如果变量在默认情况下始终是私有的并且没有机会将它们公开,因为我阅读的所有教程都说它们应该用 set/get 方法封装,那会更好吗?至少在 PHP OOP 中是否有任何有效的公共变量用例?
3 回答
事实上恰恰相反:理论上 getter/setter 是错误的。属性定义对象的状态,方法定义行为。Getters/Setters 只是拦截了对属性的读写访问,但它们完全打破了语义:现在读取对象的状态是对象的一种行为。
为了使属性再次看起来像属性,路上有一个 RFC :) https://wiki.php.net/rfc/propertygetsetsyntax
Set/Get 方法是最佳实践,但如果它不打算使用,为什么我们有机会声明一个公共变量?
最佳实践和不打算使用是不一样的。一种语言需要为不同的用例提供不同的工具,并且应该保持一致。
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();
事实上,这个类中有很多私有属性和函数,但它是私有的。
班级有(单一)责任做某事。 封装是只发布人们用来做那件事的东西,并将内部的技术/基础设施保持为私有。