not bad 한 개발

PHP - 상속(extends) 본문

PHP/PHP class

PHP - 상속(extends)

leebean 2022. 5. 8. 14:45

(W3School의 PHP 튜토리얼을 사용했습니다.)

https://www.w3schools.com/php/php_oop_inheritance.asp

 

PHP OOP Inheritance

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

 상속(extends) 

상속은 클래스를 다른 클래스에서도 사용이 가능하게 만든 기능입니다, 키워드는 <extends>이고 사용법은 상속받을 클래스 뒤에 <extends>를 작성하고 <extends> 다음에 상속할 클래스 이름을 작성하면 됩니다. 

  • 상속받을 자식 클래스는 상속해주는 부모 클래스에서 public, protected 프로퍼티와 메서드를 상속받을 수 있습니다.
  • 고유한 속성과 메서드를 자식 클래스에 포함할 수 있습니다.
<!DOCTYPE html>
<html>
    <body>
        <?php
            class parents { // 부모 클래스
                public $num1; // 부모 프로퍼티 num1
                public $num2; // 부모 프로퍼티 num2
                public $sum; // 부모 클래스 sum
                public function __construct($num1, $num2) {
                    // 비록 생성자가 부모에 있지만 상속만 되어있으면
                    // 자식 클래스로 참조변수를 만들었어도 생성자 생성이 가능하다.
                    $this->num1 = $num1; // 생성자 매개변수를 부모 프로퍼티에 저장
                    $this->num2 = $num2; // 생성자 매개변수를 부모 프로퍼티에 저장
                    $this->sum = $this->num1 + $this->num2;
                    // 저장되어있는 num1, num2를 sum에 저장
                }      
                public function parent_plus() { // 부모클래스의 sum을 출력하는 메서드 
                    echo "parents num1 + parents num2 = {$this->sum}";
                    // sum의 값을 출력
                }
            }

            class child extends parents { // 자식 클래스
                // 부모클래스 parents를 자식클래스 child에게 상속
                public function child_plus(){ // 부모클래스의 sum을 출력하는 함수
                    echo "<br>child num1 + child num2 = {$this->sum}";
                    // 부모클래스의 sum을 출력
                }
                public function parent_plus() { // 상속받은 parent_plus를 재정의
                    echo "extend parents num1 + extend parents num2 = {$this->sum}";
                    // sum의 값을 출력
                }
            }
            $extend = new child(10, 20); 
            // 객체 extend를 child형으로 생성및 선언한 후 10, 20으로 초기화
            $extend->parent_plus(); 
            // 부모 클래스의 parent_plus()함수를 실행하여 부모클래스의 sum을 출력
            $extend->child_plus(); 
            // 자식 클래스의 child_plus()함수를 실행하여 부모클래스의 sum을 출력
        ?>
    </body>
</html>

 

 protected 속성 상속하기 

protected 속성은 자신의 클래스 아니면 상속받는 클래스에서만 사용이 가능합니다, 클래스 외부에서 호출은 에러가 나옵니다.

<!DOCTYPE html>
<html>
    <body>
        <?php
            class parents { // 부모 클래스
                public $num1; // 부모 프로퍼티 num1
                public $num2; // 부모 프로퍼티 num2
                protected $sum; // 부모 클래스 sum
                protected function parent_plus() { 
                    // protected 속성은 자신의 클래스 아니면 상속받는 클래스에서만 사용이 가능
                    $this->sum = $this->num1 + $this->num2;
                    echo "(protected) parents num1 + parents num2 = {$this->sum}";
                    // sum의 값을 출력
                }
            }
            class child extends parents { // 자식 클래스
                // 부모클래스 parents를 자식클래스 child에게 상속
                public function child_plus(){ // 부모클래스의 sum을 출력하는 함수
                    echo "<br>(public) child num1 + child num2 = {$this->sum} <br>";
                    // 결과 : (public) child num1 + child num2 =
                    
                    $this->parent_plus(); 
                    // sum = num1 + num2를 실행했기 때문에
                    // 결과 : (protected) parents num1 + parents num2 = 30
                    
                    echo "<br>(public) child num1 + child num2 = {$this->sum} <br>";
                    // 결과 : (public) child num1 + child num2 = 30 
                    // parent_plus()함수에서 연산을 수행 했기 때문에 30이 나온다.
                }
            }

            $extend = new child(); // 객체 extend를 child형으로 생성및 선언
            $extend->num1 = 10; // 객체 extend의 num1 프로퍼티에 10을 저장
            $extend->num2 = 20; // 객체 extend의 num2 프로퍼티에 20을 저장
            $extend->child_plus(); // 객체 extend의 child_plus() 메서드 실행
        ?>
    </body>
