2007년 7월 24일 화요일

3. Using PHP classes effectively

1. visibility: 메소드나 프로퍼티에 대해서 접근 권한 설정이 가능합니다.
  • public
  • private
  • protected - 디폴트로 설정됩니다. 부모나 자식 클래스에서만 접근이 가능합니다.
2. getter/setter 메소드 __get()__set()를 사용하여 접근 메소드를 만들면 getProperty()나 setProperty() 메소드 같은 메소드를 만들 필요없이 다음과 같은 형태로 사용할 수 있습니다.
$ClassInstance->property;
※ getter/setter의 경우 실험적으로 도입된 성격이 강하다고 합니다.

3. final - 자식 클래스에서 클래스 또는 메소드의 오버라이딩을 막습니다. (deprecated를 나타내기 위해서 사용할 수 있습니다.)

4. ::(double colon)은 클래스의 변수, 메소드 또는 상수를 접근하기 위해서 사용됩니다.
$product = Product::find($productCode);
5. 클래스 메소드는 static을 사용하여 정의합니다.
static public function encryptPassword(...){}
클래스 밖에서는 ::를 사용하여 접근하나 클래스안에서는 self를 사용하여 접근이 가능합니다.
self::encryptPassword();
※ 클래스 메소드, 변수에 대한 접근은 $this를 사용할 수가 없습니다.
※※ 언제 클래스 메소드를 사용하는가?
  • Creation methods and factory methods
  • Finder methods
  • Procedural code
  • Replacement for constants
6. 상수(constant)는 const로 정의합니다. 상수를 정의할 때는 $를 사용하지 않습니다.

7. abatract 선언을 사용할 수 있습니다.
  • abstract로 정의된 클래스 또는 메소드를 바로 사용할 때 에러가 발생합니다.
  • abstract로 정의된 메소드가 포함되어 있는 클래스는 abstract 클래스가 되어야 합니다.
abstract class HtmlDocument{
    public function getHtml() {...}
    abstract public function getContent();
}
8. CLASS Type Hints, 인자로 넘어오는 파라미터의 타입을 체크할 수 있습니다.
public function addDocument(Document $document) {}
  • Documnet의 인스턴스 또는 이를 상속받은 클래스의 인스턴스의 경우 정상통과가 되나 문자열(string)이나 다른 객체(Object)를 통과시킬 때 경고(Warning)을 발생시킵니다.
  • 그러나, 통과된 후에Document에 정의되어 있지 않은 메소드를 호출해도 에러메시지가 발생하지는 않습니다.
  • 객체들과 배열들만 체크가 가능하며 일반적인 데이타 타입(plain data type)을 체크하지는 않습니다.(예를 들면 문자열)
  • Type Hint의 단점으로는 체크를 위해 사용된 클래스가 변경되는 경우 관련된 Type Hint를 모두 변경해줘야 하는 의존(dependency)이 생긴다는 점입니다.
  • Type Hint가 실패한 경우 nonExistentmethod()가 호출됩니다.
9. instanceof를 사용해서 타입 체크가 가능합니다.
public function addDocument($document) {
    if(!($document instanceof Document)) {
        ...
    }
}
10. 인터페이스(interface)
interface Template {
   public function __constuct();
   public function execute();
   ...
}
자바의 인터페이스와 비슷합니다.
  • 클래스는 여러 인터페이스를 동시에 구현하는 것이 가능합니다 .
  • 동적언어에서는 인터페이스가 없는 것과 반대로 php에서는 이를 지원합니다.
    • 생성비용으로는 인터페이스 파일을 여는 비용을 제외하고는 거의 없습니다.
    • 디자인을 좀 더 명확하게 나타내고 실수를 막을 수 있습니다.
  • abstract와 동일한 역할을 합니다.
  • 두 개의 인터페이스를 구현하는 경우, 각각의 인터페이스가 동일한 메소드를 갖지 못합니다.
  • 인터페이스는 다른 인터페이스를 상속할 수 있습니다.
  • 생성자(__construct())를 인터페이스에서 선언할 수 있습니다.)
클래스에서 인터페이스를 구현하도록 선언하는 것도 비슷합니다.
class SmartyTemplate implements Template()
출처: Manning, PHP in Action(Objects, Design, Agility) 보면서 요약한 내용입니다.

댓글 없음:

댓글 쓰기