2012-04-20 58 views
7

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

+0

有用于保护变量的类(例如继承/覆盖),但我不知道任何公共的。这可能是由于在PHP 5中被解释为public的类中的php 4 var $ var声明造成的。 – Hajo 2012-04-20 11:29:45

+2

简单的答案:因为** not **(wanting)使用getters和setters有各种完全有效的理由,所以你可以简单地访问公共变量。 – CodeCaster 2012-04-20 11:30:51

+0

@CodeCaster在大多数情况下的动态oop显示我认为不好的设计。 – Hajo 2012-04-20 11:32:33

回答

8

事实上,它只是另一种方式:理论上,获取者/设置者是错误。这些属性定义了一个对象的状态,这些方法定义了行为。 Getters/Setter只拦截对属性的读写访问,但它们完全破坏语义:现在读取对象的状态是对象的行为。

为了让性能的样子性质又存在道路:) https://wiki.php.net/rfc/propertygetsetsyntax

1

设置在RFC/Get方法是最好的做法,但为什么我们有机会来声明一个变量市民如果它是不是意味着要用吗?

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

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

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

这个问题不能具体回答,这太主观了,太多不同的用例会导致不同的答案。

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

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

-1

让我们来看看.. 这是一个真实世界的电子邮件API类CakePHP EmailComponent。使用这个类,你只需要在“设置”部分物业然后就send()

$this->Email->to = '[email protected]'; 
$this->Email->from = '[email protected]'; 
$this->Email->title = 'xxx'; 
$this->Email->msg = 'blabla..'; 
$this->Email->send(); 

其实有很多这样的类中私有属性和功能,但它是私有的。

有(单一)责任做某事。 封装仅公布人们用来做这件事情,并保持技术/基础设施内部为私人

相关问题