[php] 클라스 정의
1. 클라스 정의
본자료는 예전에 제가 운영하던 사이트에서 발췌한 자료로 현재 사용하는 PHP 버젼과는 상이한 내용이 있을 수 있습니다. 다만 그 개념이 거의 동일하므로 개념정리용으로 이용해 주시고 시간이 나는대로 현재 버젼에서의 사용법도 같이 올려드리겠습니다.
클래스란 ?
클래스는 객체의 변수와 함수를 정의하는 템플릿이며, 이에 따라 변수로 표현되는 데이터 영역과 이러한 데이터 영역에 접근할 수 있는 함수로 구성됩니다. 클래스 내에 정의된 변수를 멤버변수(member variable)라고 하고 함수를 메쏘드(method)라고 합니다. C++과 같은 객체지향언어에서는 멤버변수를 데이터멤버, 메쏘드를 멤버함수라고 호칭합니다. PHP에서 클래스를 사용하는 것은 C++ 또는 자바와 거의 비슷합니다.
클래스 정의
클래스를 정의(class definition)할 때는 키워드 "class"를 사용합니다. 클래스를 구성하는 멤버변수와 메쏘드를 정의할 때는 "var"과 "function"이라는 키워드를 사용합니다. "function"은 일반 함수를 정의할 때도 사용되지만 "var"은 클래스의 멤버변수를 정의할 때만 사용되는 키워드로, 멤버변수를 정의할 때는 반드시 명시하여야 합니다. 예를 들어 클래스는 아래와 같이 정의합니다. 이 예는 PHP 매뉴얼에 있는 것으로 수정하지 않고 가져왔습니다. 이 예에서는 $items라는 멤버변수와 add_item, remove_item라는 메쏘드가 정의되어 있습니다.
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;
}
}
}
멤버변수의 초기화
PHP에서는 멤버변수값을 아래와 같이 상수 또는 변수를 이용하여 초기화할 수 있습니다.
상수로 초기화할 때 :
class Cart {
var $items = 0; // Items in our shopping cart
}
변수로 초기화할 때(1) :
class Cart {
var $items; // Items in our shopping cart
function Cart($items) {
$this->items = $items;
}
}
변수로 초기화할 때(2) :
$items = 0;
class Cart {
var $items = $GLOBALS["items"]; // Items in our shopping cart
}
반면 PHP4에서는 var 변수에는 상수로만 초기화할 수 있고, 상수가 아닌 값을 가지고 초기화할 때는 생성자를 이용하여야 합니다. 즉, var $items = $GLOBALS["items"];와 같은 표현은 허용하지 않습니다.
따라서 아래와 같은 표현은 PHP4에서는 허용하지 않습니다.
class Cart {
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("VCR", "TV");
}
PHP4에서 초기화할 때 동일한 결과를 얻으려면 아래와 같이 생성자를 이용합니다.
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. . . */
}
}
PHP4 예약어
stdClass
stdClass는 Zend에서 내부적으로 사용하고 있는 예약어입니다. 따라서 사용자는 클래스명으로 stdClass를 사용할 수 없습니다. get_declared_classes() 함수를 사용하면 현재 스크립트에 정의된 클래스명을 배열에 담아 되돌려 줍니다. 따라서 이 함수를 이용하면 stdClass의 존재를 확인할 수 있습니다.
<?php
class Vegetable {
}
class Spinach extends Vegetable {
}
$arr_class = get_declared_classes();
while (list($k,$v)=each($arr_class)) {
echo("\$arr_class[$k]=$v<BR> \n");
}
?>
이 문서를 실행하면 아래와 같은 결과를 얻을 수 있습니다.
$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
위 예제의 실행결과를 보면, 사용자가 정의한 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"라고 불리웁니다.
class 붕어빵 {
var 재료;
function make($재료) {
$this->재료 = $재료;
......
}
}
$붕어빵1 = new 붕어빵; // 인스턴스 "붕어빵1"
$붕어빵2 = new 붕어빵; // 인스턴스 "붕어빵2"
$붕어빵3 = new 붕어빵; // 인스턴스 "붕어빵3"
$붕어빵1->make("특급밀가루");
$붕어빵2->make("중급밀가루");
$붕어빵3->make("저급밀가루");