phpclass/클래스활용2000. 10. 19. 14:41
PHP3에서 메소드를 직렬화/객체화하기
PHP3 의 serialize()/unserialize() 함수에서 객체의 메소드를 다루면 에러가 발생하게 됩니다. 즉, PHP3의 serialize()/unserialize() 함수가 객체의 메소드를 지원하지 않기 때문입니다. 그래서 PHP3에서도 객체의 메소드를 직렬화/객체화할 수 있는 라이브러리를 작성하여 보았습니다. 이 라이브러리는 향후 세셔너를 업그레이드할 때 사용할 작정입니다. 그러면 PHP3에서도 모든 변수와 함께 객체에 대해서도 온전히 세션 관리할 수 있을 겁니다.
[code php;gutter:false] <?php

/*
filename : serialize.php (ver.0.0.1)
email : hwooky@phpclass.com
homepage : www.phpclass.com
author : hwooky
*/

/*
사용자 함수:
string serialize3(mixed value, string classname);
mixed unserialize3(string str);
*/

function prvExplodeGroup($str) {
$count = 0;
$prefix = $middle = $suffix = "";

do {
$pos_start = ($pos_start = strpos($str, "{")) ? $pos_start : "NOTHING";
$pos_end = ($pos_end = strpos($str, "}")) ? $pos_end : "NOTHING";

if ((string)$pos_start < (string)$pos_end) {
// "{"로 시작되는 부분
if (0 == $count) {
$prefix = substr($str, 0, $pos_start);
$str = substr($str, $pos_start+1);
} else {
$middle .= substr($str, 0, $pos_start)."{";
$str = substr($str, $pos_start+1);
}
$count++;
} else if ((string)$pos_start > (string)$pos_end) {
// "}"로 시작되는 부분
$middle .= substr($str, 0, $pos_end)."}";
$str = substr($str, $pos_end+1);
$count--;
}
} while ($count);

if ($middle) {
$middle = substr($middle, 0, -1);
$suffix = $str;
} else {
$prefix = $str;
}

return array($prefix, $middle, $suffix);
}

function prvSimplifyObjectString($str) {
$pos = strpos($str, "{");
$prefix = substr($str, 0, $pos);
$val = substr($str, $pos+1, -2);

$suffix = $val;
$str = "";
$count = 0;

do {
list($prefix, $middle, $suffix) = prvExplodeGroup($suffix);
if ($middle)
$str .= $prefix.$count++.";";
} while ($middle);

return $str.$prefix;
}

function serialize3(&$obj, $classname="") {
$str = serialize($obj);
return $classname.";".$str;
}

function unserialize3($str) {
$pos = strpos($str, ";");
$classname = substr($str, 0, $pos);
$val = substr($str, $pos+1);
$obj = unserialize($val);

if ($classname && function_exists($classname)) {
$tobj = new $classname;

$val = prvSimplifyObjectString($val);
$arg = explode(";", $val);

for ($i=0;$i<sizeof($arg);$i+=2) {
$sep = explode(":", $arg[$i]);
$name = substr($sep[2], 1, -1);

if ("user function" != gettype($tobj->$name))
$tobj->$name = $obj->$name;
}
return $tobj;
}
return $obj;
}

?> [/code]
serialize3() 함수를 보면 serialize() 함수에는 없는 두번째 인수를 지정하여야 합니다. 두번째 인수는 객체를 직렬화할 때만 사용되는 인수입니다. 객체 이외의 변수를 직렬화하는 방법은 serialize() 함수와 동일합니다. 객체를 직렬화하려면 첫번째 인수로는 직렬화하려는 객체명을 지정하고, 두번째 인수로는 객체를 생성할 때 필요한 클래스명을 지정합니다. 예를 들어,
[code php;gutter:false] $obj = new test; [/code]
위와 같이 생성된 객체를 직렬화하려면
[code php;gutter:false] serialize3($obj, "test"); [/code]
위와 같이 객체변수와 클래스명을 지정하여 줍니다. 앞 장에서 다루었던 예제를 여기서도 그대로 사용하여 보겠습니다. 앞 장과 다른 점은 serialize.php 라이브러리를 인클루드하는 부분이 추가되었고, seiralize()/unseiralize() 함수 대신에 라이브러리에 있는 seiralize3()/unseiralize3() 함수를 사용하였다는 것입니다. 실행 결과는 PHP4의 경우와 동일합니다.
[code php;gutter:false] <?php

// 파일명 : test1.php3

require("./serialize.php");

class test {
var $a;
var $b;

function output() {
return "나 함수";
}
}

$obj = new test;

$obj->a = 0;
$obj->b = "나 b";

echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";

$ser = urlencode(serialize3($obj, "test"));

echo "<p><A href=test2.php3?ser=$ser>TEST2.PHP3</A></p>";

?> [/code]
[code php;gutter:false] <?php
// 파일명 : test2.php

require("./serialize.php");

class test {
var $a;
var $b;

function output() {
return "나 함수";
}
}

$obj = unserialize3(stripslashes($ser));

echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";

?>

<p><A href=test1.php3>TEST1.PHP3</A></p> [/code]
serialize.php 라이브러리를 이용할 때도 PHP4 때와 마찬가지로 serialize3() -> unserialize3() 과정을 거친 객체가 정상적으로 복원되었다는 것을 알 수 있습니다.
test1.php3를 실행하였을 때:

0
나 b
나 함수

TEST2.PHP3

test2.php3를 실행하였을 때:

0
나 b
나 함수

TEST1.PHP3

Posted by 방글24
phpclass/클래스활용2000. 10. 19. 14:40
PHP4에서 메소드를 직렬화/객체화하기
예를 들어 아래와 같이 예제를 작성하여 PHP3와 PHP4 스크립트에 각각 실행하여 보면, test2.php를 실행하였을 때 PHP4에서는 정상적으로 메소드가 실행되지만 PHP3에서는 에러가 발생합니다.
[code php;gutter:true]<?php
// 파일명 : test1.php

class test {
  var $a;
  var $b;

  function output() {
    return "나 함수";
  }
}

$obj = new test;

$obj->a = 0;
$obj->b = "나 b";

echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";

$ser = urlencode(serialize($obj));

echo "<p><A href=test2.php?ser=$ser>TEST2.PHP</A></p>";

?> [/code]
[code php;gutter:true] <?php
// 파일명 : test2.php

class test {
  var $a;
  var $b;

  function output() {
    return "나 함수";
  }
}

$obj = unserialize(stripslashes($ser));

echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";

?>

<p><A href=test1.php>TEST1.PHP</A></p> [/code]
아래는 PHP3에서 실행한 결과입니다. PHP3에서는 serialize()/unserialize()가 객체의 메소드를 지원하지 않기 때문에 test2.php를 실행할 때에 17번 라인에서 에러가 발생합니다.
test1.php를 실행하였을 때:

0
나 b
나 함수

TEST2.PHP

test2.php를 실행하였을 때:

0
나 b

Fatal error: Function call to a non-function (output)
in /home/httpd/homepage/phpclass/exam2/simple/test2.php on line 17
아래는 PHP4에서 실행한 결과입니다. PHP4에서는 serialize() -> unserialize() 과정을 거친 객체가 정상적으로 복원되었다는 것을 알 수 있습니다. 앞장에서 설명하였지만 메소드 정의는 별도로 포함시켜야 하는 것을 잊어서는 안됩니다. 메소드 정의를 생략한다면 역시 에러를 만나게 될 것입니다.
test1.php를 실행하였을 때:

0
나 b
나 함수

TEST2.PHP

test2.php를 실행하였을 때:

0
나 b
나 함수

TEST1.PHP

Posted by 방글24
phpclass/클래스활용2000. 10. 19. 14:39
serialize() 함수
형식 : string serialize(mixed value)
PHP4 스크립트부터 객체를 serialize() 함수를 이용하여 다른 매체에 저장할 수 있는 문자열로 직렬화(serialize)시킬 수 있습니다. PHP3에서도 객체의 멤버변수까지는 직렬화할 수 있었지만 메소드까지는 지원되지 않았는데 PHP4부터는 메소드까지 지원하기 시작한 것이지요. 여러분이 잘 알고 계시는 세션함수가 내부적으로 바로 serialize()를 이용하여 등록된 세션변수값을 파일로 저장할 수 있도록 직렬화하는 것입니다. 그런데 이 serialize() 함수가 객체를 다룰 때 멤버변수만 다루지 메소드는 무시해 버립니다. 정확하게 이야기 하면 메소드 정의를 포함하고 있는 클래스명만 기록하며 클래스에 포함된 메소드 정의 부분은 다루지 않습니다. 앞장 "클래스와 인스턴스"를 주의깊게 읽어 보셨다면 serialize() 함수가 왜 메소드 정의를 다루지 않는 지를 이해할 수 있을 것입니다. serialize() 함수는 객체를 다루는 함수이지 클래스를 다루는 함수는 아닙니다. 객체에는 메소드가 포함되어 있지 않습니다. 따라서 객체를 직렬화한다고 해도 클래스에 포함되어 있는 메소드 정의 부분을 직렬화한다는 것은 올바르지 않지요. 메소드는 같은 클래스에서 생성된 모든 객체가 공유해야 할 정보이지 특정 객체에만 편입된 정보가 아니기 때문에 특정 객체를 직렬화 한다고 해서 직렬화된 정보에 메소드 정의 정보가 포함될 수 없는 것입니다. 이젠 제가 왜 serialize()/unserialize() 함수를 설명하기 전에 "클래스와 인스턴스"라는 주제를 앞 장에 삽입하여 장황하게 설명했는지 이해하실 것 입니다. 클래스와 인스턴스 개념을 이해하고 있지 못하면 왜 serialize() 함수가 메소드 정의 부분을 포함하여 직렬화 시키지 않았는지를 이해할 수가 없습니다.
예를 들어 아래와 같이 session_register() 함수를 이용하여 객체 변수 $obj를 등록시키겠습니다.
[code php;gutter:true]<?php
// 파일명 : test1.php

class test {
  var $a = "1234ASDF";
 
  function test() {}
 
  function output() {
    echo($this->a);
  }
}
 
session_register("obj");
$obj = new test();
$obj->output();
?>

<p><A href=test2.php>TEST2.PHP</A></p> [/code]
이와 같이 세션 등록을 하면 스크립트가 종료되는 순간에 객체를 serialize() 함수를 이용하여 직렬화한 후 서버의 /tmp 디렉토리에 sess_xxxxxxxxxxx 파일명으로 직렬화된 문자열을 저장하게 되는데 그 내용이 아래와 같습니다.
obj|O:4:"test":1:{s:1:"a";s:8:"1234ASDF";}
여기서 obj는 객체변수명, "test"는 클래스명, "a"는 멤버변수명, "1234ASDF"는 멤버변수값을 나타냅니다. 메소드에 관한 정보는 모두 빠져 있는 것을 볼 수 있습니다. 만약 PHP3에서 serialize() 함수를 이용하여 객체를 직렬화 하였다면 멤버변수는 멤버변수명과 멤버변수값이 모두 정상적으로 기록되지만 메소드는 메소드명만 기록되지 메소드 정의 부분이 기록하지 않습니다. 이것이 PHP4에 와서는 메소드명까지 기록하지 않게 되었습니다. 대신에 클래스명이 기록되지요.
unserialize() 함수
형식 : mixed serialize(string str)
unserialize() 함수는 serialize() 함수를 이용하여 객체로부터 직렬화된 문자열을 다시 객체로 복원시켜 줍니다. serialize() 함수를 설명할 때 언급한 것처럼 직렬화할 때 객체의 메소드의 정보가 기록되지 않기 때문에 unserialize() 함수로 다시 객체화하더라도 우선 멤버변수만 접근할 수 있지 메소드는 접근할 수 없습니다.
[code php;gutter:true]<?php
// 파일명 : test2.php
 
