首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP OOP -- getter setter用于防止更改属性的值吗?

PHP OOP -- getter setter用于防止更改属性的值吗?
EN

Stack Overflow用户
提问于 2017-04-14 07:41:07
回答 2查看 766关注 0票数 3

我已经读过关于封装的文章,据我理解,的好处是防止更改属性的值?(如果我误解了,请警告我)

但是,它有一个方法设置程序来更改属性private $bar的值。

我是不是误会了?因为这并不能阻止财产价值的改变。

代码语言:javascript
运行
复制
<?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'

    ?>

所以,我现在很困惑,为什么他们不正常使用公共财产。

代码语言:javascript
运行
复制
class Foo2 
{
    public $bar = 3;
}
$foo2 = new Foo2();

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

回答 2

Stack Overflow用户

发布于 2017-04-14 22:10:25

我的观点是,您需要尽可能地避免公共字段、getter和setter。封装不是“为了防止更改属性值”。这一切都是关于隐藏类的具体工作方式。类的所有方法都必须定义一个行为,但不是这个类的确切工作方式。

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

代码语言:javascript
运行
复制
Dog dog = new Dog();
dog.setBall(new Ball());

但在现实世界里,你不能把球传给狗。你可以叫狗去接球。狗狗会决定它想不想要一个球。

OOP way就是这样的:

代码语言:javascript
运行
复制
Dog dog = new Dog();
dog.take(new Ball());
Ball ball = dog.give();  

上面的代码演示了封装的工作原理。我推荐读一本为什么getter和setter是邪恶的?。它详细地解释了这个问题。

票数 1
EN

Stack Overflow用户

发布于 2017-04-14 08:04:10

啊,我记得当我第一次读到这个东西的时候,我也在想同样的事情。这样做的想法是,您确实执行了对访问属性修改的限制。如果您有一些函数直接设置对象值的属性,这将覆盖您拥有的属性。通过指定特定函数并限制对类本身或子类的访问(受保护的可见性),可以减少风险。此外,您还可以针对正在设置的数据运行验证检查和附加处理。如果其他开发人员正在做这个项目呢?并直接设置属性。如果你向右看,该网站似乎已经有几篇文章针对这个问题:为什么要使用getter和setter?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43407323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档