세셔너함수(0.2.0, 0.2.1)의 설계개념
세셔너함수를 정의한 파일의 소스코드를 살펴보면 세셔너 함수들이 내부적으로 호출하고 있는 객체를 생성하기 위한 클래스가 다소 장황하게 작성되어 있습니다. 객체지향프로그래밍의 추상클래스라는 개념을 도입하여 작성되어 있어서 그렇게 보일 것입니다. 그러나 추상클래스 개념을 잘 활용한다면 많은 이점을 가져다 줄 것입니다.
사용자 함수의 구조
사용자가 접근할 수 있는 세셔너 함수들은 모두 전역함수를 이용하여 작성되어 있으나, 세셔너 함수가 내부적으로 사용하는 함수들은 sessStatic 라는 클래스에서 생성된 $sessStatic라는 객체를 이용하여 구현되었습니다.
[code php;gutter:false]
function session_start() {
return $GLOBALS["sessStatic"]->prvStart();
}
function session_destroy() {
return $GLOBALS["sessStatic"]->prvDestroy();
}
function session_register($varname) {
return $GLOBALS["sessStatic"]->prvRegister($varname);
}
function session_unregister($varname) {
return $GLOBALS["sessStatic"]->prvUnregister($varname);
}
.
.
. [/code]
return $GLOBALS["sessStatic"]->prvStart();
}
function session_destroy() {
return $GLOBALS["sessStatic"]->prvDestroy();
}
function session_register($varname) {
return $GLOBALS["sessStatic"]->prvRegister($varname);
}
function session_unregister($varname) {
return $GLOBALS["sessStatic"]->prvUnregister($varname);
}
.
.
. [/code]
sessStatic 클래스의 구성
추상클래스 sessStaticID, sessStaticDevice, sessStaticEvent가 최상위 추상클래스 sessStaticAbstract로부터 각각 파생되도록 설계되었으며, 일반클래스 sessStatic가 sessStaticID, sessStaticDevice, sessStaticEvent로부터 다중 상속되도록 설계되어 있습니다. 일반클래스 sessStatic 에 이르러서는 상위클래스에 있는 모든 추상함수가 구현되므로 객체를 생성할 수 있게 되며 세셔너 함수 내에서 $sessStatic 라는 객체를 생성하여 세셔너 함수에서 접근할 수 있도록 하였습니다. PHP에서 다중상속을 지원하지 않으므로 아래와 같이 연속적인 단일상속으로 구현하였습니다.
[code php;gutter:false]
class sessStaticAbstract { // 최상위 추상클래스
......
}
class sessStaticID extends sessStaticAbstract { // 세션ID 관리
......
}
class sessStaticDevice extends sessStaticID { // 저장매체 관리
......
}
class sessStaticEvent extends sessStaticDevice { // 이벤트 처리
......
}
class sessStatic extends sessStaticEvent { // 최하위 일반클래스
......
}
$sessStatic = new sessStatic; [/code]
......
}
class sessStaticID extends sessStaticAbstract { // 세션ID 관리
......
}
class sessStaticDevice extends sessStaticID { // 저장매체 관리
......
}
class sessStaticEvent extends sessStaticDevice { // 이벤트 처리
......
}
class sessStatic extends sessStaticEvent { // 최하위 일반클래스
......
}
$sessStatic = new sessStatic; [/code]
sessStaticAbstract 클래스
추상클래스로 작성된 sessStaticAbstract에는 일반함수와 추상함수가 혼재되어 있습니다. 세션ID 관리함수, 저장매체 관리함수, 이벤트 처리 함수는 추상함수로 작성되어 있어서 하위클래스에서 이들 함수의 몸체가 구현되어 있습니다.
[code php;gutter:false]
//
// 저장매체 관리함수
//
function prvRead() {}
function prvWrite($value) {}
function prvDestroyDevice() {}
function prvGc() {}
function prvStartedDevice($path) {}
//
// 이벤트 처리 함수
//
function prvOnStart() {}
function prvOnEnd() {}
//
// 세션ID 관리함수
//
function prvGetID() {}
function prvSetID($id) {}
function prvStartedID($name) {} [/code]
// 저장매체 관리함수
//
function prvRead() {}
function prvWrite($value) {}
function prvDestroyDevice() {}
function prvGc() {}
function prvStartedDevice($path) {}
//
// 이벤트 처리 함수
//
function prvOnStart() {}
function prvOnEnd() {}
//
// 세션ID 관리함수
//
function prvGetID() {}
function prvSetID($id) {}
function prvStartedID($name) {} [/code]
이와 같이 추상함수의 몸체에는 어떠한 코드도 정의되어 있지 않으며, 이 함수들의 하위클래스에서 그 동작이 구체적으로 명시됩니다.
추상클래스로 상속되는 하위클래스
추상클래스 sessStaticAbstract로부터 상속받는 하위클래스 sessStaticID, sessStaticDevice, sessStaticEvent 는 모두 부모클래스의 모든 추상함수를 구현하지 않기 때문에 일부함수가 계속 추상함수로 남게됩니다. 따라서 이들 하위클래스 모두 여전히 추상클래스라고 할 수 있습니다.
세셔너 함수 소스 코드를 보면 클래스 sessStaticEvent에 prvOnStart(), prvOnEnd()가 빠져 있을 것입니다. 세셔너 함수는 PHP4 세션함수와의 호환성을 목적으로 하기 때문에 PHP4 세션함수에 없는 이벤트 함수를 포함시킬 수 없었습니다. 이것은 객체지향프로그래밍 이론으로 보면 이 부분에서 에러가 발생할 것입니다. PHP 스크립트에서야 이런 개념이 없으니까 두리뭉실 넘어가고 있죠. 아래는 이벤트 함수를 구현한 완전한 StaticEvent 클래스입니다. 참조바랍니다.
[code php;gutter:false]
class sessStaticEvent extends sessStaticDevice {
var $EventPath = ".";
function sessStaticEvent() {
$this->sessStaticDevice();
$this->prvEventFunc();
}
function _sessStaticEvent() {
$this->_sessStaticDevice();
}
function prvEventFunc() {
$eventfile = $this->EventPath."/event.sessioner.php";
clearstatcache();
if (is_file($eventfile)
&& !function_exists("sessioner_onStart")
&& !function_exists("sessioner_onEnd")) {
include($eventfile);
}
}
function prvOnStart() {
if (function_exists("sessioner_onStart"))
sessioner_onStart();
}
function prvOnEnd() {
if (function_exists("sessioner_onEnd"))
sessioner_onEnd();
}
} [/code]
var $EventPath = ".";
function sessStaticEvent() {
$this->sessStaticDevice();
$this->prvEventFunc();
}
function _sessStaticEvent() {
$this->_sessStaticDevice();
}
function prvEventFunc() {
$eventfile = $this->EventPath."/event.sessioner.php";
clearstatcache();
if (is_file($eventfile)
&& !function_exists("sessioner_onStart")
&& !function_exists("sessioner_onEnd")) {
include($eventfile);
}
}
function prvOnStart() {
if (function_exists("sessioner_onStart"))
sessioner_onStart();
}
function prvOnEnd() {
if (function_exists("sessioner_onEnd"))
sessioner_onEnd();
}
} [/code]
일반클래스로 정의되는 최하위클래스 sessStatic
마지막으로 파생된 클래스 sessStatic 에 와서야 비로서 모든 추상함수가 구현됩니다. 세셔너함수 소스코드를 보면 실제로는 sessStaticEvent 클래스에서 모든 추상함수가 구현되지만 향후 세셔너가 확장되면서 또다른 추상함수가 추가될 수 있으며 그 때는 sessStaticEvent 클래스의 하위클래스에서 추가된 추상함수를 구현할 수 있기 때문에 설계 개념상 sessStaticEvent를 추상클래스로 분류하였습니다. 혼동없기를 바랍니다.
sessStatic 를 제외한 모든 상위클래스들은 추상클래스이므로 객체를 생성할 수 없으며 모든 추상함수를 구현한 일반클래스로 작성된 sessStatic를 이용하여 객체를 생성할 수 있습니다. PHP에서는 추상클래스 개념이 없으므로 객체를 생성할 수 있으나, 동작은 제대로 하지 않을 것입니다. 여기서 객체를 생성할 수 없다고 한 것은 추상클래스 개념으로 보았을 때 그렇다는 것으로 객체를 생성해서는 안된다는 것을 의미합니다. 세셔너 함수 파일 최하단에 보면 sessStatic 클래스를 이용하여 객체를 생성하여 내부적으로 사용하고 있습니다.
[code php;gutter:false]
$sessStatic = new sessStatic;
[/code]
'phpclass > 객체정보' 카테고리의 다른 글
{참조}1.참조변수의 생성 (0) | 2001.03.02 |
---|---|
{추상클래스}6.세셔너 확장 (0) | 2000.12.28 |
{추상클래스}4.PHP (0) | 2000.12.28 |
{추상클래스}3.자바 (0) | 2000.12.28 |
{추상클래스}2.C++ (0) | 2000.12.28 |