PHP 매뉴얼
이전 |  | 다음

# 13. 장. 클래스와 객체

# `class`

클래스(class)는 특정 변수들 그리고 이 변수들과 같이 동작하는 함수의 집합체이다. 다음 예제코드처럼 클래스를 선언할수 있다:

`<?php class Cart { var $items; // Items in our shopping cart // Add $num articles of $artnr to the cart function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Take $num articles of $artnr out of the cart function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?>`

위 코드에서 Cart라는 이름을 갖는 클래스는 카트(cart)를 위한 품목의 연관 배열, 그리고 카트에 아이템을 추가하거나 제거하는 두 개의 함수로 구성되어있다.

주의

클래스 선언부를 여러 파일이나 여러 PHP블록으로 분리할수 없다 다음 코드는 작동하지 않을것이다:

    <?php
    class test {
    ?>
    <?php
        function test() {
            print 'OK';
        }
    }
    ?>

PHP 4에서는 다음 사항에 주의해야 한다.

경고
Zend에서는 `stdClass`같은 명칭을 내부적으로 사용하며 이 명칭은 예약되어있다. 따라서 PHP에서 `stdClass`라는 클래스명을 만들수 없다.

경고
`__sleep`과 `__wakeup`함수는 PHP 클래스에서 중요한 역할을 수행한다. 이들과 결합된 매직 기능을 원 하지 않는다면 이런 이름을 클래스내에서 사용할수 없다. 다음 글에서 자세하게 설명할것이다.

경고
PHP에서 __으로 시작하는 함수명은 매직 기능을 수행하도록 예약되어있다. 문서화된 매직 기능을 원하지 않는다면 PHP에서 __를 갖는 함수명을 사용하지 않도록 한다.

PHP 4에서 `var`로 변수를 선언할때는 상수로만 초기화될수 있다. 상수가 아닌 값으로 초기화하려면, 클래스로부터 객체를 생성할때 자동적 으로 호출되는 함수에서 초기화할 필요가 있다. 이런 함수를 생성자(constructor) 라고 부른다. (다음글을 보세요)

`<?php /* PHP 4에서 이 코드는 작동하지 않을것이다 */ class Cart { var $todays_date = date("Y-m-d"); var $name = $firstname; var $owner = 'Fred ' . 'Jones'; var $items = array("VCR", "TV"); } /* 이와 같이 해야 한다 */ class Cart { var $todays_date; var $name; var $owner; var $items; function Cart() { $this->todays_date = date("Y-m-d"); $this->name = $GLOBALS['firstname']; /* etc. . . */ } } ?>`

class는 타입이다. 즉, 실제 변수를 위한 청사진이다. `new` 연산자를 사용하여 원하는 이런 타입의 변수를 생성할 수 있다.

`<?php $cart = new Cart; $cart->add_item("10", 1); $another_cart = new Cart; $another_cart->add_item("0815", 3); ?>`

위 예제 코드는 Cart클래스의 `$cart`, `$another_cart` 객체를 생성한다. `$cart`의 add_item() 함수는 `$cart` 에 품목 번호가 10인 아이템 1개를 추가하고, `$another_cart`에 품목 번호가 0815인 아이템 3개를 추가한다.

`$cart`와 `$another_cart` 둘다 add_item(), remove_item() 함수와 items변수를 갖는다. 이들 모두 서로 다른 함수와 변수들이다. 이런 객체는 파일시스템의 디렉토리에 비유될수 있다. 파일시스템에서는 서로 다른 디렉토리에 있으면 두개의 다른 README.TXT파일을 저장할수 있다. 이 파일 각각에 접근하기 위해서는 최상위 디렉토리에서 각 파일로의 경로를 지정해 줘야 하듯이, 이런 각 함수를 호출하고자 한다면 각 함수의 완전한 이름을 지정해야 한다: PHP에서 최상위 디렉토리는 전역 네임스페이스를 갖고, 경로 구분자로 `->`를 사용할수 있다. 따라서, `$cart->items`과 `$another_cart->items` 은 서로 다른 변수를 지칭하는 것이다. 변수는 `$cart->$items`이 아니라, `$cart->items` 로 지정해야 한다는 것에 주의해야 한다. 즉, PHP에서 변수명은 오직 한개의 달러사인($) 기호만 허용된다.

`<?php // correct, single $ $cart->items = array("10" => 1); // invalid, because $cart->$items becomes $cart->"" $cart->$items = array("10" => 1); // correct, but may or may not be what was intended: // $cart->$myvar becomes $cart->items $myvar = 'items'; $cart->$myvar = array("10" => 1); ?>`

클래스의 선언부에서는 프로그램이 객체에 접근할때 어느 객체명 밑에 속해있을지 알수 없다: Cart 클래스가 선언된 후에 그 객체가 `$cart`나 `$another_cart` 객체명을 갖을지 알수 없는것이다. 따라서, Cart 클래스 선언부 안에서 `$cart->items`라고 쓸수 없다. 대신에, 클래스내의 함수나 변수에 접근할 수 있게 하려면 '내 소유'나 '현재 객체'라고 해석할수 있는 `$this`라는 의사-변수를 사용할수 있다. 따라서, '`$this->items[$artnr]` += `$num`' 이라는 코드는 '내 소유의 items 배열의 `$artnr`카운터를 `$num`만큼 더하라' 또는 '현재 객체의 items 배열의 `$artnr` 카운터를 `$num`만큼 더하라'고 해석할 수 있다.

> 참고: 클래스와 객체를 제어할 수 있는 몇가지의 유용한 함수가 제공된다. 클래스/객체 함수에서 확인할수 있다.

이전 | 처음으로 | 다음
내부 (내장) 함수 | 위로 | `extends`