phpclass/클래스활용2000. 10. 10. 14:23
호환성
PHP4 >= 4.0RC1
기능
클래스 정의할 때 기본 지정된 멤버변수를 배열에 담아 반환
형식
array get_class_vars (string class_name)
설명
get_class_vars() 는 클래스를 정의할 때 설정한 멤버변수명과 값을 되돌려 줍니다. 반환되는 배열은 연관배열(associative array)이며, 클래스 정의할 때 멤버변수 값을 지정하지 않은 멤버변수는 이 함수의 반환 값에 포함되지 않습니다. 실행결과를 보면 알겠지만 클래스 Cart 내에서 정의된 멤버변수 $items는 객체생성 후에 그 값이 할당되었다 하더라도 클래스 정의할 때 값이 할당되어 있지 않기 때문에 반환되는 배열에 포함되지 않습니다.
[code php;gutter:false] <?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;
}
}
}

class Named_Cart extends Cart {
var $owner = "나 주인";

function set_owner ($name) {
$this->owner = $name;
}
}

$cart = new Named_Cart;
$cart->items = 200;

$aso = get_class_vars("Named_Cart");

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

?> [/code]
< 예제 코드 >
$aso[owner]=나 주인
< 실행 결과 >
참고
get_class_methods(), get_object_vars()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:22
호환성
PHP4 >= 4.0RC1
기능
메소드명 반환 함수, 클래스 메소드명을 배열에 담아 반환
형식
array get_class_methods (string class_name)
설명
get_class_methods()는 클래스에 정의된 메소드명을 배열에 담아서 되돌려 줍니다. 상속되어 정의된 클래스의 경우는 상위클래스에 정의된 메소드명을 모두 포함합니다. 아래에 예제 코드와 실행 결과가 있습니다.
[code php;gutter:false] <?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;
}
}
}

class Named_Cart extends Cart {
var $owner = "나 주인";

function set_owner ($name) {
$this->owner = $name;
}
}

$cart = new Named_Cart;
$cart->items = 200;

$aso = get_class_methods("Named_Cart");

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

?> [/code]
< 예제 코드 >
$aso[0]=add_item
$aso[1]=remove_item
$aso[2]=set_owner
< 실행 결과 >
참고
get_class_vars(), get_object_vars()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:21
호환성
PHP4 >= 4.0b2
기능
객체의 클래스명 반환
형식
string get_class (object obj)
설명
get_class() 함수는 객체 obj가 인스턴스되는데 사용된 클래스명을 반환합니다.
참고
get_parent_class(), is_subclass_of()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:20
호환성
PHP4 >= 4.0b4
기능
클래스가 정의되어 있는지 확인
형식
bool class_exists (string class_name)
설명
class_exists() 함수는 class_name으로 지정된 클래스가 정의되어 있으면 ture를 반환하고 그렇지 않으면 false를 반환합니다.

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:18
호환성
PHP3 >= 3.0.3, PHP4
기능
특정 객체에 포함된 사용자 정의 메소드 호출
형식
mixed call_user_method (string method_name, object obj [, mixed parameter [, mixed ...]])
설명
사용자 정의 객체인 obj로부터 method_name으로 참조되는 해당 메소드를 호출합니다. 아래에 있는 활용 예제에서 클래스를 정의하고, 객체를 인스턴스화하고, print_info 메소드를 간접적으로 호출하기 위해 call_user_method()를 이용합니다.
[code php;gutter:false] <?php

class Country {
var $NAME;
var $TLD;

function Country($name, $tld) {
$this->NAME = $name;
$this->TLD = $tld;
}

function print_info($prestr="") {
echo $prestr."Country: ".$this->NAME."\n";
echo $prestr."Top Level Domain: ".$this->TLD."\n";
}
}

$cntry = new Country("Peru","pe");

echo "* Calling the object method directly\n";
$cntry->print_info();

echo "\n* Calling the same method indirectly\n";
call_user_method ("print_info", $cntry, "\t");

