是否可以在PHP中重载构造函数

时间:2015-12-21 11:36:27

标签: php oop

我有一个qeustion。我有一些oop的经验,但我是PHP(oop)的新手。我正在努力学习它。可能吗 重载一个consturctor?

在其他语言中,它可能会重载构造函数,但在php中没有? 我尝试了但是我从IDE获得了以下消息: "具有相同名称的方法在本课程中已经有所不同"

class testClass{

    public $param1 = "";
    public $param2 = "";

    public function __construct($param1, $param2){        
        $this->param1 = $param1;
        $this->param2 = $param2;

    }

    public function __construct($param1){
        $this->param1 = $param1;
        //ToDO use function to set pramam2
    }
}

3 个答案:

答案 0 :(得分:3)

执行此操作的最佳方法是使用可选参数,正如其他人在评论中所说,PHP不支持重载,所以这将是我的建议:

class Foo
{
    public function __construct($p1, $p2 = null)
    {
        $this->p1 = $p1;
        $this->p2 = $p2;
    }
}

这意味着您可以在创建课程时选择使用$p2,但必须使用$p1

AFAIK,这是重载的唯一形式(如果你可以称之为),它还存在于PHP中

修改

来自kingkero的回答的扩展,我提出了这个解决方案,它将逻辑排除在构造函数之外,减去函数调用:

<?php
class overload
{
    public function __construct() 
    {
        return $this->switchConstruct(func_get_args());
    }

    protected function switchConstruct(array $args)
    {
        switch (count($args))
        {
            case 0:
                return print "0 params<br />";
            case 1:
                return call_user_func_array(array($this, 'constr1'), $args);
            case 2:
                return call_user_func_array(array($this, 'constr2'), $args);
        }
        die("Invalid number of args");
    }

    protected function constr1($a) 
    {
        print "constr1 called<br />";
    }

    protected function constr2($a, $b) 
    {
        print "constr2 called<br />";
    }
}

答案 1 :(得分:2)

不,你不能重载这样的方法。

您可以做的最好的事情是使用可选参数:

class testClass{

    public $param1 = "";
    public $param2 = "";

    public function __construct($param1, $param2=null){        
        $this->param1 = $param1;
        if($param2){
            $this->param2 = $param2;
        }else{
            //ToDO use function to set pramam2
        }
    }
}

答案 2 :(得分:1)

如前所述,你不能这样做。但是,如果您希望它比给定的答案更具可变性,请尝试将func_get_args()call_user_func_array()结合使用(demo

class Foo {
  public function __construct() {
    $args = func_get_args();
    switch (count($args)) {
      case 2:
        return call_user_func_array(
          array($this, 'constructorFor2Arguments'),
          $args
        );
      //...
    }
  }

  protected function constructorFor2Arguments($one, $two) {
    //...
  }
}