我已经读过关于封装的文章,据我理解,的好处是防止更改属性的值?(如果我误解了,请警告我)
但是,它有一个方法设置程序来更改属性private $bar的值。
我是不是误会了?因为这并不能阻止财产价值的改变。
<?php
class Foo
{
private $bar = 3;
public function getbar()
{
return $this->bar;
}
public function setBar($bar)
{
$this->bar = $bar;
}
}
$foo = new Foo();
echo $foo->getbar(); //Print '3'
$foo->setBar("Hello");
echo $foo->getbar(); //Print 'Hello'
?>所以,我现在很困惑,为什么他们不正常使用公共财产。
class Foo2
{
public $bar = 3;
}
$foo2 = new Foo2();
echo $foo2->bar; // Print '3'
$foo2->bar = 'Hello';
echo $foo2->bar; //Print 'Hello';发布于 2017-04-14 22:10:25
我的观点是,您需要尽可能地避免公共字段、getter和setter。封装不是“为了防止更改属性值”。这一切都是关于隐藏类的具体工作方式。类的所有方法都必须定义一个行为,但不是这个类的确切工作方式。
让我举个例子。传统的方法是:
Dog dog = new Dog();
dog.setBall(new Ball());但在现实世界里,你不能把球传给狗。你可以叫狗去接球。狗狗会决定它想不想要一个球。
OOP way就是这样的:
Dog dog = new Dog();
dog.take(new Ball());
Ball ball = dog.give(); 上面的代码演示了封装的工作原理。我推荐读一本为什么getter和setter是邪恶的?。它详细地解释了这个问题。
发布于 2017-04-14 08:04:10
啊,我记得当我第一次读到这个东西的时候,我也在想同样的事情。这样做的想法是,您确实执行了对访问属性修改的限制。如果您有一些函数直接设置对象值的属性,这将覆盖您拥有的属性。通过指定特定函数并限制对类本身或子类的访问(受保护的可见性),可以减少风险。此外,您还可以针对正在设置的数据运行验证检查和附加处理。如果其他开发人员正在做这个项目呢?并直接设置属性。如果你向右看,该网站似乎已经有几篇文章针对这个问题:为什么要使用getter和setter?
https://stackoverflow.com/questions/43407323
复制相似问题