Перегрузка конструктора в PHP
Проблема 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 ?
Дополнительная Информация
Im с помощью *PHP 5.3.2 в лампе* какие концепции ООП должны полностью поддерживаться в этой версии
4 ответов
PHP не имеет перегрузки. Он имеет ряд магических методов, которые описываются как перегрузка в руководстве (см.:http://php.net/manual/en/language.oop5.overloading.php), но это не то, о чем вы думаете.
кроме того, в стороне, правильный способ написать конструктор в PHP 5+ - использовать метод _ _ construct:
public function __construct(/* args */)
{
// constructor code
}
вы не можете перегружать методы, основанные на их аргументах вообще. в вашем случае ответ может быть таким же простым, как мой ответ на аналогичный вопрос здесь
перегрузка, как вы знаете, с других языков, не поддерживается в PHP. Вместо этого, вы можете использовать func_get_args();
и работать на нем.
http://www.php.net/func_get_args
дополнительная информация о возможностях перегрузки в PHP: http://php.net/manual/en/language.oop5.overloading.php
вы можете попробовать что-то вроде этого... Случай использования находится на 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);
}
}
}
}
}