클래스와 객체 (PHP 4)
PHP Manual

class

클래스는 변수들과 이 변수들과 같이 동작하는 함수의 집합체이다. 변수는 var로 정의하고 함수는 function으로 정의합니다. 클래스는 다음 구문을 사용하여 정의합니다:

<?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;
        } elseif (
$this->items[$artnr] == $num) {
            unset(
$this->items[$artnr]);
            return 
true;
        } else {
            return 
false;
        }
    }
}
?>

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

Warning

클래스 정의를 여러 파일로 나눌 수 없습니다. 또한, 메쏘드 선언 안에서 나누지 않는 한, 클래스 정의를 여러 PHP 블록으로 나눌 수 없습니다. 다음 코드는 작동하지 않습니다:

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

하지만, 다음 코드는 허용됩니다:

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

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

Caution

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

Caution

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

Caution

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

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

<?php
class Cart {
    
/* PHP 4에서 이 코드는 작동하지 않을것이다 */
    
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 = array("VCR""TV");

    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: $this 모의 변수는 메쏘드가 정적으로 호출되었을 때는 일반적으로 정의되지 않습니다. 그러나, 정적 규칙: 메쏘드가 다른 객체 안에서 정적으로 호출되었을 때는 $this가 정의됩니다. 이런 경우, $this은 호출한 객체의 것입니다. 다음 예제가 이를 보여줍니다:

<?php
class A
{
    function 
foo()
    {
        if (isset(
$this)) {
            echo 
'$this is defined (';
            echo 
get_class($this);
            echo 
")\n";
        } else {
            echo 
"\$this is not defined.\n";
        }
    }
}

class 
B
{
    function 
bar()
    {
        
A::foo();
    }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>

위 예제의 출력:

$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.


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


클래스와 객체 (PHP 4)
PHP Manual