2016-05-22 92 views
2

我有一个类在PHP中,想知道是否有一个特定的约定如何在我的构造函数中设置这些私有变量。如何在PHP中设置类变量?

我应该使用我的setter还是this

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

OR

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->setBar($foobar); 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

或者是我的问题只是哲学? 同样的问题可以用getters询问。但我想你在处理父类的私有变量时必须使用settersgetters

+2

由于你的getter和setter字面上没有任何限制,所以不需要设置变量,你可以将它设置为public并直接修改; –

+0

好点。所以,只有当你想在别的地方做点别的事情时才使用'setters'和'getters',然后按原样返回它们呢? – Jurik

+1

@NiettheDarkAbsol - 我不同意。 1)把所有东西都作为对象的一种方法 - 避免混淆2)如果要计算其中的一个,将来会发生什么?请参阅http://programmers.stackexchange.com/questions/176876/why-shouldnt-i-be-using-public-variables-in-my-java-class –

回答

2

由于数据验证和将来的维护,您应该在构造函数中使用setBar

// a developer introduces a bug because the string has padding. 
$foo->setBar("chickens "); 

// the developer fixes the bug by updating the setBar setter 
public function setBar($bar) { 
    $this->bar = trim($bar); 
} 

// the developer doesn't see this far away code 
$f = new foo("chickens "); 

开发人员将代码发送给生产思考他修正了错误。

1

在这样一个微不足道的例子中,是的,你的问题大多是哲学的! :) 但是,如果你的setter会执行一些特殊的操作(例如检查输入的有效性或修改它),那么我会建议使用第二种方案。

+0

这是一个好点 - 所以二传手是一个很好的地方验证输入? – Jurik

+1

好点!那么,通过“输入”,我的意思是功能的论点,而不是用户的输入。一般来说,我更喜欢单独验证用户的输入。但是,通过一些简单的应用程序,您并不总是希望遵循所有最佳实践。一切都取决于你的需求。 – Abrab

1

此:

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

没有比这不同:

类Foo {

public function __construct($bar){ 
    $this->bar = $bar; 
} 

public $bar; 

一个原因使用一个getter和setter方法是,如果你只允许一个变量被设置为如下对象结构:

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 


    public function getBar() { 
    return $this->bar; 
    } 
} 

所以不要过度使用getter和setter,除非必要