为什么要为doctrine2类使用getter setter

时间:2015-07-02 11:54:00

标签: php oop doctrine-orm

为什么我们通常使用docterine2类的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;
}

3 个答案:

答案 0 :(得分:6)

  1. 您无法在延迟加载元素所需的属性上创建代理调用。这是Doctrine使用的非常重要的工具。
  2. Getters和setter在一般情况下比属性更具灵活性。
  3. 如果getter和setter的开销是一个真正的问题,你应该考虑从PHP切换到一些“更快速的”平台。

答案 1 :(得分:2)

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

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

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

对于doctrine实体类,操作传入/传出数据也很有用,只能使用公共方法。

heres在不同的SO论坛上做了很好的解释。

答案 2 :(得分:2)

而不是公共属性或设置者,使用immutable objectsvalue objectsembeddables when around 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;
    }

}

仅在需要时使用吸气剂。