?> [/code]
참고
call_user_func()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:17
호환성
PHP4 >= 4.0.5
기능
특정 객체에 포함된 사용자 정의 메소드 호출
형식
mixed call_user_method_array (string method_name, object obj [, array paramarr])
설명
사용자 정의 객체인 obj로부터 method_name으로 참조되는 해당 메소드를 호출합니다. call_user_method()가 메소드의 인수를 가변인수리스트 방식으로 전달하는데 반하여 call_user_method_array()는 배열 구조로 전달하는 것이 다릅니다. 아래에 있는 활용 예제에서 클래스를 정의하고, 객체를 인스턴스화하고, print_info 메소드를 간접적으로 호출하기 위해 call_user_method_array()를 이용합니다.
[code php;gutter:false] <?php

class Country {
var $NAME;
var $TLD;

function Country($name, $tld) {
$this->NAME = $name;
$this->TLD = $tld;
}

function print_info($prestr="", $poststr="") {
echo $prestr."Country: ".$this->NAME.$poststr;
echo $prestr."Top Level Domain: ".$this->TLD.$poststr;
}
}

$cntry = new Country("Peru","pe");

echo "* Calling the object method directly\n";
$cntry->print_info();

echo "\n* Calling the same method indirectly\n";
call_user_method_array("print_info", $cntry, array("\t", "\n"));

?> [/code]
참고
call_user_func_array(), call_user_func(), call_user_method()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:16
PHP 를 컴파일할 때 포함하게 되는 라이브러리에 따라서는 특정 클래스가 미리 정의되어 있을 수 있습니다. 이와같이 미리정의된 PHP 정의 클래스(predefined classes)를 가지고 있는 라이브러리에는 "Ming", "Oracle 8", "qtdom"이 있습니다. 또한 라이브러리에 관계없이 PHP 모든 코드에 포함되어 있는 기본 정의 클래스(standard defined classes)가 있습니다.
구분 해당 라이브러리 PHP 정의 클래스명
기본 정의 클래스
(Standard Defined Classes)
모든 PHP 코드 Directory, stdClass
Ming 정의 클래스
(Ming Defined Classes)
Ming swfshape, swffill, swfgradient, swfbitmap, swftext, swftextfield, swffont, swfdisplayitem, swfmovie, swfbutton, swfaction, swfmorph, swfsprite
Oracle 8 정의 클래스
(Oracle 8 Defined Classes)
Oracle 8 OCI-Lob, OCI-Collection
qtdom 정의 클래스
(qtdom Defined Classes)
qtdom QDomDocument, QDomNode

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:12
PHP 스크립트에 내장되어 있는 클래스와 객체 관련 함수에 대하여 살펴보겠습니다.
클래스/객체 관련함수 목록
클래스/객체 함수(class/object function)를 이용하면 클래스와 인스턴스 객체에 대한 정보를 얻을 수 있습니다. 객체를 생성했던 클래스명 뿐만 아니라 해당 클래스의 멤버인 멤버변수와 메소드명도 얻을 수 있습니다. 이러한 함수를 이용하면 객체의 클래스 멤버 뿐만 아니라 객체의 상속관계(parentage; 객체를 생성했던 클래스가 어떤 클래스에서 확장된 것인지를 나타내는 것)를 확인할 수 있습니다. 현재(2002.6)까지 공식문서에 추가된 클래스/객체 관련 함수는 아래와 같이 총 12개가 등록되어 있습니다.
메소드명 기능 호환성
call_user_method_array 특정 객체에 포함된 사용자 정의 메소드 호출(배열인수) PHP4 >= 4.0.5
call_user_method 특정 객체에 포함된 사용자 정의 메소드 호출(가변인수리스트) PHP3 >= 3.0.3, PHP4
class_exists 클래스가 정의되어 있는지 확인 PHP4 >= 4.0b4
get_class 객체의 클래스명 반환 PHP4 >= 4.0b2
get_class_methods 클래스 메소드명 반환 PHP4 >= 4.0RC1
get_class_vars 클래스의 디폴트 멤버변수 반환 PHP4 >= 4.0RC1
get_declared_classes 현재 문서에 정의된 클래스명 반환 PHP4 >= 4.0RC2
get_object_vars 인스턴스에 의해 지정된 멤버변수 반환 PHP4 >= 4.0RC1
get_parent_class 부모클래스명을 반환 PHP4 >= 4.0b2,4.0.5
is_a

지정된 클래스로부터 생성된 객체인지 확인

