2013-11-24 2 views
1

정적 및 비 정적 방법의 혼합 사용을 테스트하기위한 작은 테스트 시나리오를 작성했습니다. public 메서드를 정적 메서드로 호출하면 엄격한 경고가 생성됩니다. 아마도 정적 메서드를 public 메서드로 호출하면 비슷한 경고가 생성 될 것이라고 생각하게되었지만 그렇지 않았습니다.정적 메서드를 공용 메서드로 호출 할 수 있습니까?

정적 메서드를 정적 메서드로 호출해도 괜찮습니까? 그렇게하는 데 어떤 결과가 있습니까?

<?php 
class TestS { 
    static function _testS() { 
    echo("Hello Static<br>\n"); 
    // Strict warning: Non-static method TestS::_tS() should not be 
    // called statically in TestS::_tS() 
    self::_tS(); 
    } 
    public function _tS() { 
    echo("tS<br>\n"); 
    } 
    public function _testP() { 
    echo("Hello Public<br>\n"); 
    self::_tP(); 
    } 
    static function _tP() { 
    echo("tP<br>\n"); 
    } 
    public function _testSP() { 
    $this->_tP(); 
    } 
} 

$test = new TestS(); 
echo("///////////<br>\n"); 
$test->_testP(); 
echo("///////////<br>\n"); 
TestS::_testS(); 
echo("///////////<br>\n"); 
$test->_testSP(); 
echo("///////////<br>\n"); 
+0

정적 메서드를 사용하지 마십시오. –

+0

환경 설정 이외의 정적 방법을 사용하지 않을 것이라는 확실한 주장이 있습니까? 저는 작은 유틸리티 함수를 많이 사용하여 전역 범위를 깨끗하게 유지하기 위해 정적 메서드/클래스를 사용하고 싶습니다. – forsvunnet

+0

정적 메서드 및 변수 **의 문제는 ** 전역 적이라는 것입니다. –

답변

1

는 공공 방법으로 정적 메서드를 호출 확인인가?

이론적으로는. 정적 메서드는 어느 곳에서나 $this을 참조하지 않기 때문에 정적 또는 인스턴스 메서드로 호출 할 때 작동합니다.

그렇게하는 데 어떤 영향이 있습니까?

호출하는 메소드의 종류를 명시하는 것이 좋습니다. 코드를 다시 볼 때 인스턴스 메서드 내에서 parent::method()을 사용하는 예외적 인 예외와 함께 호출하는 방식 때문에 정적 인 메서드를 정확히 알 수 있습니다.

정적 방법을 사용하지 않는 것이 좋습니다. 코드가 많으면 코드 냄새를 나타내며 리팩토링해야합니다.

관련 문제