2012-02-25 1 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에서 모든 예제에서 "same/duplicate"매개 변수 인'name'을 설정할 수 있습니다. '__constructN'에서 "여분의/다른"매개 변수를 설정할 것입니다. 그것은 효과가있을 수 있습니다. –