2012-05-21 3 views
1

나는 PHP 디자인 패턴을 읽고있는 중이, 나는이 코드를 보았다 :PHP ClassName :: staticFunction() -> publicFunction()이 작업은 무엇입니까?

<?php 
require_once("DB.php"); 

class DatabaseConnection 
{ 
    public static function get() 
    { 
    static $db = null; 
    if ($db == null) 
     $db = new DatabaseConnection(); 
    return $db; 
    } 

    private $_handle = null; 

    private function __construct() 
    { 
    $dsn = 'mysql://root:[email protected]/photos'; 
    $this->_handle =& DB::Connect($dsn, array()); 
    } 

    public function handle() 
    { 
    return $this->_handle; 
    } 
} 

print("Handle = ".DatabaseConnection::get()->handle()."\n"); 
print("Handle = ".DatabaseConnection::get()->handle()."\n"); 
?> 

나는 지난 2 print 문을 제외한 모든 것을 이해합니다. 나는 그것으로 주위를 어지럽 혔지 만, 나는 정적 함수가 어떻게 든 비 정적 함수를 호출하는 것을 이해하지 못한다.

나는 내가 할 수있는 통지 한 다음 호출하는 것보다 다른,

DatabaseConnection::get()->handle()->get(); 

난 그냥이 무엇을하고 있는지 이해가 안 :

DatabaseConnection::get()->get()->get()->handle(); 

을하지만 난 그렇게 같은 것을 할 수 없습니다 get 함수를 호출 한 다음 handle 함수를 호출합니다.

+0

나는 그것을 지금 본다. get() 함수는 객체를 반환하고 해당 객체는 handle이라는 함수와 get()이라는 함수를 가지고 있습니다. 그래서 저는 Database :: get() -> get() -> get() -> handle()을 할 수있었습니다. 나는 바보가된다. 나는 점 표기법을 그리워. – Dreadfulgravy

답변

3

이 작동합니다. 이 유형의 구성은 일반적으로 DatabaseConnection의 인스턴스 하나만 사용할 수 있도록 시행하기 때문에 일반적으로 Singleton이라고합니다.

생성자가 비공개이므로 이미 클래스에 있지 않으면 명시 적으로 을 호출 할 수 없습니다. 싱글 톤을 사용하는 솔루션에는 객체 인스턴스화시 null이 아닌 값으로 설정된 속성 (초기 값 null)이 있습니다. 속성이 null 인 경우 'getInstance'(또는이 경우 get) 메소드는 새 객체 만 반환합니다.

+0

나는 그것의 많은 것을 이해한다. 나는 대부분 그저 get() -> handler() 부분에 대해 궁금해했다. 그것이 매뉴얼에서 읽을 수있는 이름이나 장소를 가지고 있습니까? – Dreadfulgravy

+0

실제로 무엇이 반환되는지를 보는 것 외에는 그렇지 않습니다. 두 예제에서 첫 번째 것은 DBConnection 객체에서'-> handle()'메서드를 호출하는 것입니다. 두 번째 방법에서는 간단한 문자열에 대해'-> get()'메서드를 호출하려고 시도하고있다. 참고로 저는 PHP가 첫 번째 예제에서 구문을 허용한다는 것에 약간 놀랐습니다. –

+0

첫 번째 문장에서 내 질문에 대답했습니다. 이해하지 못해 죄송합니다. – Dreadfulgravy

1

DatabaseConnection::get()DatabaseConnection의 인스턴스를 만들고이를 반환합니다. 정적 함수는 새로운 객체를 반환하기 때문에 다음과 같이도 쓸 수 있도록

...

DatabaseConnection::get()->handle(); 

...

$db = DatabaseConnection::get(); 
$db->handle(); 
+0

지금 받으십시오. get()은 handle이라는 함수가있는 객체를 반환합니다. 원래 생각했던 것보다 더 의미가 있습니다. – Dreadfulgravy

관련 문제