类实例化时的NULL参数

时间:2014-02-21 16:53:47

标签: php class

我很少在PHP中使用类,所以请原谅我的无知。

我有一个带有各种函数的类,带有返回值。在课程开始时,我有一个用于创建类函数中使用的变量的构造函数。像这样:

function __construct($firstVariable,$secondVariable,$thirdVariable)  {

     if(isset($firstVariable)) { $this->firstname = $first; };
     if(isset($secondVariable)) { $this->secondname = $second; };
     if(isset($thirdVariable)) { $this->thirdname = $third; };
}

我的问题是:如果我只打算使用$secondVariable怎么办?我知道我可以在类实例化时执行以下操作:

$Class = new classname(NULL,$secondVariable,NULL);

但我觉得这是不恰当或低效的。使用这种方法,每次我不想使用变量时,我都需要传递NULL ...这会发生很多,因为我在页面之间使用了类的变体。例如,页面#1使用第二个参数,但页面#2使用第三个参数。 #3使用全部三个。

因此...

#1: $Class = new classname(NULL,$secondVariable,NULL);
#2: $Class = new classname(NULL,NULL,$thirdVariable);
#3: $Class = new classname(#firstVariable,$secondVariable,$thirdVariable);

嗯,这很好,除了如果我在类中添加一个需要自己的变量并因此需要第四个参数的新函数。我需要回过头来添加'NULL'作为所有类实例化的第四个参数,在这个实例化中没有使用这个新函数(并且由于类需要第四个参数而导致php抛出错误)。当然,这不是PHP的最佳实践!

3 个答案:

答案 0 :(得分:3)

这应该有效,我想?

function __construct($firstVariable=NULL,$secondVariable=NULL,$thirdVariable=NULL) {
  if(isset($firstVariable)) { $this->firstname = $first; };
  if(isset($secondVariable)) { $this->secondname = $second; };
  if(isset($thirdVariable)) { $this->thirdname = $third; };
}

然后,如果添加更多参数,除非另行指定,否则它们将默认为NULL。请注意,即使是空字符串也会覆盖默认的NULL。

因此,对于仅使用$secondVariable的示例,您可以执行:$Class = new classname(NULL,$secondVariable);。其余的将自动默认为NULL。

如果您随后更改了函数以包含更多变量:

function _construct($firstVariable=NULL,$secondVariable=NULL,$thirdVariable=NULL,$fourthVariable=NULL) {

这不会引起任何问题。

答案 1 :(得分:1)

您可以使用默认参数来满足您的需求。

参见 LIVE demo

function __construct($firstVariable=NULL,$secondVariable=NULL,$thirdVariable=NULL) {

  if(isset($firstVariable)) { $this->firstname = $first; };
  if(isset($secondVariable)) { $this->secondname = $second; };
  if(isset($thirdVariable)) { $this->thirdname = $third; };
}

答案 2 :(得分:1)

如果您想跳过从最后到第一个的参数,请使用BT643答案。但是,如果您只想使用第二个并跳过上一个,则应使用factory method pattern

class YourClass {
  function __construct($firstVariable,$secondVariable,$thirdVariable) {
    // define the object here
  }

  static function createWithSecond($secondVariable) {
    return new YourClass(NULL,$secondVariable,NULL);
  }
}

// the client code
$obj1 = new YourClass(1,2,3); // use constructor
$obj2 = YourClass::createWithSecond(2); // use factory method