PHP4의 클래스에는 static 멤버 변수가 없습니다.
그래서 객체를 생성할 필요가 없는 클래스를 만들때 불편합니다.
클래스내에서 공유할 변수가 없기 때문이죠.
클래스내에서 변수를 공유하기 위해 '$this->변수'를 사용하려면 반드시 객체를 생성해야 합니다.
PHP4에서는 다음과 같은 간단한 방법으로 static 멤버 변수를 흉내낼 수 있습니다.
class Test {
function &_getStatic() {
static $aStatic ;
// 초기화
if ( !isset($aStatic) ) $aStatic = array() ;
return $aStatic ;
}
function setName($name) {
$aStatic = &Test::_getStatic() ;
$aStatic['name'] = $name ;
}
function getName() {
$aStatic = &Test::_getStatic() ;
return $aStatic['name'] ;
}
}
Test::setName('A2');
echo Test::getName();
위의 코드에서 핵심은 static $aStatic 입니다.
메소드(함수)내에 선언된 static 변수이므로 함수가 종료되어도 변수의 값은 유지됩니다.
바로 이 점을 이용해서 static 멤버변수가 있는 것처럼 흉내낸 것입니다.
&Test::_getStatic()를 호출해 메소드내의 static 변수의 참조를 받아 사용합니다.
그런데 왜 _getStatic() 메소드내의 static 변수를 배열로 만들어서 사용하는 것일까요?
(배열이 아닌 Object형으로 사용해도 괜찮습니다.)
코드1)
$A = 'a';
$B = &$A; // $B는 'a'를 가르킴
$B = 'b'; // $B는 'b'를 가르킴
echo $A ; // 출력: a
코드2)
$A = array();
$B = &$A; // $B는 $A와 같은 array()를 가르킴
$B[0] = 'b'; // $B[0]는 $A[0]와 같음
echo $A[0] ; // 출력: b
'코드1'과 '코드2'의 차이를 보면 _getStatic() 메소드내의 static 변수를 배열로 만들어서 사용한 이유를 알 수 있습니다.
코드를 직접 실행시켜보는게 더 이상의 복잡한 설명보다 좋을것 같습니다.
이런 꽁수 사용하지 않고 깔끔하게 PHP5로 넘어가고 싶네요. ^^




최근 덧글