2012-02-07 4 views
-1

이것에 대한 정보를 찾고 있지만 사용 된 문자로 인해 결과를 얻을 수 없습니다.OOP에서 ->와 ::의 차이점

다음과 같은 차이점은 무엇입니까?

$classname->function() 
Classname::function() 

두 번째 예제는 자동으로 개체를 인스턴스화합니까?

+2

이 내용은 수 백만 번까지 보상되었습니다. PHP 책은 어디에 있습니까? –

+0

[참조 - PHP에서이 기호의 의미는 무엇입니까?] (http://stackoverflow.com/questions/3737139/reference-what-dis-symbol-mean-in-php) – hakre

답변

3

비 정적 멤버 (메서드 또는 함수/속성 또는 변수)를 호출하는 데는 앞 (->)이 사용되고 정적 멤버를 호출하는 데는 나중에 (::)가 사용됩니다.

비 정적 :

class foo{ 
    function bar(){ echo 'test'; } 
} 

$foo = new foo(); 
$foo->bar(); 

정적 :

PHP: Static and non Static functions and Objects

더 나은 일을 이해하려면 :

class foo{ 
    static function bar(){ echo 'test'; } 
} 

foo::bar(); // no class initialization needed 

더 많은 정보를 원하시면,이 질문을 참조 개념이 있다면 what static methods are을 확인하고 비 정적과 다른 점을 확인해야합니다.

+0

그건 정말 깨끗한 것입니다. 나를 위해, 나는 그들이 정직한 다른 이름을 가지고 있었는지 몰랐다. 그래도 많은 감사합니다. –

+0

@ShaneJones : 환영합니다. – Sarfraz

1

아니요, 두 번째 것은 정적 메서드를 호출합니다. Check here.

1

두 번째 예제는 개체를 자동으로 인스턴스화하지 않습니다. 따라서 호출의 두 번째 방법에서 함수에서 $ this를 사용하면 다음과 같은 오류가 발생합니다. PHP 치명적 오류 : 객체 컨텍스트가 아닌 경우 $ this를 사용합니다.
일반적으로 비 정적 메서드를 호출하는 데 -> 사용되며 정적 메서드를 호출하는 데 사용됩니다.
하지만 PHP에서는 그렇게 엄격하지 않습니다. 예를 들어 :

error_reporting(E_ALL); 
class A { 
    public static function staticFunc() { 
     echo "static"; 
    } 

    public function instanceFunc() { 
     echo "instance";  
    } 
} 

A::instanceFunc(); // echo "instance" 
$a = new A(); 
$a->staticFunc(); // echo "static" 

성공적으로 실행 위라는 두 가지 방법.
PHP는 항상 새로운 기능을 점진적으로 구현하여 호환성을 보장하기 때문에 세부적인 결과가 초래 될 수 있습니다. 하지만 E_STRICT하기 위해 error_reporting은 수준을 설정 한 경우,이 같은 E_STRICT 오류 발견 할 것이다 :
엄격한 기준 : 비 정적 방법 A : instanceFunc()

이들의 유일한 차이점은 정적으로 호출 할 수 없습니다를 두 가지 방법은 : ::를 사용하여 메소드를 호출 할 때 변수 $ this를 사용할 수 없습니다.

하지만 여전히이 두 가지 방법을 다른 객체 지향 언어처럼 엄격하게 사용하는 것이 좋습니다.
더 자세한 정보를 얻으려면 http://www.php-internal.com/book/?p=chapt05/05-02-class-member-variables-and-methods

관련 문제