2013-04-06 6 views
0

PHP에 관한 PHP의 하위 클래스에 대한 함수 호출에 관한 트릭 질문이 있습니다. 우리는 3 가지 시나리오를 가지고 있으며 장단점을 원합니다.자식 모범 사례에서 부모로부터 PHP 호출 함수

<?php 
class test{ 
    private $var ; 
    public function __construct(){ 
    $this->var = 'Hello world'; 
    } 

    public function output(){ 
     echo $var.'<br>'; 
    } 
} 
//scenario 1 
class test1 extends test{ 
    public function __construct(){ 
    parent::__construct(); 
    } 
    public function say(){ 
    parent::output(); 
    } 
} 
//scenario 2 
class test2 extends test{ 
    public function __construct(){ 
    test::__construct(); 
    } 
    public function say(){ 
    test::output(); 
    } 
} 
//scenario 3 
class test3 extends test{ 
    private $handle ; 
    public function __construct(){ 
    $this->handle = new test(); 
    } 
    public function say(){ 
    $this->handle->output(); 
    } 
} 
//finally I can call any 3 cases by one of the below codes 
$test1 = new test1(); 
$test1->say(); 
//or 
$test2 = new test2(); 
$test2->say(); 
//or 
$test3 = new test3(); 
$test3->say(); 
?> 

다른 시나리오보다 좋은 세 가지 시나리오가 있습니까?

미리 감사드립니다.

+0

상위를 사용하는 것이 좋습니다. – Ares

답변

1

1) 올바름

2) 정적 메서드와 같은 메서드를 잘못 호출하고 있습니다.

3) 생성자에서 확장 및 생성되지 않습니다.

+0

고맙습니다. 3 명 모두가 똑같은 일을한다. :) – BogdanD

+0

3)은 데코레이터 패턴이라고 불리며 실제 사용 사례가 좋습니다. 유일한 나쁜 점은이 예제에서 데코 레이팅 할 객체가 데코레이터 내부에 instatiated되어 외부로 전달되지 않는다는 것입니다. 따라서이 데코레이터는 다른 객체에는 사용할 수 없습니다. – Sven

+0

스벤과 그 자체가 확장하고있는 클래스. 나는 그것이 틀렸다는 것을 말하지 않는다. 확장 + 구조에는 감각이 없다고 말합니다. – Maks3w

0

1) 이 방법은 해당 메소드에서 부모를 호출 할 때 정확합니다.

class test1 extends test{ 
    public function __construct(){ 
    parent::__construct(); 
    } 
    public function say(){ 
    parent::output(); 
    } 
} 

2) 여기의 상속은 필요하지 않습니다. 이 구현을 선택하는 경우 output을 모두 변경하고 메서드를 정적으로 구성해야합니다.

//scenario 2 
class test2 extends test{ 
    public function __construct(){ 
    test::__construct(); 
    } 
    public function say(){ 
    test::output(); 
    } 
} 

3) 여기로부터의 상속도 불필요합니다. 여기에서는 "상속을 통한 구성 요소"패턴을 사용하고 있지만 유연성이 뛰어나므로 "확장 테스트"를 삭제해야합니다.

//scenario 3 
class test3 extends test{ 
    private $handle ; 
    public function __construct(){ 
    $this->handle = new test(); 
    } 
    public function say(){ 
    $this->handle->output(); 
    } 
}