Перегрузка конструктора в PHP - PullRequest
9 голосов
/ 11 октября 2011

Проблема Приближения

У меня есть такой класс с перегруженными конструкторами

Код

<?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 ?

Дополнительная информация

Я использую * PHP 5.3.2 в LAMP *, какие концепции ООП должны полностью поддерживаться в этой версии

Ответы [ 4 ]

12 голосов
/ 11 октября 2011

PHP не имеет перегрузки.У него есть ряд магических методов, которые описаны в руководстве как перегрузка (см .: http://php.net/manual/en/language.oop5.overloading.php),, но это не то, о чем вы думаете.

Кроме того, в качестве правильного способанаписать конструктор в PHP 5+ это использовать метод __construct:

public function __construct(/* args */)
{
    // constructor code
}
3 голосов
/ 12 октября 2011

Вы не можете перегружать методы, основанные на их аргументах вообще. в вашем случае ответ может быть таким простым, как мой ответ на аналогичный вопрос здесь

1 голос
/ 11 октября 2011

Перегрузка, как вы знаете это из других языков, не поддерживается в PHP.Вместо этого вы можете использовать func_get_args(); и работать над ним.

http://www.php.net/func_get_args

Подробнее о возможностях перегрузки в PHP: http://php.net/manual/en/language.oop5.overloading.php

0 голосов
/ 22 августа 2018

Вы можете попробовать что-то вроде этого ... Вариант использования в 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);
                }
            }
        }
    }
}
...