【问题标题】:Pass class properties as values to method parameters将类属性作为值传递给方法参数
【发布时间】:2013-05-07 11:32:09
【问题描述】:

假设我有

class A {
    private $_property = 'string';

    public function method($property=$this->_property) {
        // ...
    }
}

它不允许我这样做。

我想这样做的原因是(可能是不好的做法,但仍然......):

  1. 我希望这个类的每个方法中属性的默认值都是'string',但我不希望public function method($property='string'),因为如果我需要更改它,我必须在每个方法中都这样做

  2. 想在实例化类的时候传参数,用这个方法,所以最近需要$class = new A(); $param = 'string2'; $class->method($param);

  3. 由于$_property 是私有的,我无法更改它的值

  4. 如果我这样做:

class A {
    private $_property = 'string';

    public function method($property) {
        $property = $this->_property;
    }
}

它不允许我从外部更改参数。我的意思是,无论第 2 点的代码如何,它始终是“字符串”。

有没有办法从第一个引用的代码中实现这一点,而不公开属性,也不在方法内部分配参数的值?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    参数默认值需要是静态的,因为它们需要在编译时进行评估。如果您将类属性设为static,则可以使用它,但这可能不是您想要的。

    最简单的方法大概是:

    public function method($property = null) {
        $property = $property ?: $this->_property;
        ...
    }
    

    (使用 PHP 5.3 的简写 ?: 运算符。)

    【讨论】:

    • 真的很喜欢这个解决方案。谢谢! :)
    【解决方案2】:

    我会在我的班级中使用 const :

    class A {
        const _property = 'string';
    
        public function method($property = self::_property) {
            echo $property;
        }
    }
    

    【讨论】:

      【解决方案3】:

      尝试做这样的事情:

      Class A {
      
      private $_property = 'string';
      
      public function method($property=null) {
          if($property == null)
              $property = $this->_property;
      }
      

      它将模拟您的需要。当您不发送任何参数时,它将从您的班级中获取默认参数。

      【讨论】:

        猜你喜欢
        • 2021-02-05
        • 2019-07-30
        • 2011-08-15
        • 1970-01-01
        • 2014-03-22
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多