2009-12-29 2 views
0

어제까지 최대 동일하지만 클래스에 액세스하는 두 가지 방법이 동일합니다. 구글이주의를 끌었다. 클래스 메소드를 직접 호출하는 것이 아니라 클래스의 새 인스턴스를 정의하여 클래스에 액세스하는 것의 차이점은 무엇입니까?액세스 클래스 방법 간의 차이점

나는 내가 묻는 것을 실마리가 없지만 내가 도와 줄 몇 가지 예를 제시 할 수 있기 때문에 나는 단지 묻는 것을 거의 이해하지 못했다.

PHP에서 클래스를 사용하는 동안 클래스의 인스턴스를 정의하고 해당 변수에서 메소드에 액세스했습니다. 다음은 그 예입니다 :

<?php 
class Myclass 
{ 
    public function my_method() { 
     return "This is my method"; 
    } 
} 
$myclass = new Myclass(); 

echo $myclass->my_method(); // output: This is my method 
?> 

그 차이점은 무엇입니까?

<?php 
class Myclass 
{ 
    public function my_method() { 
     return "This is my method"; 
    } 
} 

echo Myclass::my_method(); // output: This is my method 
?> 

나는 충분히 명확했다. 간단한 시놉시스가 아니라면 - 클래스의 새 인스턴스를 만든 다음 "$ class-> mymethod();"로 클래스의 메서드를 호출하거나 직접 메서드를 호출하는 것의 차이점은 무엇입니까? "Myclass :: mymethod(); "?

미리 감사드립니다.

답변

0

먼저 클래스와 개체, 클래스 및 클래스 인스턴스 간의 차이점을 이해해야합니다.

예를 들어, 클래스가 "원"인 경우 인스턴스는 "이 특정 원"일 수 있습니다. Class Circle에는 $ center 및 $ radius 멤버가있을 수 있습니다. 모든 포인트에 이러한 멤버가 있습니다. 그러나 이들의 가치는 모든 점에서 다릅니다.

$class->mymethod()은 인스턴스 메서드 (예 : $ circle-> Length())를 호출합니다. 당신은 물체의 특정 인스턴스에 뭔가를 말하고 있습니다. 이 메소드는 클래스 멤버 (인스턴스에 속한 변수)에 액세스 할 수 있습니다. PHP에서는 키워드 $this을 사용하여 이러한 인스턴스 변수에 액세스 할 수 있습니다.

예를 들어 $circle->Length()return 2*Pi*$this->radius으로 구현 될 수 있습니다.

Circle :: Length()라고하면 어떻게됩니까? 아무것도. 이것은 static methods을 호출하는 구문입니다. 네가 어떤 동그라미를 말하지 않았기 때문에. 서클 클래스는 길이가 없습니다.

static 메서드는 static 키워드로 선언됩니다. 그것은 무엇이든간에 어떤 클래스의 인스턴스에도 접근 할 수 없습니다. 그것은 전체적으로 클래스가하는 것입니다.

예를 들어 실제로 원을 만들지 않고 원의 길이를 계산하려면 클래스 원에 static function calculateLength($radius)이있을 수 있습니다. Circle::calculateLength($myRadius)

제 생각에는 비 정적 인 것들을 이해할 때까지 정적 방법에 대해서 생각하지 않아야합니다.

+0

좋은 설명이지만, 모든 대답과 php.net의 일부 문서를 읽은 후에도 여전히 흐릿합니다. 나는 이것이 내가 지금 이해할 수없는 것들 중 하나라고 생각한다. 그리고 갑자기 나는 현현을 얻게 될 것이고 나중에 나 자신을 바보라고 부를 것이다. – David

3

:: 표기법은 함수를 정적으로 호출하는 데 사용됩니다. 추가 정보를 원하시면 PHP 매뉴얼에서 해당 페이지를 참조하십시오

본질적으로 정적 함수는 클래스 외부의 일반 함수와 같습니다. 이 함수는 호출 될 때 객체 컨텍스트에 있지 않으므로 의사 변수 $this을 사용할 수 없습니다. E_STRICT 경고를 던지는해야

class SomeClass { 

    static public function StaticFunction() { 
     ... 
    } 

} 
2

MyClass에 :: my_method() 호출을 당신이 전화하는거야 같이 : 당신은 같은 그것을 호출에 계획하는 경우 함수가 static로 선언해야한다는

주 문맥에서 비 정적 메소드.

정적 메서드는 인스턴스가 아닌 클래스에 속하는 메서드입니다. 이 메소드는 참조가 없기 때문에 비 정적 변수에 액세스 할 수 없습니다 (비 정적 변수는 클래스가 아닌 인스턴스에 속하기 때문에).

Java와 C#을 사용한 후, E_STRICT가 기본적으로 로깅되지 않았기 때문에 이것이 E_WARNING 또는 E_ERROR로 간주되지 않는다는 것에 약간의 불안감이 있습니다.

0

클래스의 인스턴스를 만들 때 내 생각에는 객체를 만들고 있으므로 해당 객체에서 메서드/속성을 호출합니다.

정적 호출을 통해 메서드/속성을 호출 할 때 클래스 자체를 호출합니다.

그래서이 같은 경우 :

class acs { 
    public $var = 'bla';   
} 

을 한 다음

$a = new acs(); 
$b = new acs(); 

echo $a->var . '<br>'; 
echo $b->var . '<br>'; 

$a->var = 'hey'; 
$b->var = 'Yooo'; 

echo $a->var . '<br>'; 
echo $b->var . '<br>'; 

을 이제 같은 값으로 시작 클래스 ACS의 두 인스턴스를 가지고 있지만 지금은 서로 다른 값을 가지고있다.

하지만이 경우이 : 다음

class acs { 
    public static $var = 'bla';  
} 

그리고 할 : 당신이하고있는 것은

$a = new acs(); 
$b = new acs(); 

echo $a->var . '<br>'; 
echo $b->var . '<br>'; 


$a->var = 'hey'; 
$b->var = 'Yooo'; 

echo $a->var . '<br>'; 
echo $b->var . '<br>'; 

echo acs::$var; 

:

  • 당신은 이전과 인스턴스를 만들 수 있습니다.

  • 공용 속성 var가 존재하지 않으므로 아무 것도 울리지 않습니다.

  • 당신은

  • 당신은 '즐'하고 변경되지 않은 (정적 속성 VAR 에코 당신은 그 값을 에코 두 인스턴스
  • 의 공유 재산 VAR를 작성 (헤이와 유))

희망이 있습니다.

관련 문제