2011-09-16 4 views
2

나는 순간에 일부 레거시 코드 작업 및 설명하지 않는 것 php.net을 이상한 클래스/함수 호출을 우연히 발견하고 내가 본 적이 있어요 전 :PHP 함수 클래스의 메소드 혼란

if(security::instance()->check_client()) { 

클래스 보안이 있으며 해당 클래스 내에 instance 및 check_client라는 함수가 있습니다. 그러나 이것은 하나의 명령문에서 두 가지 기능을 호출하여 하나를 다른 명령문으로 전달하거나 결과가 제시하는 것 이상을 전달하는 것처럼 보입니다. 누군가 나를 위해 이것을 명확히 할 수 있습니까?

+0

에서 [static 키워드] (HTTP와 유사한 것을 의미 : //php.net/manual/en/language.oop5.static.php) (정적 함수에 사용)은 [PHP Manual] (http://php.net/manual/en/language.oop5.static .php). – hakre

답변

1

이것은 singleton pattern

의 고전적인 구현 나는 수업 security은 다음과 같습니다 가정 :

class security { 
    private static $instance = null; 

    private function __construct() {}   

    public static function instance() { 
     if (null === self::$instance) 
      self::$instance = new security(); 

     return self::$instance; 
    } 

    public function check_client() { /* do something */ } 
} 

그것이 무엇을하는 정적 메소드 인스턴스가 급 보안의 인스턴스를 반환한다는 것입니다; 어떤 당신이 당신의 exemple에서와 check_client() 메소드에 대한 호출을 체인 수있는 이유 security::instance() instanceof security === true

security::instance()->check_client() 

$secu = security::instance(); 
$secu->check_client(); 
+0

안녕하세요, Alfwed,이 철저한 설명에 대해 매우 감사드립니다. – Marius

3

실행은 다음과 같이 진행한다 :

  • 우선, security 클래스 static methodinstance()이 실행이
  • 후 (대부분)이 security 클래스의 인스턴스를 리턴
  • 상기 check_client 방법 반환 된 객체에서 실행됩니다.

따라서 security::instance()은 객체이므로 메서드를 호출 할 수 있습니다.

+0

보안 클래스의 인스턴스를 반환한다는 것을 어떻게 알 수 있습니까? :) – hakre

+0

그 코드에있는'check_client' 메소드가 OPs 문을 기반으로 한 것 같습니다. – naivists

1

보안 : 예()

정적 호출 (그래서 아마 정적 메서드)입니다

http://php.net/manual/en/language.oop5.static.php멤버 메소드의 check_client을 가지고 어떤 클래스의 인스턴스를 반환

()

그래서 개체를 반환하면 해당 개체에 대한 공용 메서드를 호출 할 수 있습니다.

0

나는 (기본 코드를 모르기 때문에) 가정 할 수는 있지만 설명 할 수는 있습니다.

우선 함수는 객체를 반환 할 수 있습니다.

security::instance()->check_client() 

같은 동일합니다 : 그런 다음 객체가 반환 된 객체에 함수를 호출 내가 생각할 겁니다 것과

$securityInstance = security::instance(); 
$securityInstance->check_client(); 

다음, instance의 이름에 의한는 A의 security::instance() 반환 인스턴스 보안 클래스, 아마도 싱글 톤 구현 또는 응용 프로그램 구성을 기반으로하는 팩토리.