static 키워드

static 키워드 (Static Keyword)

이 페이지에서는 static 키워드로 정적 메서드와 정적 프로퍼티를 정의하는 방법을 알아봐요. static은 정적 변수 정의, 정적 익명 함수 정의, 늦은 정적 바인딩에도 쓰이니 그 의미들을 함께 참고하세요.

출처: PHP: Static Keyword - Manual

본문

Tip

이 페이지는 static 키워드로 정적 메서드와 프로퍼티를 정의하는 방법을 설명합니다. static정적 변수 정의, 정적 익명 함수 정의, 그리고 늦은 정적 바인딩(late static bindings) 에도 사용돼요. 그 의미들에 대한 정보는 해당 페이지들을 참고하세요.

클래스 프로퍼티나 메서드를 static으로 선언하면 클래스를 인스턴스화하지 않고도 접근할 수 있어요. 인스턴스화된 클래스 객체 안에서도 정적으로 접근할 수 있습니다.

static 메서드 (Static methods)

static 메서드는 객체 인스턴스를 만들지 않고도 호출할 수 있기 때문에, static으로 선언된 메서드 안에서는 의사 변수 $this를 사용할 수 없어요.

Warning

non-static 메서드를 정적으로 호출하면 Error가 발생합니다.

PHP 8.0.0 이전에는 non-static 메서드를 정적으로 호출하는 것이 deprecated 처리되어 E_DEPRECATED 경고를 발생시켰어요.

예제 #1 static 메서드 예제

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
?>

static 프로퍼티 (Static properties)

static 프로퍼티는 스코프 해석 연산자(Scope Resolution Operator)(::)로 접근하며, 객체 연산자(->)로는 접근할 수 없어요.

변수를 사용해서 클래스를 참조하는 것도 가능합니다. 단, 변수의 값은 키워드(예: self, parent, static)가 될 수 없어요.

예제 #2 static 프로퍼티 예제

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}

print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n";

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>

PHP 8에서 위 예제의 출력은 다음과 유사합니다.


foo
foo

Notice: Accessing static property Foo::$my_static as non static in /in/V0Rvv on line 23

Warning: Undefined property: Foo::$my_static in /in/V0Rvv on line 23

foo
foo
foo
foo

더 알아보기