2010-06-30 5 views
1

안녕하세요. 아무것도 찾을 수 없었습니다.이 문제를 인터넷 검색으로 알았습니다. 이전에 정말 좋은 답변을 찾았으므로이 변명을 커뮤니티에 참여시키고 있습니다.PHP에서 클래스 변수의 자동 초기화가 가능합니까?

저는 작업중인 PHP 프로젝트의 클래스 계층 구조를 만들고 있는데 초기화 코드를 명시 적으로 작성하지 않고 생성자 함수 내에서 초기화 된 클래스의 일부 변수를 갖고 싶습니다. 특히 나는 인터프리터의 일부 변수가 실제로 특정 클래스에 대한 포인터라고 가정하고 싶습니다. 만약 내가 C 구조체와 같은 것을 할 수 있다면, 그것은 내가 원하는 것에 거의 가깝다.

지금까지 내가 생각해 낸 유일한 점은 변수 이름을 자체 이름 내에 명시하고 클래스가 각각에 대해 초기화 함수를 호출하도록하는 것입니다.

class A{ 
    ... 
} 

class B{ 
    var $x_A; 

    function initVar($var){ 
    list($varname, $vartype) = split('_',$var); 
    $this->$var = new $vartype(); 
    } 

} 

그리고 B의 생성자가 그 get_class_vars(get_class($this)) 모두에 initVar를 호출은 같은 방법으로 초기화를 할 것입니다 상속 아무것도 너무; 변수 이름에 대한 검사, 클래스가 존재하는지 확인하는 것, 그리고 하나의 밑줄 (underscore)보다 나은 분리 방법을 포함하는 것이 분명합니다. 난 그냥 도울 수 없지만이 작업을 수행하는 더 좋은 방법은 건설 기능에 초기화를 하드 코딩하지 않는 것이라고 생각합니다.

더 나은 방법을 알고있는 사람이라면 도움을 주시면 감사하겠습니다.

답변

1

아마도이 방법을 사용하면 실제로 작동하지만 실제로 사용하는 것은 매우 번거로울 수 있습니다. 예를 들어, 해당 변수를 항상 참조 할 필요가 상상 : 당신이 정말 이런 식으로 뭔가에 가고 싶어하면

$myObject->account_ServiceAccountType 

을, 아마도 매핑 변수는 유용 할 수 있습니다 :

class B { 
    public $x, $account; 

    private $map = array(
     'x' => 'A', 
     'account' => 'ServiceAccountType' 
    ); 

    public function __construct() { 
     foreach ($this->map as $var => $class) { 
      $this->$var = new $class; 
     } 
    } 
} 

당신 이 방법을 시도해 볼 수도 있습니다. 그것은 PHP의 마술 __get 기능을 사용합니다. 두 번이 방법을 사용하여 클래스 멤버를 정의 할 필요가 없습니다

class B { 
    private $map = array(
     'x' => 'A', 
     'account' => 'ServiceAccountType' 
    ); 
    private $vars; 
    public function __construct() { 
     $this->vars = array(); 
     foreach ($this->map as $var => $class) { 
      $this->vars[$var] = new $class; 
     } 
    } 

    public function __get($v) { 
     return $this->vars[$v]; 
    } 
} 

알 수 있습니다.

+1

답변 해 주셔서 감사합니다. 나는지도 작성이 좋은 해결책이 될 수 있다고 생각하지만, 모든 파생 된 클래스에 대해지도를 재정의하지 않고 그것을 수행하는 방법을 생각할 수 없다. 그러나이 경우 생성자 자체에'$ x = new A()'와'$ account = new ServiceAccountType()'을 추가하지 않는 것이 어떨까요? –

+1

@Loyal - 음, 그래, 그게 내 생각이야. 그래도 도움이 될 수있는 또 다른 아이디어가 있습니다 ... 곧 편집을 참조하십시오. – nickf

+0

나는 이것을 위해 마술 __get을 좋아한다. 나는 그 선을 따라 갈 것이라고 생각한다. 감사합니다 :) –

관련 문제