我有一个像这样的类,有一个重载的构造函数
<?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概念
答案 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);
}
}
}
}
}