为什么对doctrine2类使用getter setter


Why to use getter setters for doctrine2 classes

为什么我们通常使用doctrine2类的getter setter来保存和获取数据?

如下所示:

<?php
// src/Product.php
class Product
{
    /**
     * @var int
     */
    protected $id;
    /**
     * @var string
     */
    protected $name;
    public function getId()
    {
        return $this->id;
    }
    public function getName()
    {
        return $this->name;
    }
    public function setName($name)
    {
        $this->name = $name;
    }
}

如果我们公开类属性,就可以在不使用getter-setter的情况下保存数据。不是吗?

<?php
// src/Product.php
class Product
{
    /**
     * @var int
     */
    public $id;
    /**
     * @var string
     */
    public $name;
}
  1. 不能对延迟加载的元素所需的属性创建代理调用。这是条令使用得相当重的工具
  2. Getter和setter通常比属性更具灵活性
  3. 如果getter和setter的开销是一个真正的问题,那么您可能应该考虑从PHP切换到一些"通用更快"的平台

因为类的成员(变量)通常(并且应该)是私有的或受保护的。

因此,我们使用一个公共的set/get方法来存储和检索它们的数据,否则这些数据在类之外是不可用的。

公开类成员可能会导致它们被意外覆盖,因此为了防止这种情况,我们限制了访问权限。阅读encapsulation

在条令实体类的情况下,操作传入/传出数据也很有用,这只能用公共方法来完成。

在另一个SO论坛上有一个很好的解释。

与公共属性或setter不同,在Doctrine中有更多的SOLID方法,使用不可变对象、值对象或可嵌入对象。我建议你检查一下。

有了这些,您就可以通过构造函数传递所需的属性。在您的情况下:

<?php
class Product
{
    /**
     * @var int
     */
    private $id;
    /**
     * @var string
     */
    private $name;
    /**
     * @param int $id
     * @param string $name
     */
    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

只有在需要的时候才使用getter。