2011-09-02 2 views
2

예를 들어이 클래스는 다음과 같습니다.정적 호출 대 동적 호출 : 어느 것이 더 나은 성능을 갖고 있습니까?

<?php 
Class Example 
{ 
    public function example_function() 
    { 
    echo "example code"; 
    } 
} 
?> 

성능 측면에서 다음 중 가장 적합한 것은?

1)

Example::example_function(); 

2)

$example = new Example(); 
$example->example_function(); 

이들의 차이점은 무엇입니까?

+4

그들은 그것들의 성능을 비교할 이유가 전혀 다릅니다. (그것은 꽤 가깝습니다). Btw와 같은 종류의 질문에는 거의 대답이 없습니다. ** 귀하의 코드 **에서 병목 현상을 파악하려면 프로파일 러를 실행하여보십시오. – zerkms

+0

@zerkms 확실합니까? –

+1

나는 무엇을 확신합니까? 그것은 최적화 될 필요가있는 것이 아닙니다. 정적 호출은 동적 호출과는 다른 특성을가집니다. 교환 할 수 없으므로 비교할 필요가 없습니다. – zerkms

답변

7

성능 문제는 아닙니다. 정말로 그렇지 않습니다. 차이가 있다면 차이가 거의 없기 때문에 측정하기가 쉽지 않습니다.

정적 메서드로 클래스를 디자인해야하는 경우 정적 메서드를 사용하십시오.
클래스를 인스턴스화해야하는 경우 개체 메서드를 사용할 수 밖에 없습니다.

성능과 관련이없는 클래스 디자인 결정 사항입니다.

+0

차이를 측정하기 위해 실제로 수행 된 벤치 마크가 있다면 방황합니다. 모두는 단지 그들이 거의 같다고 말하고 있지만, 나는 그들이 그렇다고 생각하지 않습니다. – samayo

+1

벤치 마크를 만드는 것은 간단합니다. 그러나 여전히 무의미합니다. 이 둘은 완전히 다른 것들을하고 완전히 다른 목적으로 사용되기 때문에 실제로 선택의 여지가 없습니다. 사과와 오렌지를 비교하려고합니다. 그래서 그것은 의의가 있습니다. – deceze

+1

사례를 예로 들어 보겠습니다. 안전한 파일 업로드 클래스를 만들고 클래스를 정적으로 만들면 속도면에서 성능이 약간 향상 될 것으로 기대하고 있습니다. 비록 그 속도가 측정하기에는 너무 소량이라 할지라도, 클래스 다이내믹을 만드는데 그다지 많은 것을 얻을 수 없다는 것을 고려하면 여전히 긍정적 인 것입니다. 그래서, 내 질문은, 클래스는 동적 대신에 정적 클래스를 사용하지 못하도록하는 단위 테스트가 필요 없다는 것입니다. – samayo

3

클래스 요소에 액세스하려는 경우 클래스 인스턴스를 통해 함수에 액세스해야합니다. 정적 메소드 호출 (Example::example())를 통해 액세스 할 때 예를 들어,이 정당하지 않은 : 그래서

class Example 
{ 
    private $str = 'example'; 

    public function example() 
    { 
     echo $this->str; 
    } 
} 

, 문제는 성능에 대한 것이 아니라 약 당신은 어떻게 당신의 클래스를 사용하는 겁니다 및/또는 함수.

실제로 PHP OOP 문서를 읽어야합니다.

+0

정적 메서드 내부에서 클래스 속성에 액세스 할 수 있습니다. 속성 자체도 정적이어야합니다. –

+1

예 .. 나는 세부 사항에 들어 가지 않기를 원했다. (PHP OOP 문서가 꽤 철저하다는 것을 나열하기에는 너무 많은 경우가있다.) –

+1

예제는 클래스를 인스턴스화하는 한 완전히 "합법적"이다. . 그것에 대해 정확히 불법적 인 것이 무엇인지 자격을 얻을 수 있습니다 ...? – deceze

3

실행 속도면에서 차이는 두드러 질 것입니다. 그러나 그들은 아주 다른 두 가지 일을합니다.

Example::example_function();

는 글로벌 단일 개체로 클래스를 치료한다. 예제 개체는 하나 뿐이며 클래스가 포함 된 곳이라면 어디에서나 호출 할 수있는 public 메서드가있을 수 있습니다.

$example = new Example(); 
$example->example_function(); 

은 Example 클래스의 인스턴스를 생성합니다. 즉, 많은 예제가 다른 속성으로 실행될 수 있습니다.

이 두 가지 방법은 프로젝트의 성격과 달성하려는 성격에 따라 크게 달라집니다.

0

다른 의견에서 제안하는 것처럼 성능에 대한 질문은 2 차적인 것으로 보입니다. 실적을 향상시킬 수있는 다른 결정과 전략이 있지만 그 중 하나는 순수한 디자인에 관한 것입니다.

나는 좋은 디자인 대 나쁜 디자인의 질문입니까? 그리고 나는 나 자신을 설명한다.

OO가 필요없는 경우 OO를 사용하는 이유는 무엇입니까? 그 말은 객체를 생성 한 다음 표준 절차 함수처럼 접근하는 것이 바보처럼 보인다는 의미입니다.

나는 그 주제에 대해 조사하고 있었기 때문에 내 의견에 대해 논쟁을 불러 일으켜서 이것에 관해 (긍정적이거나 부정적인) 피드백을 받았다.

관련 문제