2014-12-19 3 views
0

필자는 이전에 PHP를 사용 해본 적이 없으므로 PHP의 인터페이스에 대해 배우고 있습니다.하지만 실제로 인터페이스를 이해하고 있기 때문에 구현 된 클래스가 어떻게 구성되어 있는지 확인하기 위해 인터페이스를 설명합니다.Do implemenations는해야 할 일을 단지 설명합니까?

class mysql { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

를 ... 그것은 기술적으로 동일 할 것입니다 : 당신이 두 개의 서로 다른 데이터베이스에 대한 두 개의 서로 다른 클래스를 만들고 싶었다 경우

그래서 예를 들어, 당신은 할 수

interface database { 

     public function connect() { 

     } 

     public function getData() { 

     } 

} 

class mysql implements database { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB implements database { 

    public function connect() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

... 내가 맞습니까? 인터페이스를 사용하면 아래와 같은 일을하지 않아 데이터베이스를 쉽게 변경할 수 없게됩니다.

class mysql { 

    public function connect_mysql() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

class mongoDB { 

    public function connect_mongo() { 
     // code here 
    } 

    public function getData() { 
     // code here 
    } 

} 

그 이유는 무엇입니까?

+0

정확합니다. 객체 인터페이스를 사용하면 클래스가 구현해야하는 메소드를 지정하는 코드를 만들 수 있습니다. 이러한 메소드의 처리 방법을 정의하지 않아도됩니다. – daker

+1

꽤 정확하지만'interfaces' 함수는 본문을 가질 수 없으므로'public function getData() {}'대신'public function getData();를 선언하십시오. – Jite

+0

네, 알아 냈습니다 :-D 명심하십시오, 하나의 클래스는 많은 다른 유형의 인터페이스를 가질 수 있습니다 – donald123

답변

1

인터페이스는 코드가 의존 할 수있는 것을 표준화하고 동시에 특정 구현과 분리합니다. 와우, 그건 복잡해 보입니다. 이 인터페이스의 사용자의 관점에서 그것을 설명하기 쉽다 :

function (MyDatabaseInterface $db) { 
    $db->connect(); 
    $db->getData(); 
} 

유형의 힌트 인터페이스를 사용의 큰 부분이다. 이 함수는 인수가 MyDatabaseInterface의 인스턴스 여야 함을 선언합니다. 즉, implements MyDatabaseInterface 인 모든 객체를 선언합니다. implements MyDatabaseInterface만큼이나 특정 대상이 무엇인지는 전적으로 귀하에게 달려 있습니다. MyDatabaseInterfaceconnect()getData() 메서드를 지정 했으므로 전달되는 모든 개체에 이러한 메서드가 있고 호출 할 수 있는지 확인할 수 있습니다.

주변의 다른 방법은,이 함수를 보라 :

/** 
* @return MyDatabaseInterface 
*/ 
function foo() { 
    ... 
} 

이 기능이 내부적으로 무엇 관련이 있지만, 그것은 즉,이 유형 MyDatabaseInterface의 객체를 반환 할 몇 가지 객체를 선언 그 implements MyDatabaseInterface. 당신이 그것을 호출 할 때, 당신은 당신이 의지 할 수 알고 :이 기능은 mysql의 또는 mongoDB의 인스턴스를 반환 할 수 있습니다

$bar = foo(); 
$bar->connect(); 
$bar->getData(); 

, 당신의 관심 none입니다. 인터페이스에서 선언 된 것을 그대로 사용하면 어떤 특정 객체를 사용하더라도 관계없이 코드가 작동합니다.

글자 그대로 인터페이스는 코드 사이의 인터페이스를 정의합니다. 특정 코드를 특정 클래스에 묶지 않고 코드가 다른 코드에서 안전하게 호출 할 수있는 메소드를 정의합니다. 특정 객체는 인터페이스에 정의 된 것보다 더 많은 메소드를 정의 할 수 있습니다. 인터페이스는 클래스 구조를 선언하지 않습니다. 클래스는 한 번에 여러 인터페이스를 구현할 수 있습니다. 즉, 모든 인터페이스의 모든 메소드를 구현합니다. 각 개별 인터페이스는 객체에서 호출 할 수있는 가능한 모든 메소드의 서브 세트를 나타냅니다.

"클래스"가 아닌 인터페이스에서 수행 할 수있는 특정 "작업"또는 "능력"을 설명해야합니다. Iterable처럼 인터페이스 이름이 "-able"로 끝나는 경우에는 좋은 신호입니다. 그런 다음 클래스는 여러 인터페이스를 구현하여 "할 수있는 모든 작업"을 설명 할 수 있습니다.위의 예제 코드에서와 같이 특정 지점에서 특정 "능력"을 가진 함수 인수를 요구할 수 있습니다. 이렇게하면 코드의 일부가 서로 분리되고 분리되므로 코드를보다 유연하고 재사용하며 변경할 수 있습니다.


실용적인 시나리오의 경우 대규모 프로젝트에서 작업하는 더 큰 개발 팀을 상상해보십시오. 여러 하위 팀이 있으며 각 팀은 응용 프로그램의 다른 부분을 담당합니다. 그들은 모두 앉아서 일반적인 계획을 세웁니다. 어떤 시점에서이 별도 팀의 코드는 서로 상호 작용해야합니다. 그들은 선행이 인터페이스를 정의 할 수 있습니다

  • "나는 나에게 사용자 자격 증명을 제공합니다 코드에 대한 몇 가지 메소드를 호출해야합니다."
  • "좋아요, 그러면 foobar를 얻을 수있는 개체를 나에게 줄 필요가 있습니다."
  • "이제 우리는 조의 구성 요소와 대화하여 baz 데이터를 보내야 할 것입니다."
  • ...

그들은 그들이 다음, 어떤 코드가 작성되기 전에 인터페이스에서 서로 이야기를 꺼 자신의 일을해야하는 다른 방법을 정의 할 수 있습니다. 그들은 인터페이스가 어떻게 생겼는지 이미 결정했기 때문에 아직 작성되지 않은 코드에 의존 할 수 있습니다. 조는 실제 코드를 모의 객체로 대체 할 수 있습니다. Joe는 여전히 실제 코드를 망치고 있으며, 조 (Joe)가 나오면 나중에 바꾸기 만하면됩니다. 그리고 그 기술들은 모두 혼자서 작업하는 경우에도 유용합니다.