2. 객체생성
본자료는 예전에 제가 운영하던 사이트에서 발췌한 자료로 현재 사용하는 PHP 버젼과는 상이한 내용이 있을 수 있습니다. 다만 그 개념이 거의 동일하므로 개념정리용으로 이용해 주시고 시간이 나는대로 현재 버젼에서의 사용법도 같이 올려드리겠습니다.
객체 생성=객체 초기화(object initialization)=인스턴스화(instantiation)
클래스는 붕어빵을 만드는 틀(= type, =template)과 같은 것으로, 클래스 내에 정의된 메쏘드와 멤버변수를 사용하기 위해서는 틀을 가지고 붕어빵을 만드는 것같이 객체를 생성하여야 합니다.
객체(object)를 초기화하는 방법은 new 연산자를 사용하여 객체를 변수에 인스턴스 시키는 것입니다.
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 = new Cart;
$cart->add_item("10", 1);
위와 같이 하면 클래스 Cart에 대한 객체 $cart가 생성됩니다. 객체 함수 add_item()은 장바구니에 품목번호 "10"의 수량을 1개 추가하기 위해 호출됩니다.
지정연산자 "->"의 의미
"->"는 객체의 멤버변수 또는 메쏘드를 지정하는데 사용되는 지정연산자입니다.
C++ 언어를 접해 본 분은 쉽게 이해하시겠지만, new 연산자로 생성되는 객체를 나타내는 객체명에는 실제로 객체의 멤버(변수 또는 함수)가 존재하는 것이 아니라 객체의 멤버가 존재하는 메모리상에 위치를 나타내는 주소(adress)가 담겨져 있습니다.
이와 같이 객체지향언어에서는 주소를 가지고 멤버를 참조하려면 아래와 같이 지정연산자 "->"를 이용하게 됩니다.
- 멤버변수를 참조할 때 : 객체명->변수;
- 메쏘드를 참조할 때 : 객체명->함수;
C++ 언어에서는 "->"를 화살표 멤버 연산자라고 말하며, "->"의 앞쪽에 있는 식별자(여기서는 객체명)가 포인터(pointer; 주소를 의미함)일 때 그 멤버를 참조하기 위한 연산자입니다.
지역 변수에 초기화된 객체
객체를 지역변수에 인스턴스할 수 있기 때문에, 클래스를 정의하고 객체를 생성하는 것을 하나의 모듈로 개발할 수 있습니다.
예제 코드 :
<?php
function class_in_function() {
class test {
var $a = 10;
function test() {
echo "함수 내에 정의된 클래스의 생성자 실행";
}
function echo_test() {
echo "함수 내에 정의된 클래스의 멤버변수 \$a의 값 = ".$this->a;
}
}
$obj = new test;
$obj->echo_test();
}
class_in_function();
?>
실행 결과 :
함수 내에 정의된 클래스의 생성자 실행
함수 내에 정의된 클래스의 멤버변수 $a의 값 = 10
객체 생성할 때 생성자명을 가변함수로 지정하기
$classname = "MiniDB";
$obj = new $classname();
이 코드는 PHP와 PHP4 모두에서 정상적으로 동작합니다.
메쏘드명을 변경하기(가변함수)
PHP의 매뉴얼을 보면 가변함수(variable function)를 지원하는데 이것은 변수명 뒤에 괄호가 왔을 때, PHP는 그 이름을 가진 함수를 찾아 실행하는 것입니다.
이것은 클래스의 메쏘드에서도 그대로 사용할 수 있습니다.
class test {
function A() {
echo "나 A 함수 \n";
}
}
$obj = new test;
$method = "A";
$obj->$method();
이것을 응용하여 같은 실행문으로 A0, A1, A2라는 메쏘드에 번갈아 가면서 접근하려면 역시 가변함수를 사용하면 됩니다.
class test {
function A0() {
echo "나 A0 함수 \n";
}
function A1() {
echo "나 A1 함수 \n";
}
function A2() {
echo "나 A2 함수 \n";
}
}
$obj = new test;
for ($i=0;$i<3;$i++) {
$method = "A$i" ;
$obj->$method();
}
위에 것은 모두 PHP3와 PHP4에서 모두 동작되는 코드입니다.
만약, PHP4에서만 동작시켜도 무방하다면 아래와 같이 중괄호를 이용하면 소스를 간결하게 코딩할 수 있습니다.
for ($i=0;$i<3;$i++) {
$obj->{"a$i"}();
}
객체명을 변경하기(가변변수)
가변변수(Variable Variables)의 유용함은 모두 알고 있겠지만 PHP4에서는 별문제가 없지만 PHP에서 객체변수를 가변변수로 사용하기는 그리 쉽지 않습니다.
class test {
var $hello = "hello world";
}
$obj = new test;
$a = "obj";
echo $$a->hello; // or echo ${$a}->hello;
PHP에서 위와 같이 작성하여 실행한다면,
Object
Parse error: parse error, ...... test.php3 on line 9
와 같은 에러를 만나게 됩니다. 그러나 PHP4에서는 객체변수에도 가변변수를 제대로 지원하기 시작했습니다. 따라서 위의 예제가 에러없이 잘 실행되지요. 그러면 PHP에서는 객체변수의 이름을 변경할 수 없을까요? 아래와 같이 $GLOBALS 배열을 사용해 보세요. 아무 문제없이 잘 실행될 겁니다.
class test {
var $hello = "hello world";
}
$obj = new test;
$a = "obj";
echo $GLOBALS[$a]->world();
따라서 PHP3와 PHP4 모두에서 동작되기를 바란다면 $GLOBALS 배열을 이용하여 작성하세요.
배열구조의 멤버변수를 가변변수로 다루는 방법
class test {
var $arr = array();
function test() {
$this->arr[0] = 0;
$this->arr[1] = 1;
}
}
$obj = new test;
위와 같이 클래스 test에 배열 구조의 멤버변수가 있을 때, 이러한 멤버변수의 배열 요소에 접근하려면 $obj->arr[0]; 와 같이 사용하면 됩니다.
여기서 멤버변수명 "arr"을 가변변수로 처리하려면
$prop = "arr";
$obj->{"$prop"}[0];
와 같이 가변변수 $prop를 중괄호로 묶어주세요. 여기서 겹따옴표는 생략해도 됩니다. PHP3와 PHP4에서 모두 잘 동작할 것입니다.