[PHP OOP] 1. 클래스 기초

정현섭·2021년 6월 23일
2

PHP OOP

목록 보기
1/6
post-thumbnail

PHP의 Class

  • Class는 methodproperty로 구성된다.
  • 객체의 property나 method에는 -> 키워드를 이용하여 접근한다.

Class만들고 객체 생성

class A 
{
	public $name = 'Hyeonseop';

	public function foo() {
		return $this->name;
	}
}

function bar(A $a) {
	$a->name = 'Youngha';
}

$a = new A();

$a->name;  //'Hyeonseop'
bar($a);
$a->name;  //'Youngha'
  • $a = new A() 에서 $a 는 참조형으로 객체를 전달 받는다.
    • 함수의 인자로 $a 를 불러서 수정을 하게되면 진짜 객체 내용이 수정된다. (위 예시 코드 참고)

상속 (Inherit)

상속 예시

class B extends A
{
}

$b = new B();
$b->foo(); //A에게 foo라는 method를 상속받았기 때문에 가능.
$b->name;  //A에게 name이라는 property를 상속받았기 때문에 가능.
  • 위는 class B가 class A에게 상속받는 예시이다.
  • class B에 class A에서 정의된 properties와 methods가 자동으로 정의(상속) 된다.

부모 타입 처럼(?) 사용가능.

function bar(A $a) {
	return $a->foo();
}

$a = new A();
$b = new B();

bar($a);
bar($b);  //이것이 가능하다!

$b instanceof A; // true
$a instanceof B; // false
  • function bar는 인자 type으로 class A를 받기로 정의되어 있지만, class B도 인자로 받을 수 있다. (class B가 class A를 상속하고 있기 때문에.)

Context

  • new self();
  • new static();
  • new parent();
class C extends A
{
	public function foo() 
	{
		return new self();   // 1
		return new static(); // 2
		return new parent(); // 3
	}
}

class D extends C
{
}

$d = new D();
$d->foo() // 각각 1, 2, 3을 하였을 때, method foo의 return값이 어떻게 바뀔까?
  • new self() 의 경우 class C 객체를 리턴
  • new static() 의 경우 class D 객체를 리턴
    • 늦은 정적 바인딩
  • new parent() 의 경우 class A 객체를 리턴

상수

class E
{
	const NAME = 'Hyeonseop';

	public function getConstant()
	{
		return self::MESSAGE;
	}

	public function who()
	{
		return __CLASS__;
	}
} 

$e = new E();

$e->getConstant();  //'Hyeonseop'
E::NAME  //'Hyeonseop'

$e->who(); //'E'
E::__CLASS__ // 틀린 문법.
  • constant의 경우 기존 property 변수와는 다르게 $ 를 쓰지 않는다.

  • class 내부에서 정의한 constant는 :: (범위 지정 연산자) 를 통해서 접근가능하다.

  • Magic constants (__CLASS__ 등 )은 전역 스코프이며 불리는 위치에 따라 값이 다르다.

    • :: 을 통해서 접근 X

익명 Class (Anonymous Class)

$a = new class {};

$b = new class{public $foo = 'hi';};
$b->foo; //'hi'
  • class의 이름을 정의하지 않고 new 키워드를 통해 바로 object를 만들 수 있음.
class A 
{
    public $name = 'Hyeonseop';

    public function foo() 
    {
        return $this->name;
    }
}

class B 
{
    public function createObject() 
    {
        return new class extends A{};
    }
}

$b = new B();
echo $b->createObject()->foo(); //'Hyeonseop'
  • 위와같이 anonymous class도 상속이 가능. (기본 class와 똑같다.)

static keyword

다른 언어에서와 마찬가지로 php에서도 static 키워드는 변수의 scope가 끝나도 값을 유지하게 할 때 사용한다.

class A 
{
    public static $name = 'Hyeonseop';

    public static function getName() 
    {
        return self::$name;
    }
}

echo A::getName(); // 'Hyeonseop'
echo A::$name; // 'Hyeonseop'

$a = new A();

echo $a->getName(); // 'Hyeonseop'
echo $a->name; // 오류!!
  • 객체를 생성하지 않고 class를 통한 접근

    • static property와 static method 둘 다 class를 통해 접근 가능하다.
  • 객체를 통한 접근

    • static method의 경우 객체에서 접근이 가능하지만 static property의 경우 객체에서 접근이 불가하다.
  • 정적 메소드에서는 $this 변수를 사용 불가.

    • 대신 self:: 키워드를 통해 property에 접근.

늦은 정적 바인딩 (late binding)

  • 바인딩(binding)이 name(함수 혹은 변수)과 실제 값이 위치한 메모리를 연결하는 것을 말한다.

  • 보통 binding은 아래 두 가지 종류가 있다.

    • 정적 바인딩 (static binding) : 실행시간 전 (컴파일 시간)에 binding이 끝남.
    • 동적 바인딩 (dynamic binding) : 실행시간에 변경되는 바인딩 (late binding이라고도 함.)
  • 그런데 php (version 5.3.0 부터)는 정적바인딩과 동적바인딩의 중간의 늦은 정적 바인딩 (Late Static Binding)을 제공한다.

  • static:: 키워드를 사용하며,

1개의 댓글

comment-user-thumbnail
2022년 2월 12일

인프런에서 PHP 7+ 프로그래밍: 객체지향 강의를 보고있는데 이해가 안되는 부분이 여기에 작성되어있네요 감사합니다 잘 읽었습니다 : )

답글 달기