2011-02-03 6 views
5

이 두 코드의 차이점은 무엇입니까? 그것은 정적 키워드를 사용하는 것이 더 PHP 정적 메서드 질문

class something { 

    static function doit() { 
     echo 'hello world'; 
    } 
} 

something::doit(); 

과 동일하지만, static 키워드

class something { 

    function doit() { 
     echo 'hello world'; 
    } 
} 

something::doit(); 

없이

그들은 모두가 같은 일입니까? 정적 메서드를 사용하는 경우 클래스를 인스턴스화하지 않는다는 것을 이해하는 것이 맞습니까? 당신은 당신이 그것을 consturcting하지 않고 클래스 내에서 함수를 호출 할 수 있습니다

$something = new something(); 
$something->doit(); 

정적 함수에 의해 호출한다으로

답변

11

두 번째 예는 기술적으로 잘못된 것입니다 - 당신이 PHP 실제로 오류를 던지고 것을 볼 수 있습니다보고 E_STRICT 오류를 켤 경우.

PHP Strict Standards: Non-static method something::doit() should not be called statically in...

즉, 어쨌든 기능을 호출하게하는 것이 좋습니다.

0

두 번째 비트가 작동하지 않을 수 있습니다. 기본적으로 사용자를 처리하는 클래스가있는 경우 사용자를 기록하는 함수는 정적 함수 여야합니다. 클래스의 생성자에서와 같이 사용자 정보를 수집 할 수 있으며 로그인하지 않고는 그렇게 할 수 없습니다.

+0

PHP4 이하에서 작동합니다. – Arvin

0

두 번째 예가 잘못되었습니다. 정적 메서드를 사용하면 클래스의 인스턴스가 만들어지지 않습니다. 두 번째 예는 다음과 같아야합니다

$x = new something(); 
$x->doit(); 
1

차이점은 클래스의 인스턴스를 만들 필요없이 정적 함수를 사용할 수 있다는 것입니다.

위대한 PHP OOP 초보자 자습서 here을 살펴보십시오. 자세한 내용은 정적 속성 및 메서드 섹션 아래에 나와 있습니다.

0

정적 메소드는 최소한 두 가지 이유로 정지 선언되어야한다
a) 정적 에러 생성 같은 비 정적 메소드를 호출 E_STRICT error_reporting은 사용시 : 키워드 static 가능한 일부 IDE의 필터 방식에 기초하여)
Strict standards: Non-static method something::doit() should not be called statically
B 자동 완료시 실행됩니다.

4

두 번째 예제가 작동하는 이유는 PHP가 객체와 호출 (PHP 4 호환성 외에도)을 처리하는 방식이 너무 복잡하기 때문입니다. 다른 인스턴스 내에서 static 선언 된 메소드를 정적으로 호출하면 다른 클래스의 클래스 메소드에 로컬 인 것처럼 액세스 할 수 있습니다. 이해를 돕기 위해 예를 들어 보겠습니다.

class A { 
    public function foo() { 
     echo get_class($this) . "\n"; 
    } 
} 

class B { 
    public function bar() { 
     A::foo(); 
    } 
} 

$a = new a(); 
$a->foo(); // "A" 
$b = new B(); 
$b->bar(); // "B" 

거기에 무슨 일이 있었는지 보셨습니까? 다른 클래스의 인스턴스에서 A::foo() 메서드 을 호출했기 때문에 PHP는 동일한 인스턴스에있는 것처럼 호출을 처리했습니다. AB 사이에는 아무런 관계가 없으므로 BA입니다. A->foo() 내에서 $this instanceof A (또는 $this instanceof self)을 실행하면 오류가 발생하여 false를 반환합니다. 아주 이례적인 ...

지금은 처음 버그라고 생각했지만 after reporting it으로 설계된입니다. even in the docs입니다.

E_STRICT 모드를 사용하는 경우에는 작동하지 않습니다. 또한 메서드를 static으로 선언하면 작동하지 않습니다.