Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 정적(Static) 속성과 메서드 완벽 이해하기

개요

PHP 클래스에서 static 키워드로 선언된 속성과 메서드는 일반 인스턴스처럼 객체를 생성한 뒤 -> 연산자로 접근할 수 없습니다. 정적 멤버는 객체 없이도 클래스 자체를 통해 직접 접근할 수 있다는 것이 핵심 특징입니다. 또한 클래스 내에서 정적 항목의 기본 가시성(visibility)은 public입니다.

정적 속성(Static Properties)

클래스 외부에서 정적 속성에 접근하려면 범위 해결 연산자(scope resolution operator)::를 클래스 이름과 함께 사용해야 합니다. 흥미롭게도 클래스 이름으로 평가되는 문자열 변수를 통해서도 정적 속성에 접근할 수 있습니다.

<?php
class testclass{
    static $name="test";
}
echo testclass::$name;
$var="testclass";
echo $var::$name;
?>

같은 클래스 내부의 메서드 안에서 정적 속성을 사용하려면, 인스턴스 속성에 접근할 때 쓰는 -> 연산자 대신 self 키워드를 사용합니다.

<?php
class testclass{
    static $name="test";
    public function test(){
        echo self::$name;
    }
}
$obj=new testclass();
$obj->test();
?>

부모 클래스에 선언된 정적 속성을 자식 클래스의 메서드 안에서 참조해야 할 때는 parent 키워드를 범위 해결 연산자와 함께 사용하면 됩니다.

<?php
class testclass{
    static $name="test";
    public function test(){
        echo self::$name;
    }
}
class myclass extends testclass{
    public function mytest(){
        echo parent::$name;
    }
}
$obj=new myclass();
$obj->mytest();
?>

정적 메서드(Static Methods)

메서드가 static으로 선언되면 의사 변수(pseudo-variable)인 $this를 사용할 수 없습니다. 따라서 정적 메서드 내부에서는 해당 클래스의 인스턴스 속성에 접근하는 것이 불가능합니다. 정적 메서드는 객체 생성 없이 클래스 이름과 범위 해결 연산자(::)를 이용해 호출합니다.

다음 예제에서 클래스는 정적 속성 $count를 가지고 있으며, 생성자(constructor)가 실행될 때마다(즉, 객체가 생성될 때마다) 값이 1씩 증가합니다. 그리고 클래스 내부에는 이 정적 속성의 값을 조회하는 정적 함수가 정의되어 있습니다.

예제 코드

<?php
class testclass{
    static $count=0;
    function __construct(){
        self::$count++;
    }
    static function showcount(){
        echo "count = " . self::$count;
    }
}
$a=new testclass();
$b=new testclass();
$c=new testclass();
testclass::showcount();
?>

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

count = 3

이처럼 정적 속성은 모든 객체가 공유하는 상태를 저장하는 데 유용하며, 위 예제에서는 세 개의 객체가 생성되었기 때문에 카운트가 3이 된 것을 확인할 수 있습니다.