PHP 정적 함수


108

PHP의 정적 기능에 관한 질문이 있습니다.

내가 수업이 있다고 가정합시다

class test {
    public function sayHi() {
        echo 'hi';
    }
}

내가 test::sayHi();하면 문제없이 작동합니다.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); 잘 작동합니다.

1 등석과 2 등석의 차이점은 무엇입니까?

정적 함수의 특별한 점은 무엇입니까?


15
php7의로서 당신은 정적 비 정적 메서드를 호출 할 수 없습니다
산 제이 야다 브

답변:


153

첫 번째 클래스에서 sayHi()실제로 정적 방법으로 호출 인스턴스 방법이며 때문에 그것으로 도망 sayHi()을 의미하지 않는다 $this.

정적 함수는 클래스의 인스턴스가 아니라 클래스와 연결됩니다. 따라서 $this정적 컨텍스트에서 사용할 수 $this없습니다 ( 객체를 가리 키지 않음).


22
이제 비 정적 메서드의 정적 호출이 작동하지만 더 이상 사용되지 않습니다. 인스턴스 메서드에 대해이 구문을 사용하는 데주의하십시오!
Jet

1
그래서 그들이 그것을 정적 함수라고 말하는 이유는 무엇입니까? 동적 데이터 흐름과 동적 출력이있는 다중 인스턴스가 없기 때문입니다. 그냥 나를 안내하십시오. @ chaos
sun

22

간단히 말해 정적 함수는 자신이 속한 클래스와 독립적으로 작동합니다.

$ 이것은 이것이이 클래스의 객체임을 의미합니다. 정적 함수에는 적용되지 않습니다.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9
Ok 저는 PHP 마법사는 아니지만 정적 함수에 전달되는 변수 ( 'hello')가 명시 적으로 'Hi'로 덮어 쓰이지 않습니까? 의미는 줄 인쇄 test1 :: sayHi ( 'hello'); 'hello'를 반환하지 않지만 'hi'를 반환합니까?
Fnord23 2015

6
이 대답은 엉성하고 (정적 함수의 효과는 어떤 클래스에 있는지에 따라 달라질 수 있음 ) 예제는 요점을 명확하게 나타내지 않습니다.
reinierpost

별로 좋은 예는 아닙니다. $ hi = '안녕하세요'; 주어진 인수를 덮어 쓰고 정적 선언과는 아무 관련이 없습니다. 나는 이것을 다음과 같이 고칠 것이다 : self :: $ hi = $ hi; 정적이 아닌 것처럼 작동합니다. $ this-> 대신 self ::로 클래스 변수에 액세스 할 수 있습니다.
GotBatteries

20

전체적인 차이점은 $this정적 함수 내부에서 제공 되지 않는다는 것입니다. 을 사용하려고 $this하면 Fatal error: Using $this when not in object context.

음, 좋습니다. 다른 한 가지 차이점 E_STRICT은 첫 번째 예 에서 경고가 생성된다는 것입니다.


1
내가 처음 사용할 때 내가 경고가 없으며 내가 php7에있어
ashkan nasirzadeh

정적 함수 안에 $ this가없는 이유는 무엇입니까? 이것의 구조적 논리는 무엇입니까? 감사.
Lucas Bustamante 2018 년

@LucasBustamante : $this현재 개체를 참조합니다. 정적 함수에는 현재 개체가 없습니다. 함수는 해당 클래스의 개체 인스턴스에 대한 참조 또는 필요없이 클래스에 존재합니다.
혼돈

3

비 정적 메서드를 정적으로 호출하면 E_STRICT 수준 경고가 생성됩니다.


2

간단히 말해서 두 번째 경우에는 $ this와 같은 객체가 없습니다. 정적 메서드는 객체 인스턴스가 아닌 클래스의 함수 / 메서드이기 때문입니다.


1
단순히 클래스 함수를 정의하는 방법은 정적입니까? 다른 멋진 사업은 없나요? 그래서 당신은 그것이 "정적"이 아니라 "class_method"라고 불렸다면 더 의미론적일 것이라고 말하는 것입니까?
ahnbizcad

1

예제 (PHP 5.3.5)를 시도한 후 함수를 정의하는 두 경우 모두 $this연산자를 사용 하여 클래스 함수를 작업 할 수 없다는 것을 발견했습니다 . 그래서 아직 차이점을 찾을 수 없었습니다. :(

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.