2 minute read

클래스와 객체

클래스 vs 객체 : 클래스에서 만들어 진 것이 객체이다. 클래스 : 관련 된 기능을 위해서 메소드와 멤버 변수등을 뭉쳐 놓은 것. 상속 등으로 재 사용이 쉽다. 객체 : 클래스에서 선언된  메소드와 멤버 변수 등을 가지고 있으며 사용할 수 있다. 뭐, 몰라도 사용 하라는 대로 사용할 수 만 있다면야… (문제는 클래스를 못 만들겠지….)

###

php4 VS php5

  • PHP4부터 클래스를 지원한다. (다만 클래스 프로퍼티(public, protected, private 등) 는 지원 안된다.) PHP5부터는 클래스 프로퍼티 지원.

  • PHP4 객체를 변수에 다시 할당하면 해당 객체가 복사되어 할당 됨 ($obj2 = $obj1 을 하면 $obj1이 복사되서 $obj2가 생성됨)
    PHP5부터는 변수에 다시 할당해도 같은 객체를 바라보게 된다.(참조처럼 동작하지만, 엄밀하게는 참조와 다름)
    보통 다른 언어에서는 PHP5처럼 동작함.

소개

기초

  • 클래스는  class로 시작한다.
  • 클래스 명은 대문자로 시작하는 걸 추천.
  • 구분을 위한 네이밍, 소문자로 시작해도 동작에 문제는 없다.

  • $this 는 객체 안에서 작업할 때 객체 본인을 참조할 경우 사용하는 예약 된 변수이다.
  • **new **키워드를 사용해서 클래스에서 객체를 생성한다.
  • $obj = new ClassName();

  • 클래스는 extends 키워드로 상속 받을 수 있으며, 1개의 클래스에서만 상속 받을 수 있다. 다수 상속 불가.
  • class ClassName extends ElderClassName{
    ~~~~
    }
  • 부모 클래스는 parent:: 로 접근할 수 있다.

프로퍼티

  • 프로퍼티 : 클래스의 멤버 변수.
  • echo $obj->proerty_001; 처럼 사용 가능.

  • public (어디서나 접근 가능) , protected (포함된 클래스 내부에서만, 상속 포함), private (현재 클래스 내부에서만 사용가능) 등을 앞에 붙여 사용.
  • 더 자세한 것은 객체 지향 언어 관련 검색해보세요.
  • 모르겠으면 public으로 우선 만들고 중요 값이다 싶으면 private 로 다른 곳에서 접근 못하도록.
  • 참고로 CI의 컨트롤러에서 private 로 설정하면, URL접근이 안될 수 있다.(다른 곳에서 못 보도록 했기 때문에.)

클래스 상수

  • class ClassName{
      const CONSTANT = ‘CONSTANT VALUE’;
    }
  • 표수표시 $ 가 없다!

  • echo ClassName::CONSTANT; 처럼 사용.

클래스 자동로딩

  • 클래스 파일 include를 자동으로 해주자… 라는 생각으로 만들어졌음.
  • function __autoload($class_name) {
        include $class_name . ‘.php’;
    }

  • 5.0부터 지원

  • include 되지 않은 클래스를 사용할려고 할 때 __autoload가 자동 호출되서 include를 시도한다.

  • CLI 에서는 지원하지 않는다
  • 좀더 상세한 로딩을 하고 싶으면면 spl_autoload_register() 를 생각해보아라. (5.1.2 이상부터)

생성자와 소멸자

  • 생성자
  • 클래스가 객체로 만들어 질 때 자동으로 호출된다.
    $obj = new ClassName(); //이때 
  • 클래스 내부에
    function __construct(){~~~~}
    을 선언해주면 된다.
  • 보통 객체 내부 초기화에 사용된다.
  • 상속시 부모의 생성자를 자동으로 호출하지는 않는다.
    현재 생성자에서 수동 호출하도록 하라.

  •  parent::__construct();

  • 소멸자
  • 객체사 사라질 때 호출된다.
  • 클래스 내부에 
    function __destruct(){~~~~}
    을 선언해주면 된다.
  • 부모 조멸자도 자동 호출되지 않으니, 수동으로….
  •  parent:: __destruct();

  • 실제 사용하다가 버그 때문에 이상동작한다는 이야기가 있다. 사용에 주의하라.

가시성

  • 클래스의 멤버변수와 메소드의 접근 제한을 나타낸다.
  • 멤버 변수나 메소드의 선어 앞에 표시
  • public $val = ‘1’;
  • public function memthodName(){~~~}

  • public : 어디서나 접근 가능
    protected : 포함된 클래스 내부에서만, 상속 포함
    private  : 현재 클래스 내부에서만 사용가능
    var : public 과 같이 동작한다. PHP4 호환용으로,  PHP5를 사용한다면 var을 사용하지 말라.

객체 상속

  • 서브 클래스는 부모 클래스의 모든 public  과  ptorected 로 선언된 것 들을 상속 받게 된다.
  • 서브 클래스에서 같은 이름으로 선언하여 재정의 할 수 있다.\

  • class SubClass extends ParentClass { ~~~ }

  • SubClass 는 ParentClass 의 public  과  ptorected 로 선언된 것 들을 상속 받는다.
  • 추상화에 따른 개념이며, 재사용성을 높여준다.


🔗original-link

Updated: