私有属性访问与构造函数的setter与构造函数的直接访问

时间:2017-05-30 16:34:31

标签: php oop

在TrainBoardingCard中我们有setTrainCode可以在构造函数中使用$ this-> trainCode = $ trainCode,或者我们总是使用setTrainCode,如$ this-> setTrainCode($ trainCode);因为它将来可能有一些逻辑。

对于这两种情况有哪些优点和缺点?请原因告诉我们您的偏好。

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 个答案:

答案 0 :(得分:1)

取决于。

你可以说有两种不同的思想流派,它们都兼顾了二者和构造者。

  1. 必须创建对象已经有效的状态。可以通过原子操作将该状态从一个有效状态更改为另一个有效状态。这意味着,您的类实际上并没有简单的setter本身。

    $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);
    }
    
  3. 或者你可以混合或两者兼而有之,但这会引起一些混乱。

    不确定这是否会让你更好或更糟:)