written: Sep 30 2005
last modified: Oct 11 2005
유효범위(scope)와 가시범위(visibility)
"www.php.net >> online document > Classes and Objects(PHP5)"를 보면 "Visibility"라는 항목에 PPP 접근제한자(Private/Protected/Public access modifier)를 설명하고 있습니다. 그래서 우선 "visibility"라는 용어부터 이해하고 넘어가도록 하겠습니다.
거의 모든 국내서적에서 "visibility"를 "가시성(可視性)"이라고 번역하고 있습니다. "가시성"이라는 용어자체에는 문제가 없습니다만 본 문서에서는 "visibility"라는 용어를 좀 더 쉽게 이해하기 위하여 "가시성" 대신에 "가시범위"라는 용어를 사용하겠습니다. 그리고 가시범위를 좀 더 잘 이해하기 위해서 유효범위(scope;스코프,사용범위)를 먼저 설명하겠습니다.
유효범위(scope)
선언된 멤버(변수, 메쏘드)가 프로그램의 어떤 부분에서 접근할 수 있는지 나타내는 것을 유효범위(scope)라고 합니다.
[code php;gutter:false]
<?php
$global_var;
class my_class {
var $class_var;
function my_function() {
static $local_var;
}
}
?>
[/code]
위의 예제에서 $global_var는 프로그램의 모든 곳에서 접근할 수 있으므로 $global_var의 유효범위는 프로그램 전체가 되며, $class_var는 클래스 my_class에서만 접근할 수 있으므로 $class_var의 유효범위는 클래스 my_class가 되며, $local_var는 메쏘드 my_function에서만 접근할 수 있으므로 $local_var의 유효범위는 메쏘드 my_function이 됩니다.
(수정/추가 2005.10.11)
\ 유효범위 ------------------ 변수 \ |
전역영역 | 다른 클래스 |
클래스 my_class |
메쏘드 my_function |
---|---|---|---|---|
$global_var |
O |
O △ |
O △ |
O |
$class_var |
X |
X |
O |
O |
$local_var |
X |
X |
X |
O |
- 메쏘드 my_function이나 다른 전역함수 내에서 전역변수를 사용하기 위해서는 global이라는 키워드로 미리 전역변수임을 선언해주어야 합니다.
- 전역변수를 클래스에 정의된 변수에 직접 사용할 수는 없습니다. 그러나 생성자를 이용하면 클래스 유효범위에서 사용하는 것과 같은 효과를 얻을 수 있습니다(이러한 이유로 O를 X로 수정하려다가 △로 수정합니다).
가시범위(visibility)
유효범위가 멤버를 기준으로 그 멤버를 사용할 수 있는 프로그램 영역이라 한다면, 가시범위는 그 반대로 프로그램의 특정영역을 기준으로 그 영역에서 사용할 수 있는 멤버가 무엇인가를 나타내는 것입니다.
위의 예제를 가지고 변수에 대한 가시범위를 나타내면 전역영역의 가시범위는 $global_var이고, 클래스 my_class의 가시범위는 $global_var, $class_var이고, my_function의 가시범위는 $global_var, $class_var, $local_var입니다.
\ 가시범위 ---------------- 프로그램영역 \ |
$global_var |
$class_var |
$local_var |
---|---|---|---|
전역영역 |
O |
X |
X |
다른 클래스 |
O △ |
X |
X |
클래스 my_class |
O △ |
O |
X |
메쏘드 my_function |
O |
O |
O |
유효범위와 가시범위는 보는 관점이 다를 뿐이지 그 본질에 있어서는 동일한 개념입니다.
'phpclass > 객체모델' 카테고리의 다른 글
{PHP5 객체모델}03.Private 멤버 (0) | 2005.10.11 |
---|---|
{PHP5 객체모델}02.PPP 접근제한자 (0) | 2005.10.11 |
{Zend 엔진 2.0 설계초안}13.다중 상속 (0) | 2002.12.21 |
{Zend 엔진 2.0 설계초안}12.이름공간 (0) | 2002.12.21 |
{Zend 엔진 2.0 설계초안}11.클래스 상수 (0) | 2002.12.21 |