Отсутствует аргумент в течение нескольких __construct

0

Я использую несколько конструкций с этого сайта.

Я изменил его для своих нужд.

Я получаю фатальные ошибки:

Missing argument 3 for ChildClass::__construct2() 

и скованные ошибки...

Missing argument 4 for ChildClass::__construct2() 
Missing argument 5 for ChildClass::__construct2() 
Undefined variable: c 
Undefined variable: d 

И оба конструктора имеют часть идентичного кода. Как я могу использовать его в общем __construct.

$arr = array (
    "key1" => "val1",
    "key2" => "val2"
);

$demo = new Demo("stack", $arr );

class ParentClass {
    function __construct($var1 = "1", $var2 = "2"){
        // distinctly different code
    }
}

class ChildClass extends ParentClass {
    function __construct(){     
        $a = func_get_args(); 
        $i = func_num_args(); 
        if (method_exists($this,$f='__construct'.$i)) { 
            call_user_func_array(array($this,$f),$a); 
        }
    }

    function __construct1( $a, array $e ) {
        $this->ex = $a;

        $this->ex3 = $e['key1'];
        $this->ex4 = $e['key2'];
    }

    function __construct2( $a, $b, $c, $d, array $e ) {
        $this->ex = $a + 1 - $v + $c; //example
        $this->ex2 = $d;

        $this->ex3 = $e['key1'];
        $this->ex4 = $e['key2'];
    }
}

И оба конструктора имеют часть идентичного кода. Как я могу использовать его в общем __construct.

Благодарю.

  • 0
    Ваш конструктор ChildClass недействителен: он нарушает унаследованный контракт. Также не используйте префикс __ в именах собственных методов, они предназначены для использования только для магических методов (конструктор, деструктор, сеттеры, геттеры, ...)
Теги:
inheritance
constructor
default-constructor

2 ответа

0
Лучший ответ

Число, указанное после __construct, указывает, сколько параметров он будет за исключением. Вы указали 2 после __construct, но вы даете ему 5 параметров, из-за которых он дает ошибку. Измените 2 на 5. Также переименуйте __construct1 в __construct2 Используйте следующий код

$arr = array (
    "key1" => "val1",
    "key2" => "val2"
);

$demo = new Demo("stack", $arr );

class ParentClass {
    function __construct($var1 = "1", $var2 = "2"){
        // distinctly different code
    }
}

class ChildClass extends ParentClass {
    function __construct(){     
        $a = func_get_args(); 
        $i = func_num_args(); 
        if (method_exists($this,$f='__construct'.$i)) { 
            call_user_func_array(array($this,$f),$a); 
        }
    }

function __construct2( $a, array $e ) { 
    $this->ex = $a;

    $this->setE($e);
}
    function __construct5( $a, $b, $c, $d, array $e ) {
        $this->ex = $a + 1 - $v + $c; //example
        $this->ex2 = $d;

        $this->ex3 = $e['key1'];
        $this->ex4 = $e['key2'];
    }
}

Надеюсь, это поможет вам

  • 0
    Благодарю. Теперь я не могу сослаться на this-> ex в моем коде. Примечание: неопределенное свойство: ChildClass :: $ ex
  • 0
    @ user3679891 обновил мой ответ посмотри на него
0

Это потому, что 2 в __construct2 сообщает, что он ожидает 2 параметра, но он ожидает 5. Измените имя на __construct5.

Чтобы поместить идентичный код в одно место, сделайте его отдельным методом, который будет вызываться из обоих конструкторов, полный код:

class ChildClass extends ParentClass {
    function __construct(){     
        $a = func_get_args(); 
        $i = func_num_args(); 
        if (method_exists($this,$f='__construct'.$i)) { 
            call_user_func_array(array($this,$f),$a); 
        }
    }

    function __construct2( $a, array $e ) { // rename method: 1 => 2
        $this->ex = $a;

        $this->setE($e);
    }

    function __construct5( $a, $b, $c, $d, array $e ) { // rename method: 2 => 5
        $this->ex = $a + 1 - $v + $c; //example
        $this->ex2 = $d;

        $this->setE($e);
    }

    private function setE(array $e) {
        $this->ex3 = $e['key1'];
        $this->ex4 = $e['key2'];
    }
}
  • 0
    Большое спасибо. Я был невнимателен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню