phpclass/객체정보2000. 12. 28. 14:58
메뉴 "객체지향언어로서의 PHP"에 포함시켜도 되는 주제이지만, 내용의 분량이 많아 별도의 메뉴로 분리하였습니다. 제가 공개한 세셔너함수-0.2.0을 작성하면서 도입된 객체지향프로그래밍 이론입니다.
여기에 있는 내용들은 관련 웹사이트나 관련 서적에 있는 내용을 정리(짜집기)한 것입니다.
추상클래스(abstract class)
추상클래스는 추상적인 클래스로써 그 구현이 덜 되었거나 또는 아직은 미완성 클래스이므로 실제 인스턴스(또는 객체)를 생성할 수 없도록 한 클래스입니다. 다시 말해서, 추상클래스는 객체가 가지는 특성들을 추상화시켜 놓았을 뿐 아직 구체화 시키지 못한 클래스이므로, 이 추상클래스를 상속하는 하위클래스에서 좀 더 구체화 시키도록 하는 것입니다. 따라서, 추상클래스를 상위클래스로 하여 상속하는 하위클래스는 추상클래스인 상위클래스에서 완전히 구현하지 못한 부분들을 완전하게 구현해 주어야만 하위클래스에 대한 객체 생성이 가능하고, 그렇지 못할 경우 하위클래스는 상위클래스인 추상클래스와 같이 미완성이므로 자체적으로 객체를 생성할 수 없고, 이 하위클래스는 다시 추상클래스가 됩니다.
추상클래스는 객체 지향 프로그램에서 하위클래스들의 공통된 특성을 추출하여 묘사하기 위한 클래스로, 클래스 자체가 너무 일반적인 특성을 가지기 때문에 객체를 생성하여 실제로 사용하기에 부적당한 클래스로, 디자인의 편의를 위해서 사용됩니다. 추상클래스의 일반적인 특성을 하위클래스에서 좀 더 덧붙여 실제 사물을 표현할 수 있기 때문에 추상클래스 그 자체로는 쓸모가 없지만 파생을 할 경우는 쓸모가 있습니다.
추상함수(abstract function)
추상클래스에는 연관된 하위클래스들의 공통데이터 구조, 즉 변수들을 정의하고, 함수중 일부는 완전히 구현하지 않고 프로토타입만 정의합니다. 이와 같이 추상클래스에는 함수 몸체가 없이 정의되는 함수를 멤버로 가지게 됩니다. 이것은 필요한 기능을 지금 당장 함수로 구현할 수 없을 때 일단 정의만 해두고 내용은 나중에(하위클래스에서) 채워넣고 사용하겠다는 의미입니다. 이러한 몸체가 없이 정의되는 함수를 C++에서는 순수가상함수(pure virtual function)라고 하고 자바에서는 추상메소드(abstract method)라고 합니다. 여기서는 앞으로 순수가상함수 또는 추상메소드를 추상함수라 통칭하겠습니다.
추상함수를 포함하고 있는 추상클래스를 상속하는 하위클래스는 추상클래스가 갖고 있는 모든 추상함수를 구현하여 주어야 합니다. 그럴 경우, 하위클래스는 일반클래스처럼 사용할 수 있고, 인스턴스의 생성도 가능하지만, 추상함수를 모두 구현해 주지 못한 경우에는 하위클래스도 구현이 완전히 이루어지지 않은 추상함수를 포함하게 되므로 추상클래스가 됩니다.
추상클래스의 예
추상클래스의 아주 좋은 예로 그래픽 화면 상의 한 좌표를 가지는 Position 클래스를 들 수 있습니다.
[code php;gutter:false] class Position {
var $px, $py;
} [/code]
이 클래스는 위치만을 가지기 때문에 어떠한 그래픽 요소도 표현할 수가 없습니다. 가장 간단한 그래픽 요소인 점조차도 색상을 지정할 능력이 없기 때문에 표현이 불가능하며 단지 위치만을 가질 뿐입니다. 하지만 이 클래스는 모든 그래픽 요소에서 공통된 요소인 위치를 가지므로 파생을 할 경우는 하위클래스 자체가 유용하게 사용될 수 있습니다. 점을 나타내는 Point 클래스를 이 클래스로부터 파생시켜 색상을 나타내는 데이터 멤버만 덧붙이면 되며 원은 색상과, 반지름을 덧붙이고, 선은 끝점의 좌표와 색상을 덧붙이면 됩니다. 그외의 다른 그래픽 요소들도 Position 클래스로부터 파생시켜 나갈 수 있습니다.
추상클래스란 이렇게 파생을 목적으로 만들어지는 부모클래스이며 추상클래스의 멤버 함수는 객체를 가지지 않기 때문에 코드를 가질 필요가 없습니다. 단 하위클래스에서 멤버 함수를 재정의(overriding)하여 쓸 수 있도록 추상함수로 멤버 함수를 정의해주기만 하면 됩니다.
추상클래스의 특징
  • 추상함수를 갖는 클래스는 자동으로 추상클래스가 됩니다. 추상클래스는 최소한 한 개 이상의 추상함수를 가져야 합니다.
  • 추상클래스로부터 인스턴스 객체를 생성할 수는 없으며, 반드시 하위클래스가 존재합니다.
  • 추상클래스의 하위클래스는 상위클래스의 추상함수를 구현해주기만 하면 해당 하위클래스의 인스턴스 객체를 생성해 줄 수 있습니다.
  • 추상클래스의 하위클래스가 추상클래스로부터 상속받은 모든 추상함수를 구현해주지 않는 한 하위클래스 자신도 추상클래스가 됩니다.

'phpclass > 객체정보' 카테고리의 다른 글

{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
{추상클래스}2.C++  (0) 2000.12.28
Posted by 방글24
phpclass/클래스활용2000. 10. 19. 14:44
객체의 형변환(type casting)
스칼라값(integer, double, string)을 객체로 형변환하면, 그 값은 해당 객체의 'scalar'라는 멤버변수의 값이 된다.
[code php;gutter:false] $var = 'ciao';
$obj = (object) $var;
echo $obj->scalar; // 'ciao'를 출력 [/code]
객체를 스칼라값(integer, double)으로 형변환하면 의미없는 숫자 "1" 또는 "1.0"으로 되며, 문자열로 형변환하면 객체 내용에 관계없이 "Object"라는 문자열로 되며, 배열로 형변환하면 객체의 멤버변수명을 첨자로 하는 연관배열(associative array)로 됩니다.
[code php;gutter:false] <?php

class test {
var $a = 10;
var $b = 20;
function test() {
$this->c = 30;
}
}

$obj = new test;

$a = (int) $obj;
echo "object->integer : ".$a."\n";

$a = (double) $obj;
echo "object->double : ".$a."\n";

$a = (string) $obj;
echo "object->string : ".$a."\n";

$a = (array) $obj;
reset ($a);
while (list($k, $v) = each ($a))
echo "\$a[$k] = $v\n";

?> [/code]
< 예제 소스 >
object->integer : 1
object->double : 1
object->string : Object
$a[a] = 10
$a[b] = 20
$a[c] = 30
< 실행 결과 >
gettype(), settype(), is_object() 함수
print_r() 함수

Posted by 방글24
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