Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么对doctrine2类使用getter setter_Php_Oop_Doctrine Orm - Fatal编程技术网

Php 为什么对doctrine2类使用getter setter

Php 为什么对doctrine2类使用getter setter,php,oop,doctrine-orm,Php,Oop,Doctrine Orm,为什么我们通常使用doctrine2类的getter setter来保存和获取数据 如下图所示: <?php // src/Product.php class Product { /** * @var int */ protected $id; /** * @var string */ protected $name; public function getId() { return

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

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

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

公开类成员可能会导致意外重写它们,因此为了防止这种情况,我们限制访问。阅读
封装

在条令实体类的情况下,操纵传入/传出数据也很有用,这只能通过公共方法来实现

在不同的SO论坛上进行了很好的解释

  • 不能对惰性加载元素所需的属性创建代理调用。这是一个被教条大量使用的工具
  • 一般来说,getter和setter比属性提供了更多的灵活性
  • <> LI>如果吸气剂和定位器的开销是一个真正的问题,你应该考虑从PHP切换到一些“更快的通用”平台。
    与公共属性或setter相比,有更可靠的方法使用、或。我建议你检查一下

    有了这些,您就可以通过构造函数传递所需的属性。就你而言:

    <?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 setters。请看“避免写幼稚的二传手和二传手”,它在哪里说的?避免写幼稚的二传手和二传手:我想你误解了他们。他们举的例子是公共成员,而不是私人成员。在这种情况下,他们是对的。但是在很少的情况下,你会希望使用公共成员。
    
    <?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;
        }
    
    }