</html>

 

 생성자와 상속 

  • 만약 생성자가 부모 클래스에도 있고 자식 클래스에도 있으면 자식 클래스에 있는 생성자로 초기화 합니다.
  • 생성자에 있는 매개변수의 개수와 관계없이 자식 클래스에 있는 생성자를 사용합니다.
  • 만약 생성자가 중복되지 않고 한 개만 있는 경우 객체의 자료형과 상관없이 생성자가 있는 클래스로 초기화를 합니다.
<!DOCTYPE html>
<html>
    <body>
        <?php
            class parents {
                public $num1; // 부모 프로퍼티 num1
                public $num2; // 부모 프로퍼티 num2
                protected $sum; // 부모 클래스 sum
                public function __construct($num1){
                    $this->num1 = $num1; // 실행되지 않는다.
                    $this->sum = $this->num1; // 실행되지 않는다.
                }
                
                protected function parent_plus() { 
                    // protected 속성은 자신의 클래스 아니면 상속받는 클래스에서만 사용이 가능
                    echo "(protected) parents num1 + parents num2 = {$this->sum}";
                    // sum의 값을 출력
                }
            }
            class child extends parents { 
                // 부모클래스 parents를 자식클래스 child에게 상속
                public function __construct($num1, $num2){
                    $this->num1 = $num1; // 생성자 매개변수 $num1을 클래스 $num1에 저장
                    $this->num2 = $num2; // 생성자 매개변수 $num2을 클래스 $num2에 저장
                    $this->sum = $this->num1 + $this->num2;
                    // 클래스 $num1, 클래스 $num2의 합을 클래스 sum에 저장
                }
                
                public function child_plus(){ // 부모클래스의 sum을 출력하는 함수
                    echo "<br>(public) child num1 + child num2 = {$this->sum} <br>";
                    // 결과 : (public) child num1 + child num2 = 
                    
                    $this->parent_plus(); 
                    // 결과 : (protected) parents num1 + parents num2 = 30
                    
                    echo "<br>(public) child num1 + child num2 = {$this->sum} <br>";
                    // 결과 : (public) child num1 + child num2 = 30 
                }
            }
            $extend = new child(10,20); // 객체 extend를 child형으로 생성및 선언 후 10, 20으로 초기화
            $extend->child_plus(); // 객체 extend의 child_plus() 메서드 실행
        ?>
    </body>
</html>

 

 final 키워드 

클래스간에 상속을 방지하거나 메서드의 재정의를 방지하는데 사용됩니다.

<!DOCTYPE html>
<html>
    <body>
        <?php
            final class parents {
                // final 키워드가 있으면 상속 및 재정의가 안됩니다.
            }   
            class child extends parents {
                
            }	
        ?>
    </body>
</html>
<!DOCTYPE html>
<html>
    <body>
        <?php
            class parents {
                final public function parents_func() {
                    // 재정의 불가능
                }	   
            }	   		
                    
            class child extends parents {
                // 클래스는 상속이 되지만 메소드에 final이 있어서
                // 재정의 불가능
                public function parents_func() {
                
                }	   
            }	   
        ?>	   
    </body>
</html>

'PHP > PHP class' 카테고리의 다른 글

PHP - 소멸자(destruct )  (0) 2022.05.05
PHP - 생성자(construct)  (0) 2022.04.30
PHP - 접근 제어자  (0) 2022.04.01
PHP - 클래스와 객체 사용하기  (0) 2022.03.31
PHP- 개발환경 설정하기(Bitnami)  (0) 2022.03.18
Comments