Перегрузка конструктора в 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);
                }
            }
        }
    }
}