如果构造函数重载不可能,那么如何在PHP中创建具有不同参数的对象?

时间:2014-12-24 12:36:07

标签: php oop

这是Employee.class.php

class Employee

{

    public $first_name;
    public $last_name;
    public $date_of_birth;



public function __construct($fn, $ln, $dob)

{
    $this->first_name = $fn;
    $this->last_name = $ln;
    $this->date_of_birth = $dob;

}

public function registerEmployee() 

{
    require '../config.php';
    $stmt = $dbh->prepare("INSERT INTO emp_reg(e_name,
                                             e_lname,
                                             e_dob) VALUES(?,?,?)");
    $stmt->execute(array($this->first_name,
                         $this->last_name, 
                         $this->date_of_birth));

    echo "Saved Successfully";
}

public function return_employee_data($employee_id)

{
    require '../config.php';
    $stmt = $dbh->query("SELECT * FROM emp_reg WHERE e_id = '$employee_id'");
    $arr = $stmt->fetchall(PDO::FETCH_ASSOC);
    $res = json_encode($arr);
    echo $res;
}



}

当我要在其他文件中要求此课程时,只需要xyz.php

return_employee_data($employee_id);

我要在该文件中创建一个对象,如

// constructor overloading is not possible so I can't create `$EmployeeObject` like this.
$EmployeeObject = new Employee();

因此我无法像这样运行此功能return_employee_data($employee_name);

$EmployeeObject->return_employee_data($employee_name); //not possible in this new file

如果构造函数重载不可能,那么如何创建具有给定参数的对象,并且没有任何参数?我还想在其他文件中创建具有可变参数的对象,其中我们只包含类定义,文件数据不提供数据或可变数据来创建上述定义的对象?

如果我们无法创建对象,我如何调用其底层函数来解决任何特定问题?

4 个答案:

答案 0 :(得分:2)

PHP不支持构造函数重载。理解并使用重载的构造函数,这有点破解。您可以使用func_get_args()来检索和检查传递的参数,并使用匹配的参数调用自定义重载的__construct函数。

class Construct{ 
    function __construct() { 
        $a = func_get_args();   // get constructor parameters
        $i = func_num_args();   // count(func_get_args())

        if (method_exists($this,$f='__construct'.$i)) { 

            /*
            *   Call to the overloaded __construct function
            */
            call_user_func_array(array($this,$f),$a); 
        } 
    } 

    function __construct1($a1) { 
       echo('__construct with 1 param called: '.$a1); 
    } 

    function __construct2($a1,$a2) { 
        echo('__construct with 2 params called: '.$a1.','.$a2); 
    } 

    function __construct3($a1,$a2,$a3) { 
        echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3); 
    } 
} 

$obj    = new Construct('one');     // Prints __construct with 1 param
$obj2   = new Construct('one','two');   // Prints __construct with 2 params
$obj3   = new Construct('one','two','three'); // Prints __construct with 3 params

答案 1 :(得分:0)

我认为最好的方法是使用辅助方法,例如:

$employee = Employee::withName($name);

如果您对此方法感兴趣,请查看@Kris here提供的完整答案。

答案 2 :(得分:0)

首先,你的回答有多个问题。

a)为了让您能够以多种形式拥有“构造函数”(但仍然有限),请参阅以下示例;

  class Foo{
        public $dmg;
        public $speed;
        public function __construct($dmg = '2', $speed = '3'){
            $this->dmg = $dmg;
            $this->speed = $speed;
            }
    }

    $a = new Foo();
    echo $a->speed."\n"; //3
    $a = new Foo(6,6);
    echo $a->speed."\n"; //6

b)你的函数return_employee_data不依赖于类中的任何内部,这种方式如果你想在外面使用它你可以使它静态(在定义前面写) static)所以你可以在你用这个类包含库的任何地方将它用作Employee::return_employee_data($id);

答案 3 :(得分:0)

PHP确实不支持重载,而是让您能够为方法提供可选参数。您可以手动扩展构造函数以包含多种类型的构造函数,如下所示:

public function __construct($fn = null, $ln = null, $dob = null)
{
   if($fn === null && $ln === null && $dob === null ) {
      $this->constructNothing();
   }
   else {
     $this->constructFull($fn,$ln,$dob);
   }
}

private function constructFull( $fn, $ln, $dob ) {
   $this->first_name = $fn;
   $this->last_name = $ln;
   $this->date_of_birth = $dob;
}

private function constructNothing() {
   // whatever you need goes here
}

现在你可以调用new Employee()并从中获取一个特殊的构造函数。

(顺便说一句,如果你调用一个参数太少的函数,PHP就不会抱怨;它只会传递null所有这些函数。所以如果你的新构造函数什么也不做,那就等了。现在就像你一样工作,因为它只会为每个属性分配null,无论如何都是默认值)