session_register("obj");
$obj->output();
?>
 
<p><A href=test1.php>TEST1.PHP</A></p> [/code]
위의 예제에서 5번째줄 $obj->output()는 객체의 메소드를 실행하여야 하는데 객체의 메소드는 복원할 수 없으므로 아래와 같은 에러가 발생합니다.
Fatal error: Call to undefined function: output()
in /서버의 디렉토리/test2.php on line 5
따라서 세션함수에 의해 복원된 객체를 가지고 메소드를 실행하기 위해서는 복원된 페이지 내에서 원래의 클래스의 정의를 아래와 같이 명시적으로 포함시켜야 합니다. 즉, 메소드 정의는 별도로 복원시켜주어야 하는 것이지요.
[code php;gutter:true]<?php
// 파일명 : test2.php
 
class test {
  function output() {
    echo($this->a);
  }
}
session_register("obj");
$obj->output();
?>
 
<p><A href=test1.php>TEST1.PHP</A></p> [/code]
PHP4 에서 객체의 serialize() 함수가 멤버변수와 메소드를 모두 지원한다 하더라도 메소드 정의 부분은 포함되지 않으므로 unserialize() 함수로 복원된 객체를 온전히 사용하기 위해서는 메소드 정의를 별도로 포함시켜야 한다는 것에 주의하여야 합니다.

Posted by 방글24
phpclass/클래스활용2000. 10. 17. 14:37
클래스와 객체에 관련된 정보에 대하여 알아봅니다.
객체의 모델링
객 체지향 프로그래밍에서는 여러 개의 객체를 모아 하나의 전체 프로그램을 구성하게 됩니다. 프로그램에서 객체를 모델링, 즉 객체를 표현하기 위해서는 물리적 특성(객체의 속성)과 동적 특성(객체의 동작)을 규명하여야 합니다. 예를 들어 자동차라는 객체가 가지고 있는 각 특성을 살펴보면 아래와 같이 될 수 있습니다.
자동차의 물리적 특성 :
- 자동차 중량
- 자동차 색상
- 배기량