PHP4 >= 4.2.0
is_subclass_of 객체가 지정된 클래스의 서브클래스에 속하는지 확인 PHP4 >= 4.0b4
method_exists 특정 클래스 메소드가 존재하는지 확인 PHP4 >= 4.0b2
사용 예제
이 예제에서는 우선 기반클래스(base class)와 기반클래스에서 확장된 클래스를 정의합니다. 기반클래스에서는 야채의 일반적인 사항, 식용인지 아닌지와 야채 색깔이 무엇인지를 기술하고 있습니다. 서브클래스 Spinach에서는 야채를 요리하기 위한 것과 야채가 요리되었는가를 확인하는 메소드를 추가하였습니다.
[code php;gutter:false] <?php

// base class with member properties and methods
class Vegetable {
var $edible;
var $color;

function Vegetable( $edible, $color="green" ) {
$this->edible = $edible;
$this->color = $color;
}

function is_edible() {
return $this->edible;
}

function what_color() {
return $this->color;
}
} // end of class Vegetable


// extends the base class
class Spinach extends Vegetable {
var $cooked = false;

function Spinach() {
$this->Vegetable( true, "green" );
}

function cook_it() {
$this->cooked = true;
}

function is_cooked() {
return $this->cooked;
}
} // end of class Spinach

?> [/code]
< Example 1. classes.php >
클래스 Vegetable와 Spinach로부터 2개의 객체를 인스턴스화하고 부모클래스를 포함하여 클래스에 대한 정보를 출력합니다. 또한 몇몇 유틸리티 함수를 정의하는데 이것들은 주로 해당 변수들을 제대로 출력하기 위한 것입니다.
[code php;gutter:false] <?php

include "classes.php";

// utility functions

function print_vars($obj) {
$arr = get_object_vars($obj);
while (list($prop, $val) = each($arr))
echo "\t$prop = $val\n";
}

function print_methods($obj) {
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method)
echo "\tfunction $method()\n";
}

function class_parentage($obj, $class) {
global $$obj;
if (is_subclass_of($$obj, $class)) {
echo "Object $obj belongs to class ".get_class($$obj);
echo " a subclass of $class\n";
} else {
echo "Object $obj does not belong to a subclass of $class\n";
}
}

// instantiate 2 objects

$veggie = new Vegetable(true,"blue");
$leafy = new Spinach();

// print out information about objects
echo "veggie: CLASS ".get_class($veggie)."\n";
echo "leafy: CLASS ".get_class($leafy);
echo ", PARENT ".get_parent_class($leafy)."\n";

// show veggie properties
echo "\nveggie: Properties\n";
print_vars($veggie);

// and leafy methods
echo "\nleafy: Methods\n";
print_methods($leafy);

echo "\nParentage:\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");

?> [/code]
< Example 2. test_script.php >
위의 예제에서 주의하여야 할 한가지 중요한 것은 객체 $leafy가 Vegetable의 서브클래스인 클래스 Spinac의 인스턴스라는 것이며, 따라서 위 스크립트의 마지막 부분이 출력될 것입니다.
veggie: CLASS vegetable
leafy: CLASS spinach, PARENT vegetable

veggie: Properties
edible = 1
color = blue

leafy: Methods
function vegetable()
function is_edible()
function what_color()
function spinach()
function cook_it()
function is_cooked()

Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable
< 출력결과(HTML 소스) >

Posted by 방글24
phpclass/클래스활용2000. 7. 13. 14:07
__sleep, __wakeup과 같이 "__"로 시작하는 매직함수(magic function)는 PHP 클래스 내에서 특수한 목적으로 사용됩니다. 따라서 이 함수들이 가지고 있는 문서화된 매직 기능을 사용할 필요가 없다면 클래스 내에 이 함수들을 정의해서는 안됩니다.
__sleep
serialize 함수를 통해 객체를 직렬화할 때 해당 클래스에 매직 함수 __sleep가 정의되어 있는지 확인합니다. 만약 정의되어 있다면 객체를 직렬화하기 전에 __sleep 함수를 수행합니다. 이 함수는 직렬화하기 전에 객체 멤버에 대하여 조작해야 하는 작업, 또는 직렬화하기 전에 미리 수행해야 하는 작업(예를 들어 데이터베이스 연결 종료 등)을 수행할 수 있습니다. __sleep 함수는 직렬화할 객체의 모든 멤버변수의 이름을 변수에 담아 반환합니다.
[code php;gutter:false] class Scott {
var $error;
var $svar = array();

function Scott() {
$this->svar['Hello'] = "World";
}

function __sleep() {
$this->svar['Hello'] = "Yawn";
// return list of instance-variables to be serialized
return array('error', 'svar');
}
}

