2013-01-07 3 views
1

내 응용 프로그램의 나머지 클래스에 액세스하는 곳의 클래스 X가 있습니다. 이 액세스는 동적으로 수행됩니다. 아래의 샘플 코드 (demo here) :PHP에서 객체를 동적으로 생성하는 방법

<? 
class ClassX 
{ 
    var $ClassA; 
    var $ClassB; 

    function __construct() 
    { 
     $this->ClassA = new ClassA(); 
     $this->ClassB = new ClassB(); 
    } 
} 

class ClassA 
{ 
    function methodA($param) 
    { 
     echo $param; 
    } 
} 

class ClassB 
{ 
    function methodB($param) 
    { 
     echo $param + 1; 
    } 
} 

/*I can do this for class A*/ 
$class = "ClassA"; 
$method = "methodA"; 
$param = array("some text"); 

/*or this for class B*/ 
//$class = "ClassB"; 
//$method = "methodB"; 
//$param = array(5); 


$objX = new ClassX(); 
$chain = $objX->{$class}; 
call_user_func_array(array($chain, $method), $param); 
?> 

난에 "붙어"이야 위에 나는 조금 더 갈 수 및 코드에서 X.

내부의 명시 적 객체 인스턴스를 제거하면 나는 생각했다 A와 B

다른 모듈을로드하지만 처음로드되는 모듈을 알지 못하는 응용 프로그램을 빌드하는 방법을 찾고 있습니다. 나는 C 모듈이 내일 경우에 따라서, 나는 더 이상 내가 해봤 X에서이 같은 B.

을 지원하는 경우 같은이 적용되지 않습니다 X를 변경할 필요가 없습니다 :

function __get($object) 
    { 
     $this->$object = new $object(); 
    } 

을하지만, 잘못된 콜백 오류가 발생하여 call_user_func_array가 테이블에서 벗어난 것 같습니다.

달성하려는 작업을 수행 할 수 있습니까?

해결는 :

Spyric 그것을 못을 박았다! 난 단지

function __get($object) 
{ 
    $this->$object = new $object(); 
    return $this->$object; 
} 

최종 코드 here

답변

2

과거에는 스토리지 데이터와 비슷한 것이 필요했습니다.

function __get($object) 
{ 
    if(!isset($this->classes[$object])) 
     $this->classes[$object] = new $object(); 
    return $this->classes[$object]; 
} 

UPD : 그 후 당신이

$class = "ClassC"; 
$method = "methodA"; 
$param = array("some text"); 

$objX = new ClassX(); 
$chain = $objX->{$class}; 

을 사용할 수 있으며 $ 체인 ClassC

에서 개체를해야합니다

class ClassX 
{ 
    var classes = array(); 

    function __construct() 
    { 
    } 
} 

그리고 게터를 : 코드는이 라이트 보인다

오브젝트의 값을 재설정 할 필요가없는 경우 각 통화에 대해 $objX->{$class} 삭제 if(!isset($this->classes[object]))

+0

너무 가까이에 !! 나는 단지 돌아 오는 것이 필요했다!! 대단히 감사합니다. –

0

당신이 동적으로 이러한 개체를 구축 할 필요가 있음을 보인다 __get()의 반환을 필요로했다.

$dateTimeRefl = new ReflectionClass('DateTime'); 
$dynamicallyBuildDateTime = $dateTimeRefl->newInstance('2013-01-01'); 

두 가지 방법이 있습니다 : 리플렉션 확장을 시도, 여기에 샘플입니다 위해서, newInstance()와 newInstanceArgs를(), 그들은 call_user_func()와 call_user_func_array()에 해당하는 것.

PHP 5.2 이상이 필요합니다.

관련 문제