자동차의 동적 특성 :
- 출발
- 방향전환
- 정지
이러한 자동차의 특성에 따라 "둘리", "밍키", "후키"이라는 사람이 소유하고 있는 자동차를 모델링하면 다음과 같습니다.
항목 둘리 밍키 후키
물리적
특성
중량 1800kg 2600kg 4500kg
색상 은색 흑색 흰색
배기량 2000CC 3000CC 5000CC
동적
특성
출발 엔진에 연료를 공급한다
동력을 바퀴에 전달한다
바퀴를 움직인다
엔진에 연료를 공급한다
동력을 바퀴에 전달한다
바퀴를 움직인다
엔진에 연료를 공급한다
동력을 바퀴에 전달한다
바퀴를 움직인다
방향
전환
조향핸들을 조작한다 조향핸들을 조작한다 조향핸들을 조작한다
정지 엔진에 연료 공급을 중단한다
바퀴에 전달하는 동력을 차단한다
바퀴를 정지시킨다
엔진에 연료 공급을 중단한다
바퀴에 전달하는 동력을 차단한다
바퀴를 정지시킨다
엔진에 연료 공급을 중단한다
바퀴에 전달하는 동력을 차단한다
바퀴를 정지시킨다
클래스의 필요성
위 의 예에서 3개의 자동차가 각각 서로 다른 객체이기 때문에 각각의 자동차가 가지는 물리적 특성을 서로 다를 수 있습니다. 그러나 이러한 3개의 객체는 모두 자동차라는 공통점을 가지고 있기 때문에 각각의 자동차가 다른 물리적 특성을 가지고 있더라도 그 구조는 모두 동일합니다. 즉, 각각의 자동차는 서로 다른 색상을 가질 수 있지만, 모든 자동차는 색상이라는 특성을 가지고 있다는 공통점을 가지고 있습니다. 결국 모든 자동차들은 동일한 구조로 표현된다고 할 수 있습니다.
각각의 자동차가 서로 다른 물리적 특성을 가질 수 있는 것과 달리, 모든 자동차는 동일한 방법으로 동작하게 됩니다. 즉, 모든 자동차는 동일한 동적 특성을 가지게 됩니다.
이 와 같이 자동차라는 공통점을 가지고 있는 각각의 객체는 서로 다른 물리적 특성을 가질 수 있지만, 각각의 객체에 데이터(물리적 특성)를 저장하는 구조(자료구조)와 각각의 객체에서 수행하는 동적 특징은 공유하게 됩니다. 이와 같이 각각의 객체에서 공유하게 되는 정보를 표현하기 위하여 객체지향 프로그래밍에서는 클래스(Class)라는 개념을 사용하게 됩니다. 이와 같이 클래스는 "둘리", "밍키", "후키"가 소유한 차, 즉 객체가 가지는 물리적 특성의 구조(자료구조)와 동적 특성을 표현하게 됩니다.
인스턴스(instance)
인 스턴스란 클래스에 속하는 하나의 객체로써, 클래스에 정의된 특성을 가지게 되는 객체를 말합니다. 이에 따라 인스턴스는 자신이 소속된 클래스에서 정의한 구조(자료구조)에 따라 정보를 가질 뿐만 아니라, 자신이 가지고 있는 정보를 조작하기 위하여 클래스에 정의되어 있는 동적 특성을 사용합니다.
클래스와 인스턴스 개념을 이용한 객체의 모델링
< 클래스와 인스턴스 개념을 이용한 객체의 모델링 >
위의 그림에서 보면 동적 특성(함수)이 클래스에 속하여 있으며, 인스턴스에서는 단지 필요에 따라 클래스에 정의되어 있는 이러한 동적 특성을 이용하게 됩니다.
여기에 기술된 내용은 10년 전에 제가 보던 C++ 책의 내용을 기반으로 작성된 것이라 이미 책에서 보신 기억이 나시는 분도 있으리라 생각되네요.

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:30
호환성
PHP4 >= 4.0b2
기능
특정 클래스 메소드가 존재하는지 확인
형식
bool method_exists (object object, string method_name)
설명
method_exists()는 생성된 객체에 원하는 메소드가 존재하는지 확인하는 함수입니다. 메소드가 존재하면 true, 아니면 false를 반환합니다.

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:29
호환성
PHP4 >= 4.0b4
기능
객체가 지정된 클래스의 서브클래스에 속하는지 확인
형식
bool is_subclass_of (object obj, string superclass)
설명
객체 obj가 superclass의 서브클래스라면 true를 반환하고, 그렇게 않으면 false를 반환합니다.
[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

$obj = new Spinach;

if (is_subclass_of($obj, "vegetable")) {
echo "객체 \$obj는 ".get_parent_class($obj)
."의 서브클래스로부터 생성된 객체입니다.";
} else {
echo "객체 \$obj는 ".get_parent_class($obj)
."의 서브클래스로부터 생성된 객체가 아닙니다.";
}

?> [/code]
< 예제 소스 >
객체 $obj는 vegetable의 서브클래스로부터 생성된 객체입니다.
< 실행 결과 >
참고
get_class(), get_parent_class()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:28
호환성
PHP4 >= 4.2.0
기능
지정된 클래스로부터 생성된 객체인지 확인
형식
bool is_a (object obj, string class_name)
설명
지정된 클래스에 의해 생성된 객체이거나 또는 지정된 클래스로부터 상속된 서브클래스 중 하나로부터 생성된 객체이면 true를 돌려주고 아니면 false를 돌려줍니다.
참고
get_class(), get_parent_class(), and is_subclass_of()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:27
호환성
PHP4 >= 4.0b2
기능
객체나 클래스의 부모클래스명을 반환
형식
string get_parent_class (mixed obj)
설명
obj가 객체이면 인스턴스화할 때 사용된 클래스의 부모클래스명을 반환합니다. obj가 문자열이면, 그 이름을 갖는 클래스의 부모클래스명을 반환합니다. 이 기능은 PHP 4.0.5에서 추가되었습니다.
[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

$obj = new Spinach;

echo "객체 \$obj를 생성했던 클래스는 ".get_class($obj)."이며,
그 부모클래스는 ".get_parent_class($obj)."입니다.";

?> [/code]
< 예제 소스 >
객체 $obj를 생성했던 클래스는 spinach이며, 그 부모클래스는 vegetable입니다.
< 실행 결과 >
참고
get_class(), is_subclass_of()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:25
호환성
PHP4 >= 4.0RC1
기능
인스턴스에 의해 지정된 멤버변수명과 값 반환
형식
array get_object_vars (object obj)
설명
get_object_vars() 는 클래스를 정의할 때 설정한 멤버변수명과 값뿐만 아니라 객체 생성 후 지정된 멤버변수명과 값을 모두 되돌려 줍니다. 반환되는 배열은 연관배열(associative array)이며, 멤버변수 값을 지정하지 않은 멤버변수는 이 함수의 반환 값에 포함되지 않습니다.
[code php;gutter:false] <?php

class Point2D {
var $x, $y;
var $label;

function Point2D($x, $y) {
$this->x = $x;
$this->y = $y;
}

function setLabel($label) {
$this->label = $label;
}

function getPoint() {
return array("x" => $this->x,
"y" => $this->y,
"label" => $this->label);
}
}

$p1 = new Point2D(1.233, 3.445);
print_r(get_object_vars($p1));

$p1->setLabel("point #1");
print_r(get_object_vars($p1));

?> [/code]
< 예제 코드 >
Array
(
[x] => 1.233
[y] => 3.445
)
Array
(
[x] => 1.233
[y] => 3.445
[label] => point #1
)
< 실행 결과(HTML 소스) >
참고
get_class_methods(), get_class_vars()

Posted by 방글24
phpclass/클래스활용2000. 10. 10. 14:24
호환성
PHP4 >= 4.0RC2
기능
현재 문서에 정의된 클래스명을 배열에 담아 반환
형식
array get_declared_classes (void)
설명
get_declared_classes() 함수를 사용하면 현재 스크립트에 정의된 클래스명을 배열에 담아 되돌려 줍니다. 배열 앞부분에는 PHP 스크립트가 현재 문서에 자동으로 삽입시켜주는 클래스가 3개 추가로 포함됩니다. 이와 같이 자동으로 내장되는 클래스는 stdClass(Zend/zend.c에 정의됨), OverloadedTestClass(ext/standard/basic_functions.c에 정의됨), Directory(ext/standard/dir.c에 정의됨)가 있습니다.
또한, PHP를 컴파일할 때 포함하게 되는 특정 라이브러리가 부가적으로 가지고 있는 클래스들이 있습니다. 이와 같이 PHP에 미리정의된 PHP 정의 클래스(predefined classes)와 동일한 이름을 가지고는 사용자 자신의 클래스를 정의할 수 없습니다.
[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

$arr_class = get_declared_classes();

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

?> [/code]
< 예제 소스 >
$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
< 실행 결과 >
위 예제의 실행결과를 보면, 클래스명 stdClass, OverloadedTestClass, Directory은 PHP 스크립트에 의해 현재 문서에 자동으로 삽입되는 클래스이며, "OCI-Lob"는 PHP 스크립트를 설치할 때 오라클 데이터베이스의 OCI 모듈을 포함시키면서 내장된 클래스이며, 나머지는 사용자가 정의한 클래스들입니다.

Posted by 방글24