Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该使用公共setter在类内设置私有属性值吗?_Php_Oop_Class_Coding Style_Refactoring - Fatal编程技术网

Php 我应该使用公共setter在类内设置私有属性值吗?

Php 我应该使用公共setter在类内设置私有属性值吗?,php,oop,class,coding-style,refactoring,Php,Oop,Class,Coding Style,Refactoring,假设我有一个类测试,它有一个名为$\u list的私有属性和一个公共setter。 公共setter用于从外部设置属性值 class Test { private $_list; public function getList() { return $this->_list; } public function setList($list) { $this->_list = $list; } pub

假设我有一个类测试,它有一个名为
$\u list
的私有属性和一个公共setter。
公共setter用于从外部设置属性值

class Test {
    private $_list;

    public function getList() {
        return $this->_list;
    }

    public function setList($list) {
        $this->_list = $list;
    }

    public function initialize() {
        $list = array();

        /* ... Some code that fills the $list with values etc. ... */

        // 1) Set value directly
        $this->_list = $list;

        // 2) Use public setter
        $this->setList($list);
    }
}
问题是-是否需要使用公共setter在类内设置私有属性值?
哪种方式更好?#1或#2?为什么呢?
你喜欢哪种方式? 我想看到一个完整的答案,解释每种方法的优缺点


谢谢。

如上所述,两者都可以接受,但正确的答案是:宁可使用直接属性访问,但有时最好使用setter

第一,(财产访问)优点:

  • 易读且速度稍快
  • 为您提供了一种方法,即这是对象的一个简单属性
第二,(二传手)优点:

  • 您可以在设置属性时执行自定义操作(例如初始化其他属性、缓存或调用参数对象上的方法)
  • 您将属性视为类的子元素,该类可能实现了自己的逻辑
我认为建议使用变量背后没有逻辑更重要如果简单,请使其看起来简单。如果不简单,您仍然可以使用setter


关于getter和属性访问,您也可以问同样的问题,上面也适用。

两者都可以。函数调用有/非常/轻微的开销,但不足以产生影响。除此之外,在这种情况下,它们基本上是相同的。使用该函数的一个好处是,如果在设置变量时使用了额外的逻辑,那么在这种情况下,它将保持事情的一致性,而无需复制代码?O_O@AlexLunix可能有各种原因,不是因为给出的示例,但是如果(根据我的评论)有进一步的逻辑,比如验证值,那么你不希望人们直接设置对象属性的任何值,你希望他们进行验证。@AlexLunix理想情况下会做更多的工作来验证输入,或者对象的内部结构比一组简单的变量更复杂。@Alex Lunix Setter曾经可以变成比
$this->\u list=$list
更复杂的东西。通过setter允许公众访问私有财产,允许处理一些预处理功能、间接赋值、允许在赋值前检查值等。感谢您的回答,GaborSch。让我们等一会儿,看看是否还有更多的人想分享他们的观点。如果没有比你更好的答案,我会接受你的。谢谢!事实上,这适用于所有面向对象的语言,而不仅仅是PHP。