构造函数在PHP中重载

时间:2011-10-11 17:00:23

标签: php oop overloading

问题Approch

我有一个像这样的类,有一个重载的构造函数

代码

<?php 
/*
  Users Abstract Class

*/
abstract class User 
{

    protected $user_email;
    protected $user_username;
    protected $user_password;
    protected $registred_date;


    //Default constructor
    function User()
    {

    }

    //overloded constructor
    function User($input_username,$input_email,$input_password)
    {
    __set($this->user_username,$input_username);
    __set($this->user_email,$user_password);
    __set($this->user_password,$input_password);
    }

}


?>

问题详情

以上代码提供了错误:error:Fatal error: Cannot redeclare User::User()

其他语言如C ++和Java使用上述方法重载构造函数如何在 PHP OOP 中执行此操作?

其他信息

我在LAMP * 中使用* PHP 5.3.2,在此版本中应完全支持OOP概念

4 个答案:

答案 0 :(得分:12)

PHP没有重载。它有一系列神奇的方法,在手册中被描述为重载(参见:http://php.net/manual/en/language.oop5.overloading.php),但它并不是你想到的。

另外,在PHP 5+中编写构造函数的正确方法是使用__construct方法:

public function __construct(/* args */)
{
    // constructor code
}

答案 1 :(得分:3)

根本不能根据参数重载方法。在您的情况下,答案可能就像my answer to a similar question here

一样简单

答案 2 :(得分:1)

PHP不支持从其他语言中了解重载。相反,您可以使用func_get_args();并对其进行处理。

http://www.php.net/func_get_args

有关PHP中重载可能性的更多信息: http://php.net/manual/en/language.oop5.overloading.php

答案 3 :(得分:0)

您可以尝试类似的操作...用例在GitHub gist

<?php
use \InvalidArgumentException;
class MyClass{
    protected $myVar1;
    protected $myVar2;
    public function __construct($obj = null, $ignoreExtraValues = false){
        if($obj){
            foreach (((object)$obj) as $key => $value) {
                if(isset($value) && in_array($key, array_keys(get_object_vars($this)))){
                    $this->$key = $value;
                }else if (!$ignoreExtraValues){
                    throw new InvalidArgumentException(get_class($this).' does not have property '.$key);
                }
            }
        }
    }
}