Forum und email

클래스와 객체

Table of Contents

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)를 위한 품목의 연관 배열, 그리고 카트에 아이템을 추가하거나 제거하는 두 개의 함수로 구성되어있다.

Warning

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

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

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

Caution

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

Caution

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

Caution

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만큼 더하라'고 해석할 수 있다.

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


ttp://www.google-analytics.com/urchin.js" type="text/javascript">