2009-08-03 2 views
14

나는 PHP 클래스에 액세스하는 두 가지 방법 "-"과 "->"을 이해합니다. 언젠가는 저를 위해 일하는 것처럼 보이지만, 다른 사람은 그렇지 않습니다. 왜 그런지 이해하지 못합니다.PHP 클래스 : :: 대 -> -?

각각의 이점은 무엇이며 어떤 것을 사용하기에 적합한 상황입니까?

+0

이 주제를 읽을 수 있습니다 : Thinker

+3

나쁜 링크, http://stackoverflow.com/questions/151969/php-self -vs-this – Thinker

답변

44

::클래스 수준 속성이며, ->개체 수준 속성입니다. 속성이 클래스에 속하는 경우 속성이 에 클래스의 인스턴스를 속하는 경우, ::

를 사용하면 클래스를 선언 할 때 ->

class Tester 
{ 
    public $foo; 
    const BLAH; 

    public static function bar(){} 
} 

$t = new Tester; 
$t->foo; 
Tester::bar(); 
Tester::BLAH; 
+0

그래서, 예를 들어 ... 라이브러리 클래스가 있고 그 안에, 내 MySQL (기본적으로 싱글 톤)에 연결을 반환하는 함수가 있다면 library :: connect와 같은 작업을 수행하여 참조해야합니다.(); $ libraryObject-> connect();가 아니라. ? – johnnietheblack

+0

또한 객체를 사용하면 다른 함수로 전달해야하지만 정적 연산자를 사용하면 범위 문제를 피할 수 있습니까? 미리 감사드립니다! – johnnietheblack

+1

@jonnietheblack : 당신이하고 싶은 일의 문제가 없습니다. 전달할 수있는 Object를 사용하고 싶다면, 복제, 복제 등을 할 때 클래스로부터 ('new Class'를 사용하여) 객체를 인스턴스화 한 다음, 객체 내부의 것들을'- '로 사용하십시오. Object를 인스턴스화하지 않고 클래스 함수를 "있는 그대로"호출하려는 경우에는'::'을 사용합니다. 정말 클래스의 사용법에 달려 있습니다. 하나의 방법이 다른 것보다 좋지는 않습니다. – deceze

8

"::"기호는 정적 키워드로 선언 된 개체의 메서드/속성에 액세스하기위한 것이며 "->"는 인스턴스 메서드/속성을 나타내는 개체의 메서드/속성에 액세스하기위한 것입니다. 간단히 말해

+4

'정적 키워드 사용'이란 말은 약간 잘못되었습니다. 부모 메소드와 상수에 접근하는 데는 모두'::'연산자가 필요하며 둘 다 정적으로 선언되어서는 안됩니다. –

3

를 사용

, 그것은 기본적으로이다 '공전'. :: 연산자와 범위를 사용하여 해당 클래스의 모든 메소드에 액세스 할 수 있습니다. 당신을 당신이 new 키워드를 사용하여이 클래스의 인스턴스를 만들 때,

class lib 
{ 
    static function foo() 
    { 
     echo "hi"; 
    } 
} 
lib::foo(); // prints hi 

을 지금이 내가 lib에 클래스를 만드는 경우 내가 원하는 곳, 내가 그것을 액세스 할 수 있으며이 globaled 할 필요가 없습니다 의미 메서드 및 값에 액세스하려면 ->을 사용하십시오. 특정 클래스 인스턴스를 참조하기 때문입니다. ->inside of으로 생각할 수 있습니다. IE (당신이 정적 키워드를 제거해야합니다, 주) : 또한 모든 정적 기능도 클래스의 인스턴스하지만 주변이 아닌 다른 방법을 사용하여 호출 될 수 있음을 주목해야한다

class lib 
    { 
     function foo() 
     { 
      echo "hi"; 
     } 
    } 
$class = new lib; 
$class->foo(); // I am accessing the foo() method INSIDE of the $class instance of lib. 
+0

첫 번째 예는 E_STRICT에서 오류를 발생시킵니다. 정적이지 않은 메서드 lib :: foo()는 정적으로 호출하면 안됩니다. – gnarf

