2011-10-03 2 views
1

저는 새로 입문 했으므로 다음 질문에서 자신을 분명히하기를 바랍니다.PHP의 동적 확장

저는 최근에 프로젝트를위한 프레임 워크를 작성하려고 애 쓰고 있습니다. 문제는 내가 PHP OOP에 익숙하지 않고 장래에 변경 될 수있는 객체를 확장하는 방법을 알지 못하고 확장 클래스에서 사용할 수있는 속성을 계속 유지한다는 것입니다.

더 정확하게 :

class main { 
function __construct() { 
$this->a='some a text'; 
$this->b='some b text'; 
} 
} 

class submain extends main() { 
function __construct() { 
parent::__construct(); 
$this->c='some c text'; 
} 
} 

$main=new main(); 
$submain=new submain(); 

은 그래서 지금은 $ submain 변수는 3 곳이 A, B 및 C가 포함되어 있습니다.

만약 내가 지금 $ main-> d = 'some d text'를하면;

d 속성이 주 클래스를 확장 한 $ submain 변수에 나타나도록하려면 어떻게해야합니까?

나는 복제를 사용해야한다고 생각하니?! 당신은 하나의 객체에 속성을 설정하고 (런타임에) 그것에서 파생 된 모든 클래스에서 설정할 수 있습니다 방법 :

+0

'public $ d ='some d text ';와 같이 메인 클래스에 추가 할 수 있습니다. 너 해봤 어? [예] (http://stackoverflow.com/questions/7635507/dynamic-extension-in-php/7636713#7636713) – hakre

답변

1

편집을 시작으로 지금 제가 할 질문을 이해

답변.

죄송합니다. 최선의 답변은 철학적 인 것일 수 있습니다.

특정 언어는 특정 문제 해결 방법을 선호합니다. (사실 자바 스크립트에서는 정말 쉬울 것입니다). PHP에서 클래스를 작성하는 것은 클래스가 인스턴스화 될 때 생성되는 객체를 정의합니다. 오브젝트가 작성되면 클래스의 메소드 및 상속 된 메소드를 호출하여 오브젝트가 수행하도록 설계된 조치를 수행 할 수 있습니다.

시스템의 일부를 캡슐화하는 많은 개체를 만들 수 있습니다. 각 개체를 특정 작업을 수행하고 시스템의 다른 부분과의 연결을 유지하면 테스트 가능한 특정 부분에 대형 시스템을 구축 할 수 있습니다.

클래스를 통해 생성 된 각 객체는 특정 객체 (정적 객체를 공유 할 수 있습니다 - 정적 객체는 잘못된 디자인으로 간주 될 수 있지만)입니다. 동일한 클래스의 객체간에 설정을 동적으로 공유하려면 PHP를 강제해야합니다. 이제 나는 당신이 그렇게하지 못하게하기를 희망합니다 - 여기 당신이 그것을 할 수있는 방법이 있습니다. 추한 것처럼 보이고 프로그램이 어떤 크기이든 무한한 문제가 발생할 것입니다. 제가 여기 게시 한 것을 사용하지 마십시오. 나는이 코드 나 문법을 테스트하지 않았고 정적 인 내용을 쓰지 않았기 때문에 실수가있을 수는 있지만 이런 생각은 효과가있을 것이라고 생각한다.

class main 
{ 
    // Yes its defined statically but with an array you can do anything. 
    public static $settings; 

    public function __construct() {} 

    public defineVar($varName, $varValue) 
    { 
     self::$settings[$varName] = $varValue; 
    } 

    public static function get($varName) 
    { 
     return self::$settings[$varName] = $varValue; 
    } 
} 

// Submain as before. 

$t = new submain(); 

main::defineVar('d', 'some d text'); 

$t->get('d'); 

이렇게하면 주 파생 클래스와 모든 파생 클래스에 저장할 수있는 동적 정의 값이 생성됩니다. 그 값은 모든 객체에서 동일합니다. 클래스를 통해 동일한 변수에 대해 다를 수있는 값을 원할 경우 기본적으로 레지스트리 시스템을 설정해야합니다 (이 경우 디자인 패턴이있을 수 있습니다).

아래

원래 답변 나는 OOP의 중요한 대중의 액세스 유형, 보호 및 개인에 이것을 작성합니다.

main 클래스로 만든 모든 객체에는 해당 생성자에서 설정 한 속성이 포함됩니다.submain에 대해서도 동일하므로 $ d를 a, b 또는 c 항목으로 추가합니다. 내가 main에 추가 할 것이고, submain 생성자는 이미 부모 생성자를 호출하므로 정의 된 속성 a, b, c 및 d가있는 객체가 생성됩니다.

class main 
{ 
    public $a; 
    protected $b; 
    public $d; 

    public function __construct() 
    { 
     $this->a='some a text'; 
     $this->b='some b text'; 
     $this->d='some d text'; 
    } 
} 

class submain extends main() 
{ 
    public $c; 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->c='some c text'; 
    } 

    public function getB() 
    { 
     return $this->b; 
    } 
} 

$main=new main(); 
echo $main->a; // Publicly accessible. 
// Can't do $main->b() it is protected. 
echo $main->d; 

$submain=new submain(); 
echo $submain->a; // Still publicly accessible. 
echo $submain->getB(); // protected variable exposed by public function. 
echo $submain->d; 
+0

폴 감사합니다. 하지만 $ d 변수를 정적으로 추가하고 싶지는 않습니다. 런타임 중에 새로운 속성을 추가 할 수있는 프레임 워크를 만들고 특정 클래스를 확장 한 모든 클래스를 만들고 해당 클래스에 대한 모든 변경 사항을 상속해야합니다. 내 경우로 돌아가서 런타임 중에 $ main 변수에 새 속성을 추가하면 $ submain에도 표시됩니다. – Dragos

+0

@Dragos ok, 알겠습니다. 나는 내 대답을 그런 식으로 업데이트 할 것이다. – Paul

+0

폴 감사합니다! 그게 내가 듣고 싶었던거야! – Dragos

0

당신은 단지 main 클래스의 $d 속성을 설정할 수 있습니다 :

class main { 
    public $d = 'some d text'; # <- set the property as public here. 
    function __construct() { 
     $this->a='some a text'; 
     $this->b='some b text'; 
    } 
} 

class submain extends main() { 
    function __construct() { 
     parent::__construct(); 
     $this->c='some c text'; 
    } 
} 

$main=new main(); 
$submain=new submain(); 
echo $submain->d; # some d text 

하지만 난 당신이 정확히 무엇을 찾고 있는지 좀 확실 해요. 그냥 물어봐.