"; } } class B { function printmsg() { echo "Class is B위 코드에서 보다시피 A와 B라는 간단한 두 개의 클래스를 생성했다. 그리고 각각은 printmsg()라는 함수 하나만을 포함하고 있다. 그리고 나서, 각 클래스의 인스턴스를 생성했고 $toobox라는 배열에 저장을 하였다. 우선 위의 것은 넘어가고, 레퍼런스 함수를 통해 전달하는 것부터 알아보자. 여러 곳에서 레퍼런스 함수에 의한 리턴이 쓰일 수 있지만, 여기서 생성할 함수는 오직 하나의 파라미터(이번 경우엔 간단히 하기 위해 불린 값(boolean value)을 사용하였다.)만을 받아들이고, 아래처럼 위에서 생성한 객체중 하나를 가리키는 레퍼런스를 리턴한다.
"; } } $toolbox[] = new A(); $toolbox[] = new B(); ?>
printmsg(); $anothertool =& selectObject(false); $anothertool->printmsg(); ?>그렇다면 우리가 만든 selectObject()란 함수는 정확히 어떤 역할을 하는가? 함수 선언을 살펴보면, 이 함수는 파라미터로 하나의 불린 변수(boolean parameter) $which를 사용하고 있다. 그런데 함수 이름 앞에 있는 &는 도대체 무엇일까? 이 기호는 이 함수가 완전한 변수 대신에 PHP 레퍼런스를 리턴한다는 것을 정의한다. 함수 내부의 코드를 살펴보면, 이 함수가 앞에서 이미 정의한 $toolbox 배열에 저장되어 있는 하나의 객체를 리턴하는 것을 알 수 있다. 즉, 파라미터 값에 따라 우리가 정의한 객체중의 하나의 레퍼런스를 리턴하는 것이다.
value = $val; } function printval() { echo "The value of this class is "{$this->value}"이 객체의 생성자에서 전역 변수인 $myref가 $this (PHP에서 정의되어 있는 객체 자신을 가리키는 레퍼런스)를 참조하고 있고, 멤버 변수인 $value가 파라미터 $value 값을 갖는 것에 대해 주목하라. 이 클래스의 인스턴스가 생성될 때, 이 인스턴스를 가리키고 있는 전역 변수 $myref도 또한 생성된다. 따라서 아래와 같은 코드가 실행된다고 하면,
"; } function setval($val) { $this->value = $val; } } ?>
printval(); $myref->printval(); ?>다음과 같이 출력될 것이다.
The value of this class is "FooBar!" The value of this class is "FooBar!"만약 이 클래스의 인스턴스에서 멤버 변수를 변경하려 한다면 어떻게 될까? 우리가 지금까지 배운 바에 기초하면 $myvar->setval()이나 $myref->setval()를 통한 변경은 두 가지 모두 영향을 줄 것이다. 하지만, 아래와 같은 코드가 실행된다면,
setval("Changed the value from $myvar"); $myvar->printval(); $myref->printval(); ?>결과 값은 다음과 같을 것이다.
The value of this class is "Change the value from $myvar" The value of this class is "FooBar!"왜 둘 모두의 값이 바뀌지 않았을까? 답은 객체가 처음 생성될 때 있다. PHP 4에서는 new 구문이 기본적으로 레퍼런스를 리턴하지 않는다. 오히려 $myvar 오브젝트가 생성될 때, $myref 변수에 의해 참조되는 것과는 다른 복사본이 리턴된다. 두 개가 같은 객체의 서로 다른 인스턴스이기 때문에, 그들의 변수는 완전히 독립적인 것이다. 이것 말고 우리가 처음에 바랐던 동작을 원한다면, 다음과 같이 객체를 생성할 때 레퍼런스 결합 문법을 사용해야 한다.
printval(); $myref->printval(); $myvar->setval("Now it works"); $myvar->printval(); $myref->printval(); ?>그리고 출력은 다음과 같다.
The value of this class is "Foobar!" The value of this class is "Foobar!" The value of this class is "Now it works" The value of this class is "Now it works"오늘 기사의 정리
참고 자료
이전 글 : C# 인쇄 기능
다음 글 : 이아스님이 제공하는 자바 헤드라인
최신 콘텐츠