5. 범위연산자
본자료는 예전에 제가 운영하던 사이트에서 발췌한 자료로 현재 사용하는 PHP 버젼과는 상이한 내용이 있을 수 있습니다. 다만 그 개념이 거의 동일하므로 개념정리용으로 이용해 주시고 시간이 나는대로 현재 버젼에서의 사용법도 같이 올려드리겠습니다.
범위연산자란?
PHP4에서만 지원되며 클래스와 메쏘드 또는 클래스와 멤버변수를 연결시켜 주는 일로 범위연산자(scope resolver) 뒤에 나오는 메쏘드와 멤버변수의 스코프(사용범위)를 지정하는 일을 하는 것입니다.
클래스명::메쏘드명
클래스명::멤버변수명
범위연산자 사용목적
- 인스턴스되지 않은 클래스의 메쏘드에 접근할 때
- 부모클래스의 메쏘드와 멤버변수에 접근할 때
인스턴스되지 않은 클래스에 있는 메쏘드에 접근할 때
class A {
function example() {
echo "클래스 A에 정의된 메쏘드 example. <br>\n";
}
}
A::example();
아직 클래스 A에 대한 객체가 생성되기 전이지만 범위연산자를 이용하면 일반 함수처럼 실행시킬 수 있습니다.
그러나 클래스 A에 대한 객체가 전혀 생성되어 있지 않으므로 클래스 외부에서 이 함수에 접근할 때는 이 함수 내에 $this 객체를 사용해서는 안됩니다. 물론 일반 함수와 마찬가지로 지역 변수 및 전역 변수를 사용할 수는 있습니다.
class A {
var $var = "초기값";
function example() {
echo "클래스 A에 속한 메쏘드 example. <BR>\n";
echo $this->var . "<BR>\n";
}
}
A::example();
위의 예제를 보면 아직 클래스 A에 대한 객체가 생성되지 않았으므로 멤버변수 $var에 대한 기억장소가 할당되지도 않았고 더구나 초기값을 설정할 수도 없습니다. 그러니 아무리 범위연산자를 이용하여 메쏘드 example()에 접근한다해도 멤버변수 $var의 초기값을 나타낼 수는 없을 것입니다. 실험해 본 바로는 이 경우 $this->var의 값이 NULL로 처리되는 것 같습니다.
부모클래스의 메쏘드에 접근할 때
class A {
function example() {
echo "클래스 A에 정의된 메쏘드 example. <br>\n";
}
}
class B extends A {
function example() {
echo "클래스 B에서 재정의된 메쏘드 example. <br>\n";
A::example();
}
}
$b = new B;
$b->example();
이 예의 출력결과를 보면 아래와 같이 나타날 것입니다.
클래스 B에서 재정의된 메쏘드 example.
클래스 A에 정의된 메쏘드 example.
범위연산자는 클래스가 상속되었을 때 재정의되기 전의 부모클래스에 있는 메쏘드에 접근할 때 유용하게 사용될 수 있습니다.
부모클래스의 멤버변수에 접근할 때
php.net의 문서 설명과는 달리 아직 공개되지 않는 어떤 방법이 있는 지는 모르겠으나 부모클래스의 멤버변수로 접근하는 방법에 대하여는 문서화되지 않은 것 같습니다.