+0

업데이트가되었지만 설명서에 오류가 발생하지는 않았지만 업데이트되었습니다. –

1

.

class Foo 
{ 
    public static function bar(){} 
} 

$f = new Foo(); 
$f->bar(); //works 
Foo::bar(); //works 

을 그리고 이것은하지 않습니다 :

그래서이 작품

물론
class Foo 
{ 
    protected $test="fddf"; 
    public function bar(){ echo $this->test; } 
} 

$f = new Foo(); 
$f->bar(); //works 
Foo::bar(); //fails because $this->test can't be accessed from a static call 

정적 방법으로 정적 메서드 호출에 자신을 제한해야, 인스턴스를 인스턴스화뿐만 아니라 비용 때문에 기억뿐만 아니라 많은 의미가 있습니다.

이 설명은 주로 그것이 왜 당신을 위해 몇 시간 일했는지 설명하기위한 것입니다.

+0

Foo :: bar(); 두 번째 예제에서는 실제로 작동합니다. – MrHus

+0

인스턴스가 없으면이 메서드에서 액세스 할 수있는 비 정적 변수가 없으므로 의미가 없습니다. 너 그거 해봤 니? 그렇다면 어떤 버전을 사용하셨습니까? 정적 키워드가 작동하는 것 외에도 메소드에 변경 사항이 적용되지 않습니다. –

+0

정적 컨텍스트에서 동적 변수를 사용하는 동적 메서드를 호출 할 때만 중단된다는 것을 알았습니다. PHP는 일부 측면에서 명확한 코딩 스타일이 부족합니다. - / –

0

소싱 객체 지향 프로그래밍 WikiPedia - Class

하는 클래스 오브젝트를 생성 할 청사진 으로 사용되는 프로그래밍 언어 구조이다. 이 청사진 은 생성 된 개체가 모두 공유하는 상태와 동작을 설명합니다. 클래스에 의해 생성 된 개체는 클래스의 인스턴스이며 해당 인스턴스를 만든 클래스 은 해당 개체의 유형으로 간주되는 일 수 있습니다. e.지. "Fruit"클래스에 의해 생성 된 객체의 유형은 "Fruit"입니다.

:: 연산자는 static 키워드를 사용하여 PHP에서 정의 된 클래스 메소드 및 속성에 액세스합니다. 클래스 const도 액세스 할 수 있습니다. ::

-> 연산자는 클래스 인스턴스의 메서드 및 속성에 액세스합니다.

함수가 인스턴스에서 작동하면 ->을 사용하게됩니다. 클래스 자체에서 작동하면 ::

::을 사용하면 parent 함수를 호출 할 수 있습니다. 한 클래스가 다른 클래스를 상속하는 경우 부모 클래스의 메서드를 재정의 한 다음 parent::function()

3

PHP를 사용하여 호출 할 수 있습니다.이 점에서 혼란스러운 점은 this입니다.

무엇이 혼동 스럽습니까? :: 기호로 정적이 아닌 함수를 호출 할 수 있다는 점도 있습니다. 자바에서 왔을 때 이것은 매우 이상합니다. 그리고 내가 처음에 그것을 보았을 때 확실히 놀랐습니다. 예를 들어

:

class Car 
{ 
    public $name = "Herbie <br/>"; 

    public function drive() 
    { 
     echo "driving <br/>"; 
    } 

    public static function gas() 
    { 
     echo "pedal to the metal<br/>"; 
    } 
} 

Car::drive(); //will work 
Car::gas(); //will work 

$car = new Car(); 
$car->drive(); // will work 
$car->gas(); //will work 

echo $car->name; // will work 
echo Car::$name; // wont work error 

정적 볼 수 있듯이 PHP는 매우 느슨합니다. 그리고 -> 및 :: 기호를 사용하여 모든 함수를 호출 할 수 있습니다. 그러나 호출 할 때 차이점이 있습니다 :: 인스턴스에 대한 $ this 참조가 없습니다. manual의 예 1을 참조하십시오.