phpclass/클래스활용2000. 7. 13. 13:50
PHP에서 클래스를 사용하는 방법에 대하여 알아봅니다.
클래스란?
클래스는 객체의 변수와 함수를 정의하는 템플릿이며, 이에 따라 변수로 표현되는 데이터 영역과 이러한 데이터 영역에 접근할 수 있는 함수로 구성됩니다. 클래스 내에 정의된 변수를 멤버변수(member variable)라고 하고 함수를 메소드(method)라고 합니다. C++과 같은 객체지향언어에서는 멤버변수를 데이터멤버, 메소드를 멤버함수라고 호칭합니다. PHP에서 클래스를 사용하는 것은 C++ 또는 자바와 거의 비슷합니다.
클래스 정의
클래스를 정의(class definition)할 때는 키워드 "class"를 사용합니다. 클래스를 구성하는 멤버변수와 메소드를 정의할 때는 "var"과 "function"이라는 키워드를 사용합니다. "function"은 일반 함수를 정의할 때도 사용되지만 "var"은 클래스의 멤버변수를 정의할 때만 사용되는 키워드로, 멤버변수를 정의할 때는 반드시 명시하여야 합니다. 예를 들어 클래스는 아래와 같이 정의합니다. 이 예는 PHP 매뉴얼에 있는 것으로 수정하지 않고 가져왔습니다. 이 예에서는 $items라는 멤버변수와 add_item, remove_item라는 메소드가 정의되어 있습니다.
[code php;gutter:false] 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;
}
}
} [/code]
멤버변수의 초기화
PHP3에서는 멤버변수값을 아래와 같이 상수 또는 변수를 이용하여 초기화할 수 있습니다.
[code php;gutter:false] class Cart {
var $items = 0; // Items in our shopping cart
} [/code]
< 상수로 초기화할 때 >
[code php;gutter:false] class Cart {
var $items; // Items in our shopping cart

function Cart($items) {
$this->items = $items;
}
} [/code]
< 변수로 초기화할 때(1) >
[code php;gutter:false] $items = 0;

class Cart {
var $items = $GLOBALS["items"]; // Items in our shopping cart
} [/code]
< 변수로 초기화할 때(2) >
반면 PHP4에서는 var 변수에는 상수로만 초기화할 수 있고, 상수가 아닌 값을 가지고 초기화할 때는 생성자를 이용하여야 합니다. 즉, var $items = $GLOBALS["items"];와 같은 표현은 허용하지 않습니다.
따라서 아래와 같은 표현은 PHP4에서는 허용하지 않습니다.
[code php;gutter:false] class Cart {
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("VCR", "TV");
} [/code]
PHP4에서 초기화할 때 동일한 결과를 얻으려면 아래와 같이 생성자를 이용합니다.
[code php;gutter:false] 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. . . */
}
} [/code]
PHP4 예약어
stdClass
stdClass 는 Zend에서 내부적으로 사용하고 있는 예약어입니다. 따라서 사용자는 클래스명으로 stdClass를 사용할 수 없습니다. get_declared_classes() 함수를 사용하면 현재 스크립트에 정의된 클래스명을 배열에 담아 되돌려 줍니다. 따라서 이 함수를 이용하면 stdClass의 존재를 확인할 수 있습니다.
[code php;gutter:false] <?php

class Vegetable {

}

class Spinach extends Vegetable {

}

$arr_class = get_declared_classes();

while (list($k,$v)=each($arr_class)) {
echo("\$arr_class[$k]=$v\n");
}

?> [/code]
이 문서를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
[code php;gutter:false] $arr_class[0]=stdClass
$arr_class[1]=OverloadedTestClass
$arr_class[2]=Directory
$arr_class[3]=OCI-Lob
$arr_class[4]=vegetable
$arr_class[5]=spinach [/code]
위 예제의 실행결과를 보면, 사용자가 정의한 vegetable, spinach 외에도 stdClass, OverloadedTestClass, Directory, OCI-Lob가 있는 것을 볼 수 있습니다. 좀 더 자세한 것은 메뉴 "클래스&객체 함수 >> get_declared_classes()"를 살펴보시기 바랍니다.
매직함수(magic function)
__sleep, __wakeup과 같이 "__"로 시작하는 매직함수는 PHP 클래스 내에서 특수한 목적으로 사용됩니다. 따라서 이 함수들이 가지고 있는 문서화된 매직 기능을 사용할 필요가 없다면 클래스 내에 이 함수들을 정의해서는 안됩니다. 자세한 것은 메뉴에서 "매직함수"장을 살펴보기 바랍니다.
$this가 무엇에 쓰는 물건인고?
클래스 메소드 내에서만 사용되며, 클래스의 현재 인스턴스를 참조할 때 사용하는 변수이며, 예를 들어 현재 객체 내에 something라고 명명된 임의의 변수 또는 함수를 참조하기 위해서는 $this->something을 사용하여야 합니다. 즉, "$this"의 의미는 new 연산자에 의해 생성될 객체 자신을 의미합니다. 그러니 아직 생성되지 않은 객체 자신을 의미하는 의사(擬似)변수(pseudo variable)이며, "my own" 또는 "current object"라고 불리웁니다.
앞에서 클래스를 붕어빵 틀과 같다고 했습니다. 정의된 클래스에 의해 생성된 객체는 붕어빵 틀로 만들어낸 수많은 붕어빵이지요. 아래 예에서 본다면, $붕어빵1->make("특급밀가루")으로 make() 메소드에 접근한다면 이 때 make() 메소드 내의 $this는 $붕어빵1을 의미하고, $붕어빵2->make("중급밀가루")으로 접근한다면 이 때 $this는 $붕어빵2를 의미하고, $붕어빵3->make("저급밀가루")으로 접근한다면 이 때 $this는 $붕어빵3을 의미합니다.
[code php;gutter:false] class 붕어빵 {
var 재료;

function make($재료) {
$this->재료 = $재료;
......
}
}

$붕어빵1 = new 붕어빵; // 인스턴스 "붕어빵1"
$붕어빵2 = new 붕어빵; // 인스턴스 "붕어빵2"
$붕어빵3 = new 붕어빵; // 인스턴스 "붕어빵3"

$붕어빵1->make("특급밀가루");
$붕어빵2->make("중급밀가루");
$붕어빵3->make("저급밀가루"); [/code]

Posted by 방글24