Как реализовать конструктор php, который может принимать разное количество параметров? - PullRequest
7 голосов
/ 13 мая 2011

Как реализовать конструктор php, который может принимать разное количество параметров?

Как

class Person {
    function __construct() { 
        // some fancy implementation
    } 
} 

$a = new Person('John');
$b = new Person('Jane', 'Doe');
$c = new Person('John', 'Doe', '25');

Каков наилучший способ реализовать это в php?

Спасибо, Мило

Ответы [ 2 ]

10 голосов
/ 13 мая 2011

Одним из решений является использование значений по умолчанию:

public function __construct($name, $lastname = null, $age = 25) {
    $this->name = $name;
    if ($lastname !== null) {
        $this->lastname = $lastname;
    }
    if ($age !== null) {
        $this->age = $age;
    }
}

Второе - принять массив, ассоциативный массив или объект (пример об ассоциативном массиве):

public function __construct($params = array()) {
    foreach ($params as $key => $value) {
        $this->{$key} = $value;
    }
}

Но вво втором случае его нужно передать следующим образом:

$x = new Person(array('name' => 'John'));

Третий параметр был указан tandu :

Аргументы конструктора работают так же, как и любая другая функцияаргументы.Просто укажите значения по умолчанию php.net/manual/en/… или используйте func_get_args().

РЕДАКТИРОВАТЬ : вставил сюда то, что мне удалось получить из оригинальный ответ от tandu (сейчас: взрывные таблетки).

3 голосов
/ 13 мая 2011

Обновленный ответ:

echo '<pre>';

// option 1 - combination of both tadeck's and my previous answer

class foo {
    function __construct() {
        $arg_names = array('firstname', 'lastname', 'age');
        $arg_list = func_get_args();
        for ($i = 0; $i < func_num_args(); $i++) {
            $this->{$arg_names[$i]} = $arg_list[$i];
        }
    }
}

$foo = new foo('John', 'Doe', 25);

print_r($foo);

// option 2 - by default, PHP lets you set arbitrary properties in objects, even
// if their classes don't have that property defined - negating the need for __set()

// you will need to set properties one by one however, rather than passing them as
// parameters

class bar {
}

$bar = new bar();
$bar->firstname = 'John';
$bar->lastname = 'Doe';
$bar->age = 25;

print_r($bar);

Результат:

foo Object
(
    [firstname] => John
    [lastname] => Doe
    [age] => 25
)
bar Object
(
    [firstname] => John
    [lastname] => Doe
    [age] => 25
)

Предыдущий ответ:

<?php

class Person {
    function __construct() {
        $arg_list = func_get_args();
        echo '<p>';
        for ($i = 0; $i < func_num_args(); $i++) {
            echo 'Argument '.$i.' is: '.$arg_list[$i].'<br />', "\n";
        }
    }
}

$a = new Person('John');
$b = new Person('Jane', 'Doe');
$c = new Person('John', 'Doe', '25');

?>

Результат:

Argument 0 is: John

Argument 0 is: Jane
Argument 1 is: Doe

Argument 0 is: John
Argument 1 is: Doe
Argument 2 is: 25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...