2016-11-02 2 views
0

예를 들어 클래스에 MySQL 쿼리를 실행하고이 클래스를 캡슐화하려고합니다. 내가 기능 runQuery()이 공개해서는 안 클래스 메소드에 직접 액세스를 닫으려면PHP에서의 캡슐화를위한 좋은 방법입니까?

class SqlQuery { 

    private $database_connection_obj; 

    public function __construct($dbh) { 
    $this->$database_connection_obj = $dbh; 
    } 

    public function runQuery($query, $params) { 

    //run query implementation... 

    } 

} 

캡슐화와 정보 은폐 수단은 그래서는 비공개 및 민간 기능 runQuery()에 데이터를 전달하는 목적과 방법 exacuteQuery()를 추가합니다.

마지막으로 위의 코드와 똑같이 작동하기 때문에 실제 사용하는 것은 무엇입니까? 개인용 메서드에 전달하기 전에 공용 메서드에서 입력 데이터의 위생이 이루어 지거나이 추가 코드를 작성해야하는 이유는 무엇입니까?

class SqlQuery { 

    private $database_connection_obj; 

    public function __construct($dbh) { 
    $this->$database_connection_obj = $dbh; 
    } 

    public function exacuteQuery($external_query, $external_params) { 
    $this->runQuery($external_query, $external_params); 
    }  

    private function runQuery($query, $params) { 

    //run query implementation... 

    } 

} 
+0

주어진 코드에서'runQuery()'를 감쌀 이유가 없습니다. 왜 그런 종류의 래퍼로 코드를 복잡하게 만들 필요가 있다고 생각합니까? =) –

+0

캡슐화가 무엇인지 예를 들어 주시겠습니까? –

답변

1

주어진 세부 사항에는 차이가 없지만 작업에 따라 다릅니다. 나는 직접적으로 접근 할 수없는 함수를 만들어야 만 할 때 많은 시간을 사용하지만, 그 사용법에 의해서만 사용된다. 코드를 최적화하고 코드 외부의 액세스를 거부합니다. 그렇지 않으면 해로운 매개 변수를 변경할 수 있습니다.

+0

예를 제공해 주시겠습니까? –

+0

나는 종종 이메일을 위해 그것을 사용한다. 특정 조건 후에 만 ​​다른 방법으로 만 보낼 수있는 개인적인 방법이다. 그것은 예제입니다 –

2

주요 아이디어는 클래스가 외부인 (즉, 다른 클래스 또는 함수 클래스의 인스턴스를 잡고는) 내부적으로 어떻게 작동하는지 아무 생각이 없다는 것을 의미 black boxes처럼 보이게하는 것입니다. 그것들에 추상입니다.

쿼리를 내부적으로 처리하는 클래스는 쿼리를 보유하는 클래스에 중요하지 않으며 ->run()을 호출하면 쿼리가 실행되는 방식이나 실행 방식이 달라질 수 있습니다.

쿼리는 특히 저수준 추상화가 상당히 뚜렷하기 때문에 표준 라이브러리 함수/개체를 직접 호출하는 것이 상대적으로 가깝습니다. 그러나 저수준 추상화를 감안할 때 높은 수준의 추상화를 만들 수 있습니다.

예를 들어, UserStore은 내부적으로 SqlQuery 개체를 사용하여 데이터베이스에 User 개체를 가져오고 설정합니다. UserStore을 사용하는 클래스는 UserStore이 내부적으로 SqlQuery 개체를 사용하고 있다는 사실을 알지 못하며 User 개체를 저장하고 검색 할 수있는 개체라는 것을 알고 있습니다.

"숨어서 숨어서"캡슐화하는 것은 실제로 많은 구현 능력에 의존하지 않고 다른 클래스를 사용할 수 있기 때문에 실제로 많은 이점을 제공합니다. 내일 User을 저장하는 방식을 변경하려는 경우 public API이있는 한 UserStore 클래스로 변경하면 나머지 응용 프로그램도 무언가를 인식하지 못합니다 변경되었습니다.

+0

제가 이론을 가지고, 내 질문은 PHP에서 구현에 대한 자세한 내용은 내가 제공 해야하는 첫 번째 또는 두 번째 코드 예제를 말할까요? 왜. –

+0

오, 사과드립니다. 특히, 동일한 서명을 가진 전용 함수에만 위임하는 공용 함수를 만드는 것은 이점이 없습니다.개인 함수에 대한 위임을 사용하여 여러 메소드에서 비슷한 기능을 추상화 할 수 있습니다. 예를 들어 필자가 가지고있는'select()'와'update() '의 공통된 기능은 쿼리를 준비 할 필요가 있다는 것입니다. publics가 호출하여 일부 서비스를 제공하는 개인 기능. –

관련 문제