몽상실현개발주의

[생활코딩] 17.13~15 상속 본문

Language/php

[생활코딩] 17.13~15 상속

migrationArc 2021. 6. 8. 14:52

[생활코딩] 17.13~15 상속

생활코딩 php 강좌

17. PHP의 객체 지향 프로그래밍

17.13 상속 - Override 와 Parent

  • 부모 클래스와 같은 이름의 메소드를 사용 하고 싶을때, 자식 메소드에 새롭게 정의 하면 덮어쓰는 효과가 발생
  • 부모 메소드를 호출하고 싶다면 parent 키워드로 호출 가능

 

<?php
class ParentClass{
    function callMethod($param){
        echo "<h2>Parent {$param}</h2>";
    }
}

class ChildClass extends ParentClass{
    function callMethod($param){
        parent::callMethod($param);
        echo "<h2>Child {$param}</h2>";
    }
}

$obj = new ChildClass();
$obj->callMethod('method');
?>
  • 자식 클래스에서 부모클래스의 method override (재정의) 가능
  • 자식 클래스에서 부모클래스의 method 호출 가능
    • parent::

 

 

 

 

17.14 상속 - 접근제어자 protected

  • 변수에 대해 상속 관계에 있는 메소드에서는 접근할 수 있지만, 인스턴스를 통해서는 직접적으로 접근하는 것을 막고 싶을 때 protected 를 사용

 

<?php

use ParentClass as GlobalParentClass;
class ParentClass{
    public $_public = '<h1>public</h1>';
    protected $_protected = '<h1>protected</h1>';
    private $_private = '<h1>private</h1>';
}

class ClidClass extends ParentClass{}

$obj = new ChildClass();
echo $obj->_public;
echo $obj->_private;
?>
  
// public

// Notice: Undefined property: ChildClass::$_private in
  • 자식 클래에 없는 멤버 변수는, 부모 클래스에서 호출
  • private 변수는 자식 클래스에서 호출 불가

 

<?php
class ParentClass{
    public $_public = '<h1>public</h1>';
    protected $_protected = '<h1>protected</h1>';
    private $_private = '<h1>private</h1>';
}

class ChildClass extends ParentClass{
    function callPublic(){
        echo $this->_public;
    }
    function callPrivate(){
        echo $this->_private;
    }
}

$obj = new ChildClass();
echo $obj->callPublic();
echo $obj->callPrivate();
?>
  • 자식 클래에 없는 멤버 변수는, 부모 클래스에서 호출
  • private 변수는 자식 클래스에서 호출 불가

 

 

  • public 은 부모/자식 모두 접근 가능
  • private 은 instance 내부에서만 접근 가능하여 상속받은 자식 클래스에서 접근 불가

 

 

<?php
class ParentClass{
    protected $_protected = '<h1>protected</h1>';
}

class ChildClass extends ParentClass{
    function callProtected(){
        echo $this->_protected;
    }
}

$obj = new ChildClass();
$obj->callProtected();
echo $obj->_protected;
?>
  
// protected

// Fatal error: Uncaught Error: Cannot access protected property ChildClass::$_protected ... on line 14
  • protected 로 선언
    • 부모 멤버에 대해 자식 클래스 instance method 로 접근 가능
    • 무모 멤버에 대해 자식 클래스 instance 의 직접 접근 불가

 

 

  • class 의 멤버 선언 기초
    • 초심자이면 public/private 를 두고 결정
      • 기본적으로 instance 변수는 private 로 선언
      • 변수가 노출될 가능성이 있을때, public 으로 선언
    • 자식 class 에서 method 를 통해 내부적으로 접근이 가능 해야 하지만, 외부에서 접근을 통제 하고 싶을때 protected

 

 

 

 

17.15 상속 - 상속금지 (final)

  • 메소드나 클래스에 대해 상속을 금지 할 때, final 키워드를 사용

 

<?php
class ParentClass{
    function a(){
        echo 'Parent';
    }
    final function b(){
        echo 'Parent B';
    }
}

class ChildClass extends ParentClass{
    function a(){
        echo 'Child';
    }

    function b(){
        echo 'Child B';
    }
}

$obj = new ChildClass();
$obj->a();
$obj->b();
?>
  
// Fatal error: Cannot override final method ParentClass::b() in ...
  • final 로 선언한 ParentClass 의 b() method 는 상속되지 않음

 

<?php
final class ParentClass{}

class ChildClass extends ParentClass{}

$obj = new ChildClass();
?>

// Fatal error: Class ChildClass may not inherit from final class (ParentClass) in ...
  • final 로 선언한 ParentClass 는 상속이 불가

 

 

 


이 글의 모든 사진과 내용의 출처는 생활코딩에 있음을 알려드립니다.

http://www.inflearn.com/course/%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-php-%EA%B0%95%EC%A2%8C/lecture/230?tab=note

 

생활코딩 - PHP 기본 A 부터 Z 까지 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

 

Comments