Forum und email

::

Caution

다음은 PHP 4 이후에서만 적용되는 글이다.

때때로 원래 클래스의 함수와 변수를 참조하거나 아직 어떤 인스턴스도 갖지 않는 클래스의 함수를 참조할 필요가 있다. 이런 목적으로 :: 연산자를 사용한다.

<?php
class A
{
    function 
example()
    {
        echo 
"I am the original function A::example().<br>\n";
    }
}

class 
extends A
{
    function 
example()
    {
        echo 
"I am the redefined function B::example().<br>\n";
        
A::example();
    }
}

// 여기서는 클래스 A의 객체가 존재하지 않는다.
// 이 코드는
//   I am the original function A::example().<br>를 출력한다.
A::example();

// B 클래스의 객체를 생성한다.
$b = new B;

// 여기서는 다음과 같이 출력할것이다.
//   I am the redefined function B::example().<br>
//   I am the original function A::example().<br>
$b->example();
?>

위 예제 코드는 클래스 A의 함수 example()이 호출된다. 그러나 클래스 A의 객체가 존재하지 않는다. 그래서 $a->example()와 비슷한 코드를 쓸수 없다. 대신에 '클래스 함수'인 example()을 호출한다. 즉, 그 클래스의 객체가 아니라 클래스 자체의 함수를 호출하는 것이다.

클래스 함수는 존재하지만, 클래스 변수는 존재하지 않는다. 실제로, 호출의 모든 시간동안 전혀 객체가 없었고 따라서, 클래스 함수는 어떤 객체 변수도 사용할수 없다 (그러나 로컬 변수와 전역 변수는 사용할수 있다) 그래서 $this를 전혀 사용하지 않는다.

위 예제 코드에서 클래스 B는 함수 example()을 재선언한다. ::을 사용하여 클래스 A의 example 구현에 대해 특별히 참조하지 않으면, 클래스 A의 원래 선언은 가려지게 되고 더이상 가용하지 않다. 이와 같이 하려면 A::example()라고 써야 한다 (다음섹션에서 설명한대로 parent::example() 라고 써야 한다).

이런 환경에서는 현재 객체가 있고 그 객체는 객체 변수를 갖을수도 있다. 따라서 객체 함수 안에서 사용할때에는 $this와 객체 변수를 사용해야 할것이다.