2014-09-12 2 views
2

클래스 인스턴스화에서 배열을 생성자 매개 변수로 전달하려면 어떻게해야합니까?배열을 클래스 생성자의 함수 매개 변수로 전달

abstract class Person { 

    protected function __construct(){ 

    } 

    public static final function __callStatic($name, $arguments){ 
     return new $name($arguments); 
    } 

} 

class Mike extends Person { 

    protected function __construct($age, $hobby){ 
     echo get_called_class().' is '.$age.' years old and likes '.$hobby; 
    } 
} 


// ============================================= 

Person::Mike(15, 'golf'); 

이 정상적으로 출력

마이크는 15 세이며, 좋아하는 골프

그러나 __callStatic에서 두 매개 변수는 다음과 같이 전송되기 때문에 나는 Mike의 생성자에서 누락 두 번째 매개 변수를 얻을 수 배열을 $age에 입력하십시오. 내 질문은 어떻게 배열 대신 매개 변수로 보낼 수 있습니까?

+2

그것은 오랜만이야하지만 당신은 생성자 대신 1 2x_ 사용되어서는 안된다? – Jonast92

+0

@ Jonast92 내 실수. 그것을 지적 Thx –

답변

2

당신은이에 대한 Reflection을 사용할 수 있습니다 : 나는 PHP와 함께 일부터

public static function __callStatic($name, $arguments){ 
    $reflector = new ReflectionClass($name); 
    return $reflector->newInstanceArgs($arguments); 
} 
+0

예, 감사합니다! –

1

사용 call_user_func_array(), http://fi1.php.net/manual/en/function.call-user-func-array.php 및 공장 방법 : 다음

class Mike extends Person { 

    public static function instantiate($age, $hobby) { 
     return new self($age, $hobby); 
    } 
    protected function __construct($age, $hobby){ 
     echo get_called_class().' is '.$age.' years old and likes '.$hobby; 
    } 
} 

그래서 같은 마이크를 만들기 : 당신이 잘못 정적 범위 resolutor을 사용하고

abstract class Person { 

    protected function __construct(){ 

    } 

    public static final function __callStatic($name, $arguments){ 
     return call_user_func_array(array($name, 'instantiate'), $args); 
    } 

} 
+0

나는 그것을 할 수 없습니다. 나는'Person :: Mike()'를 호출 할 수 있어야한다. –

+0

이것이 정확히 같다. – Schlaus

+0

하지만 모든 클래스에'instantiate'를 구현해야합니다. 이것은 영리하지 않습니다. –

0

Person::Mike(15, 'golf'); 

그렇다면 정적 메서드 Mike이 있다는 뜻입니다. 클래스 Person 옆에 있고 정적으로 불러야합니다.

는 대신에, 당신은 당신이 Person에서 정적 일을 호출 할 경우 Mike 그것을 확장하기 때문에, Mike

$mike = new Mike(15, 'golf'); 

를 인스턴스화 할, Mike는 정적으로 호출 할 수 있습니다.

Mike::staticMethod($args); 
+0

아니, 그렇게하고 싶지 않아. 나는 Person 클래스를 가지고 있는데, Person 클래스의 인스턴스를 리턴 할 수있다. 나는 명시 적으로 people 클래스 생성자를 호출 할 수 있기를 원하지 않는다. 그래서 그것이 보호된다. –

+0

정적 필요성을보다 잘 처리하기 위해 뭔가를 추가했습니다 – Machavity

관련 문제