2012-02-25 2 views
4

Это составленный пример, он становится намного более полезным, когда есть много параметров.Возможно ли создание цепочек перегрузки в PHP?

Это позволит использовать вызывающий абонент либо new Person("Jim", 1950, 10, 2), либо new Person("Jim", datetimeobj). Я знаю о дополнительных параметрах, это не то, что я ищу здесь.

В C# я могу сделать:

public Person(string name, int birthyear, int birthmonth, int birthday) 
    :this(name, new DateTime(birthyear, birthmonth, birthday)){ } 

public Person(string name, DateTime birthdate) 
{ 
    this.name = name; 
    this.birthdate = birthdate; 
} 

Могу ли я сделать подобную вещь в PHP? Что-то вроде:

function __construct($name, $birthyear, $birthmonth, $birthday) 
{ 
    $date = new DateTime("{$birthyear}\\{$birthmonth}\\{$birthyear}"); 
    __construct($name, $date); 
} 

function __construct($name, $birthdate) 
{ 
    $this->name = $name; 
    $this->birthdate = $birthdate; 
} 

Если это невозможно, что является хорошей альтернативой?

+0

@phpdev аналогичная идея, но нет. Вызов другого конструктора того же класса. О, ты ушел, ну теперь я просто чувствую себя неловко ... –

ответ

6

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

class Foo { 

    ... 

    public function __construct($foo, DateTime $bar) { 
     ... 
    } 

    public static function fromYmd($foo, $year, $month, $day) { 
     return new self($foo, new DateTime("$year-$month-$day")); 
    } 

} 

$foo1 = new Foo('foo', $dateTimeObject); 
$foo2 = Foo::fromYmd('foo', 2012, 2, 25); 

Там должен быть один канонический конструктор, но вы можете иметь так как многие альтернативные конструкторы, как удобные обертки, все относятся к каноническому. Или вы можете установить альтернативные значения в этих альтернативных конструкторах, которые вы обычно не устанавливаете в обычном:

class Foo { 

    protected $bar = 'default'; 

    public static function withBar($bar) { 
     $foo = new self; 
     $foo->bar = $bar; 
     return $foo; 
    } 

} 
1

Это не совсем то же самое, но вы можете манипулировать с количеством аргументов в конструкторе, считать их или проверять их типы и вызывать соответствующие функции. В качестве примера:

class MultipleConstructor { 
    function __construct() { 
    $args = func_get_args(); 
    $construct = '__construct' . func_num_args(); 
    if (method_exists($this, $construct)) 
     call_user_func_array(array($this, $construct), $args); 
    } 

    private function __construct1($var1) 
    { 
     echo 'Constructor with 1 argument: ' . $var1; 
    } 

    private function __construct2($var1, $var2) 
    { 
     echo 'Constructor with 2 arguments: ' . $var1 . ' and ' . $var2; 
    } 

} 

$pt = new MultipleConstructor(1); 
$pt = new MultipleConstructor(2,3); 
+0

Интересно, поэтому в '__construct' я мог бы установить все« одинаковые/повторяющиеся »параметры,' name' в моем примере. и в '__constructN' я бы установил« дополнительные/разные »параметры. Это может сработать. –

Смежные вопросы