1. classdefine : 클래스 정의 함수
2. newobject : 객체 생성 함수
3. classchain : 클래스 상속관계 반환 함수
클래스 정의 함수 classdefine
[code c;gutter:false] string classdefine(string def_class); [/code]
기능
클래스 정의 문자열을 입력받아 해석하여 후키라이브러리에서 지원하는 기능을 사용할 수 있도록 합니다.
클래스 정의
보통 클래스를 정의하려면 아래와 같이 클래스 내에 멤버함수 및 데이터멤버를 정의하게 될 것입니다.
[code php;gutter:false] /*
클래스 a 정의
*/

class a {
.... 이곳에 멤버함수 및 데이터멤버를 정의합니다.
} [/code]
후키라이브러리를 이용하여 클래스 a를 정의하려면 아래와 같이 classdefine 함수로 현재클래스에 대한 중간클래스를 먼저 정의하여야 하며 현재클래스는 extends 키워드를 이용하여 중간클래스와의 관계를 정의해 주어야 합니다. 중간클래스명은 현재클래스명에 "Interclass"를 붙여줍니다. 그리고 나서 현재클래스 내에 멤버함수 및 데이터멤버를 정의하여 주면 됩니다.
[code php;gutter:false] /*
클래스 a 정의
*/

classdefine("
class aInterclass {}
");

class a extends aInterclass {
.... 이곳에 멤버함수 및 데이터멤버를 정의합니다.
} [/code]
단일 상속의 예
보통 PHP에서는 클래스 a가 부모클래스 z로부터 그 특성을 상속받으려는 자식클래스라면 아래와 같이 extends 키워드를 이용하여 그 관계를 정의하여 주게 되지요.
[code php;gutter:false] /*
부모클래스 z 정의
*/

class z {
.... 이곳에 부모클래스의 멤버함수 및 데이터멤버를 정의합니다.
}

/*
자식클래스 a 정의
*/

class a extends z {
.... 이곳에 자식클래스의 멤버함수 및 데이터멤버를 정의합니다.
} [/code]
후키라이브러리를 이용하여 단일 상속받으려면 아래와 같이 extends 키워드를 이용하여 그 관계를 정의하여 주게 되지요. 이 때 classdefine() 함수로 중간클래스를 먼저 정의하여야 하며 여기에서 현재클래스와 부모클래스 사이를 extends 키워드를 이용하여 연결해 줍니다.
[code php;gutter:false] /*
파일명 class.z.php
부모클래스 z 정의
*/

classdefine("
class zInterclass {}
");

class z extends zInterclass {
.... 이곳에 부모클래스의 멤버함수 및 데이터멤버를 정의합니다.
}

/*
파일명 class.a.php
자식클래스 a 정의
*/

classdefine("
class aInterclass extends z {}
");

class a extends aInterclass {
.... 이곳에 자식클래스의 멤버함수 및 데이터멤버를 정의합니다.
} [/code]
위에서 한가지 주의할 점은 부모클래스 z와 자식클래스 a는 반드시 별도의 파일로 관리하여야 합니다.
다중 상속의 예
다중 상속에 관한 자세한 내용은 "다중 상속" 장을 참조바랍니다.
중간클래스의 접미어를 변경하는 방법
접미어 "Interclass"를 디폴트 값이며 다른 접미어를 사용하려면 classdefine 함수의 두번째 인자로 지정하여 주면 됩니다. 아래는 "Interclass" 대신에 "Linkclass"를 접미어로 지정하는 예를 보여줍니다.
[code php;gutter:false] classdefine("
class aLinkclass extends b { }
", "Linkclass");

class a extends aLinkclass {

} [/code]
객체 생성 함수 newobject
[code php;gutter:false] include("./lib.hwooky.php"); // 후키라이브러리(0.1.0)

$obj = & newobject(CLASS_NAMES, ARGV); [/code]
기능
멤버 특성을 상속하려는 1개 이상의 부모클래스명 및 필요한 입력인자를 지정하게 되면 새로운 클래스 객체를 생성하여 되돌려 줍니다. 클래스 객체를 생성하기 전에 지정된 모든 부모클래스를 정의한 파일들을 순서대로 인클루드 시켜 줍니다.
부모클래스명 CLASS_NAMES
[code php;gutter:false] $obj = & newobject("clsDate", ARGV); [/code]
CLASS_NAMES은 상속받으려는 부모클래스명을 지정합니다. 위의 예에서는 클래스 "claDate"로 부터 객체를 생성합니다. newobject 함수에서 직접 다중상속하려는 경우에는 아래와 같이 복수 개의 부모클래스를 콤마(,)로 분리하여 지정합니다. 이 때 지정되는 순서는 자식클래스로부터 부모클래스 순으로 합니다. 따라서 아래의 예에서는 클래스 Bank가 마지막 파생클래스가 됩니다.
[code php;gutter:false] $obj = & newobject("Bank, clsDate", ARGV); [/code]
클래스 파일 관리 classfile.info
클래스 파일 관리는 classfile.info 파일 내에서 일괄적으로 다루어주기 때문에 사용자가 작성하는 스크립트 내에서는 파일 위치 또는 파일명을 지정하지 않아도 됩니다. 대신에 classfile.info 파일의 위치는 newobject()의 두번째 인자인 배열의 한 요소(첨자명 "path-to-classfile")로 지정됩니다.
[code php;gutter:false] $argv = array(
"path-to-classfile" => "./class"
);

$father = & newobject("Bank", $argv); [/code]
위와 같이 classfile.info의 위치를 "./class"를 지정하게 되면 현 문서의 하위디렉토리인 "./class"에서 classfile.info 파일을 찾게 됩니다. 이곳에 이 파일이 존재하지 않게되면 에러가 발생하게 되지요. classfile.info 파일에는 연관배열로 각 클래스명에 해당되는 클래스 정의 파일의 위치와 파일명이 할당되어 있습니다. 이 때 배열명은 반드시 $hkClassSpec로 지정하여야 합니다.
[code php;gutter:false] <?php

/*
classfile.info
*/

$hkClassSpec["clsDbsql"] = "base/class.mysql.php";
$hkClassSpec["clsSession"] = "session/class.session.php";
.
.
.

?> [/code]
classfile.info에 지정된 디렉토리 "base" 및 "session"은 classfile.info 파일이 있는 곳을 기준으로 지정합니다. 이와 같은 규칙만 지켜준다면 상호 독립적인 클래스를 별도의 디렉토리 별로 저장하여 관리할 수 있으며, 필요에 따라 필요한 클래스를 모두 쉽게 상속받아 사용할 수 있을 것입니다. 지정되는 디렉토리는 classfile.info 파일의 위치를 기준으로 지정하게 되며 현재 디렉토리를 의미하는 "."은 붙이지 않습니다.
입력값 ARGV
newobject 함수의 두번째 입력인자인 ARGV는 위에서 설명한 "path-to-classfile" 외에도 클래스 내에서 필요한 모든 입력인자를 지정할 수 있습니다. 이와같이 지정된 ARGV는 최상위 클래스로부터 최하위 클래스까지 모든 생성자에 동일하게 전달됩니다. ARGV의 데이터형은 연관배열(associative array)이며 객체 생성할 때에 필요한 인자를 배열에 담아 부모클래스 생성자로 전달합니다. 따라서 필요한 만큼 제한 없이 인자를 지정할 수 있습니다.
[code php;gutter:false] $argv = array(
arg1 => "입력값1",
arg2 => "입력값2",
.
.
.
);

$obj = & newobject("Bank", $argv); [/code]
리턴값
생성된 클래스 객체를 되돌려 줍니다. 반환된 객체는 아래 예에서와 같이 반드시 참조로 받아야 합니다. 참조로 받지 않으면 대부분의 경우에는 정상적으로 동작하지만 소멸자에서 데이터멤버를 다룰 때와 같은 경우에는 정상적으로 동작하지 않습니다.
[code php;gutter:false] $argv = array(
"path-to-classfile" => "./class"
);

$obj = & newobject("Bank, clsDate", $argv);

$obj->abc(); // abc()가 멤버함수로 정의되어 있다면... [/code]
복수의 객체를 생성할 때
아래는 동일한 상속 관계를 유지하는 클래스를 이용하여 복수 개의 객체를 생성하는 방법입니다.
[code php;gutter:false] $argv = array(
"path-to-classfile" => "./class"
);

$father = & newobject("Bank", $argv);
$mother = & newobject("Bank", $argv);
$son = & newobject("Bank", $argv); [/code]
위의 예와 다른 상속 관계를 가지고 있는 클래스를 이용하여 위와 동시에 객체를 생성할 수도 있습니다.
[code php;gutter:false] $argv = array(
"path-to-classfile" => "./class"
);

$father = & newobject("Bank", $argv);
$mother = & newobject("Bank", $argv);
$son = & newobject("Bank", $argv);

$argv["path-to-classfile"] = "./class/logic";

$o1 = & newobject("Group", $argv);
$o2 = & newobject("Group", $argv);
$o3 = & newobject("Group", $argv); [/code]
클래스 Bank와 클래스 Group이 서로 다른 classfile.info에 기록/유지되고 있다면 위에서와 같이 "path-to-classfile"를 객체 생성 직전에 올바르게 지정하여 주어야 합니다. 위의 예에서 보면 클래스 Bank는 현 문서를 기준으로 "./class/classfile.info"에 기록되어 있으며 클래스 Group는 "./class/logic/classfile.info"에 기록되고 있음을 알 수 있습니다.
클래스 상속관계 반환 함수 classchain
[code php;gutter:false] classchine(CLASS_NAMES); [/code]
기능
이전 버전의 classinfo 함수와는 달리 클래스의 상속관계를 브라우저에 표시하지 않고 단지 상속관계를 배열에 담아 되돌려 줍니다.
설명
배열에는 최상위 클래스명부터 최하위 파생클래스명까지 순서대로 기록되어 있습니다. classchine 함수를 사용하기 위해서는 먼저 newobject 함수를 실행하여야 하며, newobject 함수가 실행된 후에는 어느 곳에서나 실행할 수 있습니다. classchain 함수에 지정하게 되는 입력인자는 newobject 함수에서 지정하였던 첫번째 입력인자를 의미합니다.
사용예
[code php;gutter:false] function print_chain($names) {
$chain = classchain($names);
$str = $indent = "";

foreach ($chain as $classname) {
$str .= "$indent$classname\n";
$indent .= ".";
}

print $str;
}

include("./lib.hwooky.php"); // 후키라이브러리(0.1.0)

$argv = array(
"path-to-classfile" => "./class"
);

$father = & newobject("Bank", $argv);
$mother = & newobject("Bank", $argv);
$son = & newobject("Bank", $argv);

$argv["path-to-classfile"] = "./class/logic";

$o1 = & newobject("Group", $argv);
$o2 = & newobject("Group", $argv);
$o3 = & newobject("Group", $argv);

print("<P>----클래스 Bank의 상속관계----</P>");
print_chain("Bank");
print("<P>----클래스 Group의 상속관계----</P>");
print_chain("Group"); [/code]
위와 같은 경우의 한 예를 보면 아래와 같이 출력될 것입니다. 여기서 클래스 Bank는 부모클래스 clsArray, clsString, clsDate로부터 상속되었다고 가정하였으며, 클래스 Group는 부모클래스 Check, Serialize로부터 상속되었다고 가정하였습니다.
----클래스 Bank의 상속관계----

clsArray
.clsString
..clsDate
...Bank

----클래스 Group의 상속관계----

Check
.Serialize
..Group

Posted by 방글24