gpt4 book ai didi

PHP OOP - getter setter 是否用于防止更改属性值?

转载 作者:行者123 更新时间:2023-12-04 17:52:35 26 4
gpt4 key购买 nike

我已经读过关于封装的内容,根据我的理解,好处是防止更改属性值? (如有误解请多多指教)

但是,它有一个方法 setter 可以更改属性 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'

?>

所以现在我很困惑为什么他们不正常使用公共(public)属性(property)。

class Foo2 
{
public $bar = 3;
}
$foo2 = new Foo2();

echo $foo2->bar; // Print '3'
$foo2->bar = 'Hello';
echo $foo2->bar; //Print 'Hello';

最佳答案

我的意见是您需要尽可能避免使用公共(public)字段、getter 和 setter。封装不是“防止更改属性值”。这完全是为了隐藏类的具体工作方式。类的所有方法都必须定义行为,而不是定义此类的具体工作方式。

让我举个例子。传统的方式是:

Dog dog = new Dog();
dog.setBall(new Ball());

但在现实世界中,您不能将球传给狗。你可以告诉狗去 catch 。狗会决定他是否要 catch 。

OOP 方式是这样的:

Dog dog = new Dog();
dog.take(new Ball());
Ball ball = dog.give();

上面的代码演示了封装的工作原理。我建议阅读 article why getters and setters are evil .详细解释了问题

关于PHP OOP - getter setter 是否用于防止更改属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com