'분류 전체보기'에 해당되는 글 263건

  1. 2000.05.05 {후키라이브러리}3.라이브러리 함수
  2. 2000.05.05 {후키라이브러리}2.개발
  3. 2000.05.05 {후키라이브러리}1.개요
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
객체지향언어(Object Oriented Programming Language)
C++과 같은 컴파일러가 아닌 스크립트에서 객체지향언어의 클래스를 이용하는 것이 과연 효율적인지, 필요하여 사용한다면 서버의 성능을 필요이상으로 저하시키는 것이 아닌지 등등에 대한 우려로 보통 클래스 사용을 주저하게 됩니다.
그러나 하드웨어가 소프트웨어 발전 속도를 훨씬 앞지르고 있고, 서버 사이드 스크립트도 그 성능이 계속 향상될 것이며, 홈페이지 제작 프로젝트가 점점 다양해지고 대형화되어 가고 있는 시점에서 소프트웨어의 생산성은 상대적으로 점점 중요해 질 수밖에 없지 않을까요? 이러한 면에서 살펴보면 클래스의 사용은 꼭 필요하지 않나 하는 생각이 듭니다.
그러나 PHP에서 클래스를 사용할 때의 문제는 PHP 스크립트의 클래스가 C++이나 smalltalk와 같은 객체지향 프로그래밍 언어와 같이 클래스 구현이 충실하지 못하다는 것입니다. 실험해 본 바에 따르면 생성자(constructor) 실행이 불완전하고, 다중상속(multiple inheritance)과 같은 것을 지원하지 않는 것 같습니다. 자바에서도 다중상속을 지원하지 않기는 하지만 대신 인터페이스 기능이 있어 다중상속 역할을 대신할 수 있지요.
후키라이브러리 개발
"클래스 관리용 라이브러리"(이하 "후키라이브러리")에서는 생성자 실행을 본래의 객체지향언어와 같은 개념을 도입하여 최상위 부모클래스 생성자로부터 최하위 파생클래스 생성자까지 순서대로, 소멸자는 그 반대의 순서로 실행하도록 했으며, 일반적인 다중상속뿐 아니라 동일한 조상클래스(ancestor class)를 가진 클래스의 다중상속도 지원할 수 있도록 작성되었습니다. 또한 생성된 모든 객체에서 공유할 수 있는 정적 데이터멤버를 지원합니다.
지원되는 기능
1. 다중상속(multiple inheritance) 지원
2. 동일한 조상클래스(ancestor class)를 가진 클래스의 다중상속 지원
3. 최상위 클래스로부터 모든 파생클래스의 생성자(constructor)를 순차적으로 실행
4. 최하위 클래스로부터 모든 부모클래스의 소멸자(destructor)를 순차적으로 실행
5. 정적 데이터멤버(static data member) 지원
사용자 함수
1. classdefine : 클래스 정의 함수
2. newobject : 객체 생성 함수
3. classchain : 클래스 상속관계 반환 함수
3개의 함수 중에 실제적으로 클래스를 관리하는데 사용되는 함수는 2개 뿐이며 나머지 한 개의 함수 classchain는 단지 클래스의 상속관계를 알고자 할 때 사용하게 되므로 개발단계에서만 사용하게 됩니다.
예약된 전역변수
후키라이브러리 내에서만 사용되는 전역변수입니다.
$_HWOOKY

Posted by 방글24
PHP 스크립트에서 지원하는 객체지향언어의 클래스 기능을 보완하여 좀 더 편하게 클래스를 개발 및 관리를 할 수 있도록 클래스 관리를 위한 함수를 라이브러리 화하였습니다. 본인도 "후키라이브러리"를 이용하여 프로그램을 개발해 보니 나름대로 편리한 점이 많아 여러분과 공유하고자 이 자리를 마련했습니다.
버그 발견, 개선 요구, 기능 추가......
라이브러리에 버그가 있거나 새로이 개선되기를 바라는 점, 추가되기를 바라는 기능 등이 있으면 "Q&A 게시판"을 이용해 의견을 주세요:-)
후키라이브러리 저작권
파일명    : lib.hwooky.php
버전       : 0.1.0
작성일    : 2002.2.12
사용환경 : >= PHP 4.0.4
제작자    : 황우경(Wookyung Hwang) - 후키(hwooky)
전자우편 : hwooky@phpclass.com
홈페이지 : http://www.phpclass.com
사용권한 :
  본 라이브러리는 공개 라이브러리로 누구나 자유롭게 사용할 수  있으나, 연습용이 아닌 실무에 사용할 때는 혹시 발생할 지  모르는 문제점에 대해 충분히 테스트한 후에 사용하여 주시기  바랍니다. 본 라이브러리의 사용으로 인한 어떠한 피해에도  제작자는 책임을 질 수 없습니다.

Posted by 방글24