【问题标题】:Any way to simplify PHP constructor arguments?有什么方法可以简化 PHP 构造函数参数?
【发布时间】:2012-07-27 20:32:08
【问题描述】:

当我想将值传递给 PHP 构造函数时,我必须这样做:

class Rump {
    private $var1;
    private $var2;
    private $var3;

    public function __construct($var1, $var2, $var3) {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }
}

有没有更简单的方法呢?像

class Rump {
    public function __construct($var1, $var2, $var3) {
        //call a function here
    }
}

【问题讨论】:

    标签: php constructor variable-assignment simplify


    【解决方案1】:
    public function __construct($var1, $var2, $var3) {
        foreach (array('var1', 'var2', 'var3') as $var) {
            $this->$var = $$var;
        }
    }
    

    或:

    public function __construct() {
        foreach (array('var1', 'var2', 'var3') as $i => $var) {
            $this->$var = func_get_arg($i);
        }
    }
    

    或:

    public function __construct() {
        list($this->var1, $this->var2, $this->var3) = func_get_args();
    }
    

    但实际上,与其节省一两行代码并试图变得聪明,不如使用显式赋值,因为它很容易理解,即使很无聊。如果你发现你的论点太多,无法一一输入,可能是你的论点太多了。

    【讨论】:

      【解决方案2】:

      我知道这个问题很老,实际上这是一个重复的话题,但对于偶然发现这里的人来说可能仍然很有趣。

      PHP 5.6+ 开始,您可以使用省略号 ...,称为 Splat 运算符

      function func(...$manyArgs) {
          foreach ($manyArgs as $each) {
              // do something with $each argument 
          }
      }
      

      RFC

      或者从 PHP 7.1 开始,存在一个名为 iterable

      的类型提示
      function func(iterable $args) {
          foreach ($args as $arg) {
              // awesome stuff
          }
      }
      

      RFC

      很快,一旦 PHP 8 发布,它就会变得不那么混乱,因为您不再需要在赋值之前声明属性。

      使用您的代码,这个构造函数样板:

      class Rump {
          private $var1;
          private $var2;
          private $var3;
      
          public function __construct($var1, $var2, $var3) {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
          }
      }
      

      很快将缩短为:

      class Rump {
          public function __construct(
              private $var1, 
              private $var2, 
              private $var3) {}
      }
      

      RFC

      因此与iterable 结合使用会更有用。不允许使用 Splat 运算符。请注意,这仅适用于构造函数。

      class Rump {
          public function __construct(private iterable $vars) {}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-18
        • 2017-07-08
        • 2014-01-05
        • 1970-01-01
        • 2021-01-08
        • 2014-04-07
        • 2018-05-14
        • 1970-01-01
        相关资源
        最近更新 更多