$x = new Scott();
print_r($x);
$y = serialize($x);
$z = unserialize($y);
print_r($z); [/code]
__wakeup
unserialize 함수를 통해 문자열을 객체화할 때 해당 클래스에 매직 함수 __wakeup가 정의되어 있는지 확인합니다. 만약 정의되어 있다면 객체화하기 전에 __wakeup 함수를 수행합니다. 이 함수를 수행할 때 객체화하기 전에 객체를 상대로 수행해야하는 작업, 또는 객체화하기 전에 미리 수행해야 하는 작업(예를 들어 데이터베이스 연결 등)을 수행할 수 있습니다.
[code php;gutter:false] class Scott {
var $error;
var $svar = array();

function Scott() {
$this->svar['Hello'] = "World";
}

function __sleep() {
$this->svar['Hello'] = "Yawn";
// return list of instance-variables to be serialized
return array('error', 'svar');
}

function __wakeup() {
$this->svar['test'] = "I'm here!";
}
}

$x = new Scott();
print_r($x);
$y = serialize($x);
$z = unserialize($y);
print_r($z); [/code]

Posted by 방글24
phpclass/클래스활용2000. 7. 13. 14:05
부모클래스의 메소드 호출
보통 부모클래스에서 선언된 메소드를 자식클래스에서 재정의하는 이유는 크게 두가지가 있습니다.
1. 부모클래스 메소드를 완전히 새롭게 정의하기 위하여
2. 부모클래스 메소드의 기능에 새로운 기능을 추가하기 위하여
첫 번째 기능은 부모클래스의 메소드를 무시하고 메소드에 새로운 정의를 함으로써 부모클래스의 메소드 정의를 숨기는 것입니다. 그러나 때로는 부모클래스의 메소드를 모두 지우는 것보다는 추가적인 기능이 필요한 경우가 있습니다. 이같은 경우에는 부모클래스의 메소드와 자식클래스에서 재정의된 메소드를 모두 수행하게 될 것입니다. 즉, 재정의된 메소드 구문 내에서 부모클래스의 메소드를 호출할 수 있어야 하며 필요한 기능만 추가적으로 작성하면 될 것입니다. 이럴 때 부모클래스의 메소드를 호출하기 위해서 사용하는 키워드가 parent입니다. 자바에서의 키워드 super와 같은 역할을 하며 이것은 그 메소드 호출을 상위클래스로 전달합니다.
부모키워드 parent는 $this 키워드와 비슷하게 이 클래스의 부모클래스를 나타내는 위치 지정자입니다. 현재 클래스의 부모클래스를 참조해야 되는 경우에는 부모키워드 parent를 사용할 수 있습니다.
[code php;gutter:false] class A {
function example() {
echo "클래스 A에 정의된 메소드 example. \n";
}
}

class B extends A {
function example() {
echo "클래스 B에서 재정의된 메소드 example. \n";
parent::example();
}
}

$b = new B;

$b->example(); [/code]
이 예의 출력결과를 보면 아래와 같이 나타날 것입니다.
클래스 B에서 재정의된 메소드 example.
클래스 A에 정의된 메소드 example.
앞장 범위연산자에서 설명한 대로 키워드 parent 대신에 extends 다음에 기술된 부모클래스명을 직접 사용해도 됩니다.
parent::example();  ------>  A::example();
키워드 parent를 써야 될 이유
위의 예에서 부모클래스를 A가 아닌 A1으로부터 상속받도록 수정하여야 한다면 아래와 같이 extends 다음에 있는 부모클래스명을 변경하는 것으로 모든 작업은 끝나게 됩니다. 만약 parent::example()가 아닌 A::example()라고 작성하였었다면 이 부분도 A1::example()라고 수정하여야 할 것입니다. 결국 수정할 때 손이 더 많이 가야 하는 것이지요. 그러니 부모클래스에 있는 메소드에 접근하는 경우라면 키워드 parent를 이용하는 것이 소스 코드를 관리하는데 훨씬 유리할 것입니다.
[code php;gutter:false] class B extends A1 {
function example() {
echo "클래스 B에서 재정의된 메소드 example. \n";
parent::example();
}
}

$b = new B;

$b->example(); [/code]

Posted by 방글24