2017-05-30 76 views
0

在TrainBoardingCard我们setTrainCode可以使用$ this-> trainCode = $ trainCode在构造函数中,或者我们总是使用setTrainCode像$ this-> setTrainCode($ trainCode );因为它将来可能有一些逻辑。私人财产访问与构造函数的setter与构造函数的直接访问

对于这两种情况有什么优点和缺点?请让我们知道你的偏好和理由。

class TrainBoardingCard extends BoardingCard 
{ 
    /** 
    * @var string 
    */ 
    private $trainCode; 

    /** 
    * @param string $trainCode 
    */ 
    public function __construct(string $trainCode) 
    { 
     $this->trainCode = $trainCode; 
    } 

    /** 
    * @return string 
    */ 
    public function getTrainCode(): string 
    { 
     return $this->trainCode; 
    } 

    /** 
    * @param string $trainCode 
    */ 
    public function setTrainCode(string $trainCode) 
    { 
     $this->trainCode = $trainCode; 
    } 
} 

回答

1

这取决于。

你可以说有两个不同的思想流派他们都处理建立者和构造者。

  1. 该对象必须被创建为有效状态。这种状态可以通过原子操作从一个有效状态改变到另一个有效状态。这意味着,你的课程实际上并没有简单的设置者 / se。

    $client = new Client(
        new FullName($name, $surname), 
        new Country($country); 
        new Address($city, street, $number)); 
    
    // do something 
    
    $client->changeLocation(
        new Country('UK'), 
        new Address('London', 'Downing St.', '10')); 
    
  2. 构造函数只用于传递依赖关系而不传递状态。该对象的状态默认为空白,仅在外部使用setter才会更改。

    $client new Client(); 
    $client->setId(14); 
    
    $mapper = new DataMapper(new PDO('...'), $config);   
    $mapper->fetch($client); 
    
    if ($client->getCity() === 'Berlin') { 
        $client->setCity('London'); 
        $mapper->store($client); 
    } 
    

或者你可以有一个组合或两者兼而有之,但这样会造成一些混乱。

不知道这将使它更好地为您或更糟:)

+0

感谢teresko你有用的信息, –

+0

有一点仍不清楚我的,里面的构造,我们可以做到这一点$这个 - > trainCode = $ trainCode;或者应该总是做$ this-> setTrainCode($ trainCode);如果我们有二传手(可能二传手可以有一些逻辑在未来可能不会)。 –

+0

如果你在构造函数中传递的是依赖项(如在其他对象中),那么这不是必需的。如果你传递值(或值对象),那么使用setter将是一个好主意。 –