패턴이란 특정 컨텍스트(패턴이 적용되는 상황. 반복적으로 일어날 수 있는 상황) 내에서 주어진 문제(해당 컨텍스트 내에서 이루고자 하는 목적 또는 제약조건)에 대한 해결책(일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인)이다.

“어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받을 수 있는 문제에 봉착했다면, 그 제약조건 내에서 목적을 달성하기 위한 해결책을 찾아낼 수 있는 디자인을 적용한다.”

1. 범주별 분류

생성 관련 패턴(싱글턴, 추상 팩토리, 팩토리 메소드, 빌더, 프로토타입)

객체 인스턴스 생성을 위한 패턴으로, 클라이언트와 그 클라이언트에서 생성해야 할 객체 인스턴스 사이의 연결을 끊어주는 패턴.

행동 관련 패턴(템플릿 메소드, 커맨드, 어터레이터, 옵저버, 스테이트, 스트래티지)

클래스와 객체들의 상호작용 하는 방법 및 역할을 분담하는 방법관 관련된 패턴.

구조 관련 패턴(데코레이터, 컴포지트, 프록시, 퍼사드, 어댑터)

클래스 및 객체들을 구성을 통새허 더 큰 구조로 만들수 있게 해주는 것과 관련된 패턴.

2. 클래스, 객체 분류

■  클래스 패턴(템플릿 메소드, 팩토리 메소드, 어댑터)

클래스 사이의 관계가 상속을 통해서 어떤 식으로 정의되는지를 다룬다. 클래스 패턴에서는 컴파일시에 관계가 결정.

■  객체 패턴(컴포지트, 데코레이터, 프록시, 스트래티지, 브리지, 퍼사드, 커맨드, 이터레이터, 옵저버, 프로토타입, 스테이트, 추상 팩토리, 싱글턴)

객체 사이의 관계를 다루며, 객체 사이의 관계는 보통 구성을 통새허 정의. 객체 패턴에서는 일반적으로 실행중에 관계가 생성되기 때문에 더 동적이고 유연함.

3. 패턴으로 생각하기

■  최대한 단순하게

“이 문제에 어떤 패턴을 적용할까?"가 아닌 "어떻게 하면 단순하게 해결할 수 있을까?"에 초점.
가장 단순하고 유연한 디자인을 만들기 위해서 패턴을 사용해야 한다면 그때 패턴을 적용하면 된다.

■  디자인 패턴은 만병 통치약이 아니다

패턴을 사용할 때는 그 패턴을 사용했을 때 설계한 디자인의 다른 부분에 미칠수 있는 영향과 결과에 대해 주의 깊게 생각해 봐야 한다.

■  패턴이 필요한 경우

– 구상중인 디자인상에 적용이 적합하다 확신이 들 경우.
– 시스템의 어떤 부분이 변경될 것이라고 예측할 수 있는 경우.

■  리팩터링과 패턴

행동이 아닌 구조를 개선하는데 목적.

■  패턴 제거

시스템이 점점 복잡해지면서 처음에 기대했던 유연성이 전혀 발휘되지 않게 되는 경우 패턴을 과감하게 제거해 버리는게 최선책일 수 있다. 즉, 패턴을 사용하지 않은 간단한 해결책이 더 나을 것 같다 싶을 때 패턴을 제거하면 된다.

필요한 경우에만 적용하라

지금 당장 변화에 대처하기 위한 디자인을 만들어야 한다면 패턴을 적용해서 그 변화에 적응해야 한다. 하지만 꼭 필요하지 않음에도 불구하고 괜히 패턴을 추가하는 것은 피해야 한다. 괜히 시스템만 복잡해지고 사용률도 현저히 낮거나 없을 수 있다.

4. 패턴을 대하는 마음가짐

초보자들은 언제나 패턴을 사용하는 경향이 있다. 그 과정에서 패턴을 쓰는 연습을 하면서 다양한 경험을 쌓을 수 있는 측면에서는 좋다. 하지만 그러다 보면 반드시 그렇지만은 않다는 것을 배우게 된다. 어떤 디자인이든 될 수 있으면 단순하게 만들어야 한다는 것을 터득하게 된다.
반드시 확장성이 필요한 경우에만 패턴을 써서 조금 복잡하게 만드는 것이 좋다.

경험이 늘어 중급자 수준에 오르게 되면 어떤 상황에서 패턴이 필요하고 어떤 상황에서 패턴이 필요하지 않은지를 파악할 수 있다. 여전히 잘 맞지 않는 패턴을 억지로 적용하려는 경향이 보이긴 하지만, 그 과정에서 정형적인 패턴이 적합하지 않은 상황에서는 패턴을 적당히 변형시켜서 써야 한다는 것을 깨닫게 된다.

달인의 경지에 오르면 패턴을 자연스럽게 구사할 수 있다. 더 이상 패턴을 사용하는 것에 얽매이지 않는다. 문제를 가장 효과적으로 해결할 수 있는 해결책을 찾는데 주안점을 둘 뿐이다. 이는 객체지향 원칙들을 종합적으로 고려함이다. 자연스럽게 패턴이 필요한 상황에 이르면 패턴을 적당히 변형시켜서 적용한다. 그리고 달인들은 유사한 패턴 사이의 관계를 확실히 파악하여 관련된 패턴들의 용도 사이의 미묘한 차이점을 잘 이해하고 활용한다.
달인의 마음가짐은 초보자의 마음자짐이기도 하다. 디자인 과정에서 의사 결정을 할 때 패턴에 대한 지식이 그리 큰 영향을 끼치지 않기 때문이다.

5. 주요 패턴 정리

패턴이란 특정 컨텍스트(패턴이 적용되는 상황. 반복적으로 일어날 수 있는 상황) 내에서 주어진 문제(해당 컨텍스트 내에서 이루고자 하는 목적 또는 제약조건)에 대한 해결책(일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인)이다.

“어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받을 수 있는 문제에 봉착했다면, 그 제약조건 내에서 목적을 달성하기 위한 해결책을 찾아낼 수 있는 디자인을 적용한다.”

1. 범주별 분류

생성 관련 패턴(싱글턴, 추상 팩토리, 팩토리 메소드, 빌더, 프로토타입)

객체 인스턴스 생성을 위한 패턴으로, 클라이언트와 그 클라이언트에서 생성해야 할 객체 인스턴스 사이의 연결을 끊어주는 패턴.

행동 관련 패턴(템플릿 메소드, 커맨드, 어터레이터, 옵저버, 스테이트, 스트래티지)

클래스와 객체들의 상호작용 하는 방법 및 역할을 분담하는 방법관 관련된 패턴.

구조 관련 패턴(데코레이터, 컴포지트, 프록시, 퍼사드, 어댑터)

클래스 및 객체들을 구성을 통새허 더 큰 구조로 만들수 있게 해주는 것과 관련된 패턴.

2. 클래스, 객체 분류

■  클래스 패턴(템플릿 메소드, 팩토리 메소드, 어댑터)

클래스 사이의 관계가 상속을 통해서 어떤 식으로 정의되는지를 다룬다. 클래스 패턴에서는 컴파일시에 관계가 결정.

■  객체 패턴(컴포지트, 데코레이터, 프록시, 스트래티지, 브리지, 퍼사드, 커맨드, 이터레이터, 옵저버, 프로토타입, 스테이트, 추상 팩토리, 싱글턴)

객체 사이의 관계를 다루며, 객체 사이의 관계는 보통 구성을 통새허 정의. 객체 패턴에서는 일반적으로 실행중에 관계가 생성되기 때문에 더 동적이고 유연함.

3. 패턴으로 생각하기

■  최대한 단순하게

“이 문제에 어떤 패턴을 적용할까?"가 아닌 "어떻게 하면 단순하게 해결할 수 있을까?"에 초점.
가장 단순하고 유연한 디자인을 만들기 위해서 패턴을 사용해야 한다면 그때 패턴을 적용하면 된다.

■  디자인 패턴은 만병 통치약이 아니다

패턴을 사용할 때는 그 패턴을 사용했을 때 설계한 디자인의 다른 부분에 미칠수 있는 영향과 결과에 대해 주의 깊게 생각해 봐야 한다.

■  패턴이 필요한 경우

– 구상중인 디자인상에 적용이 적합하다 확신이 들 경우.
– 시스템의 어떤 부분이 변경될 것이라고 예측할 수 있는 경우.

■  리팩터링과 패턴

행동이 아닌 구조를 개선하는데 목적.

■  패턴 제거

시스템이 점점 복잡해지면서 처음에 기대했던 유연성이 전혀 발휘되지 않게 되는 경우 패턴을 과감하게 제거해 버리는게 최선책일 수 있다. 즉, 패턴을 사용하지 않은 간단한 해결책이 더 나을 것 같다 싶을 때 패턴을 제거하면 된다.

필요한 경우에만 적용하라

지금 당장 변화에 대처하기 위한 디자인을 만들어야 한다면 패턴을 적용해서 그 변화에 적응해야 한다. 하지만 꼭 필요하지 않음에도 불구하고 괜히 패턴을 추가하는 것은 피해야 한다. 괜히 시스템만 복잡해지고 사용률도 현저히 낮거나 없을 수 있다.

4. 패턴을 대하는 마음가짐

초보자들은 언제나 패턴을 사용하는 경향이 있다. 그 과정에서 패턴을 쓰는 연습을 하면서 다양한 경험을 쌓을 수 있는 측면에서는 좋다. 하지만 그러다 보면 반드시 그렇지만은 않다는 것을 배우게 된다. 어떤 디자인이든 될 수 있으면 단순하게 만들어야 한다는 것을 터득하게 된다.
반드시 확장성이 필요한 경우에만 패턴을 써서 조금 복잡하게 만드는 것이 좋다.

경험이 늘어 중급자 수준에 오르게 되면 어떤 상황에서 패턴이 필요하고 어떤 상황에서 패턴이 필요하지 않은지를 파악할 수 있다. 여전히 잘 맞지 않는 패턴을 억지로 적용하려는 경향이 보이긴 하지만, 그 과정에서 정형적인 패턴이 적합하지 않은 상황에서는 패턴을 적당히 변형시켜서 써야 한다는 것을 깨닫게 된다.

달인의 경지에 오르면 패턴을 자연스럽게 구사할 수 있다. 더 이상 패턴을 사용하는 것에 얽매이지 않는다. 문제를 가장 효과적으로 해결할 수 있는 해결책을 찾는데 주안점을 둘 뿐이다. 이는 객체지향 원칙들을 종합적으로 고려함이다. 자연스럽게 패턴이 필요한 상황에 이르면 패턴을 적당히 변형시켜서 적용한다. 그리고 달인들은 유사한 패턴 사이의 관계를 확실히 파악하여 관련된 패턴들의 용도 사이의 미묘한 차이점을 잘 이해하고 활용한다.
달인의 마음가짐은 초보자의 마음자짐이기도 하다. 디자인 과정에서 의사 결정을 할 때 패턴에 대한 지식이 그리 큰 영향을 끼치지 않기 때문이다.

5. 주요 패턴 정리

패턴이란 특정 컨텍스트(패턴이 적용되는 상황. 반복적으로 일어날 수 있는 상황) 내에서 주어진 문제(해당 컨텍스트 내에서 이루고자 하는 목적 또는 제약조건)에 대한 해결책(일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인)이다.

“어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받을 수 있는 문제에 봉착했다면, 그 제약조건 내에서 목적을 달성하기 위한 해결책을 찾아낼 수 있는 디자인을 적용한다.”

1. 범주별 분류

생성 관련 패턴(싱글턴, 추상 팩토리, 팩토리 메소드, 빌더, 프로토타입)

객체 인스턴스 생성을 위한 패턴으로, 클라이언트와 그 클라이언트에서 생성해야 할 객체 인스턴스 사이의 연결을 끊어주는 패턴.

행동 관련 패턴(템플릿 메소드, 커맨드, 어터레이터, 옵저버, 스테이트, 스트래티지)

클래스와 객체들의 상호작용 하는 방법 및 역할을 분담하는 방법관 관련된 패턴.

구조 관련 패턴(데코레이터, 컴포지트, 프록시, 퍼사드, 어댑터)

클래스 및 객체들을 구성을 통새허 더 큰 구조로 만들수 있게 해주는 것과 관련된 패턴.

2. 클래스, 객체 분류

■  클래스 패턴(템플릿 메소드, 팩토리 메소드, 어댑터)

클래스 사이의 관계가 상속을 통해서 어떤 식으로 정의되는지를 다룬다. 클래스 패턴에서는 컴파일시에 관계가 결정.

■  객체 패턴(컴포지트, 데코레이터, 프록시, 스트래티지, 브리지, 퍼사드, 커맨드, 이터레이터, 옵저버, 프로토타입, 스테이트, 추상 팩토리, 싱글턴)

객체 사이의 관계를 다루며, 객체 사이의 관계는 보통 구성을 통새허 정의. 객체 패턴에서는 일반적으로 실행중에 관계가 생성되기 때문에 더 동적이고 유연함.

3. 패턴으로 생각하기

■  최대한 단순하게

“이 문제에 어떤 패턴을 적용할까?”가 아닌 “어떻게 하면 단순하게 해결할 수 있을까?”에 초점.
가장 단순하고 유연한 디자인을 만들기 위해서 패턴을 사용해야 한다면 그때 패턴을 적용하면 된다.

■  디자인 패턴은 만병 통치약이 아니다

패턴을 사용할 때는 그 패턴을 사용했을 때 설계한 디자인의 다른 부분에 미칠수 있는 영향과 결과에 대해 주의 깊게 생각해 봐야 한다.

■  패턴이 필요한 경우

– 구상중인 디자인상에 적용이 적합하다 확신이 들 경우.
– 시스템의 어떤 부분이 변경될 것이라고 예측할 수 있는 경우.

■  리팩터링과 패턴

행동이 아닌 구조를 개선하는데 목적.

■  패턴 제거

시스템이 점점 복잡해지면서 처음에 기대했던 유연성이 전혀 발휘되지 않게 되는 경우 패턴을 과감하게 제거해 버리는게 최선책일 수 있다. 즉, 패턴을 사용하지 않은 간단한 해결책이 더 나을 것 같다 싶을 때 패턴을 제거하면 된다.

필요한 경우에만 적용하라

지금 당장 변화에 대처하기 위한 디자인을 만들어야 한다면 패턴을 적용해서 그 변화에 적응해야 한다. 하지만 꼭 필요하지 않음에도 불구하고 괜히 패턴을 추가하는 것은 피해야 한다. 괜히 시스템만 복잡해지고 사용률도 현저히 낮거나 없을 수 있다.

4. 패턴을 대하는 마음가짐

초보자들은 언제나 패턴을 사용하는 경향이 있다. 그 과정에서 패턴을 쓰는 연습을 하면서 다양한 경험을 쌓을 수 있는 측면에서는 좋다. 하지만 그러다 보면 반드시 그렇지만은 않다는 것을 배우게 된다. 어떤 디자인이든 될 수 있으면 단순하게 만들어야 한다는 것을 터득하게 된다.
반드시 확장성이 필요한 경우에만 패턴을 써서 조금 복잡하게 만드는 것이 좋다.

경험이 늘어 중급자 수준에 오르게 되면 어떤 상황에서 패턴이 필요하고 어떤 상황에서 패턴이 필요하지 않은지를 파악할 수 있다. 여전히 잘 맞지 않는 패턴을 억지로 적용하려는 경향이 보이긴 하지만, 그 과정에서 정형적인 패턴이 적합하지 않은 상황에서는 패턴을 적당히 변형시켜서 써야 한다는 것을 깨닫게 된다.

달인의 경지에 오르면 패턴을 자연스럽게 구사할 수 있다. 더 이상 패턴을 사용하는 것에 얽매이지 않는다. 문제를 가장 효과적으로 해결할 수 있는 해결책을 찾는데 주안점을 둘 뿐이다. 이는 객체지향 원칙들을 종합적으로 고려함이다. 자연스럽게 패턴이 필요한 상황에 이르면 패턴을 적당히 변형시켜서 적용한다. 그리고 달인들은 유사한 패턴 사이의 관계를 확실히 파악하여 관련된 패턴들의 용도 사이의 미묘한 차이점을 잘 이해하고 활용한다.
달인의 마음가짐은 초보자의 마음자짐이기도 하다. 디자인 과정에서 의사 결정을 할 때 패턴에 대한 지식이 그리 큰 영향을 끼치지 않기 때문이다.

5. 주요 패턴 정리

Since PHP 5 you can use type hinting to specify the expected data type of an argument in a function declaration. When you call the function, PHP will check whether or not the arguments are of the specified type. If not, the run-time will raise an error and execution will be halted.

Valid types are class names for arguments that receive objects and array for those that receive arrays. Here’s an example:

1 <?php
2 function enroll(Student $student, School $school) {
3 echo "Enrolling " . $student->name . " in " . $school->name;
4 }

By telling PHP exactly what kind of objects the enroll() method expects to receive, you can ensure that students are being enrolled in a school instead of a nunnery or a 401K. Likewise, you know that you won’t have any stubborn pachyderms showing up for the first day of third grade.

What would happen if I tried to enroll myself into medicare?

1 <?php
2 $me = new Student("Amanda");
3 $medicare = new Program("Medicare");
4 $enroll = enroll($me, $medicare);

Although I am a student, the following error would occur:

Catchable fatal error: Argument 2 passed to enroll() must be an instance of School, instance of Program given, called in typehint.php on line 32 and defined in typehint.php on line 6

Ifnullis used as a default value for an argument it will also be allowed. Here’s an example, this time with arrays:

1 <?php
2 function startParty(array $guests, array $food = null) {
3     // party stuff...
4 }
5 $guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble");
6 startParty($guests, null);

There’ll be a party as long as there are guests, with or without food.

Limitations of Hinting

Any defined class can be a valid type hint, though PHP does not support type hinting for a generic object. What about everything else?

Here is a peculiar example of the limitations of PHP’s type hinting:

1 <?php
2 function stringTest(string $string) {
3     echo $string;
4 }
5 stringTest("definitely a string");
Catchable fatal error: Argument 1 passed to stringTest() must be an instance of string, string given, called in typehint.php on line 42 and defined in typehint.php on line 39

You’re not the first think “What is this madness? I gave you a string instance, and yet you complain it must be an instance of string!” It’s alright. It happens to the best of us. In fact, it can be quite a
confusing error message at first glance.

stringTest() is not looking for a string, it is looking for an instance of a string class. Scalar data types, such as strings or integer values, are not supported in PHP’s type hinting. But it’s okay! If you need to raise an error or throw an exception when an argument is not a scalar type (like a string or integer), you can do perform basic validation to serve this purpose using functions like is_string() or is_int().

The Scalar Wars

There has been a bit of controversy regarding the addition of scalar PHP type-hinting in PHP 5.4. Those who oppose the change argue that this support would go against the fundamental designs of PHP. PHP is considered to be a weak typed language. In essence, this means that PHP does not require you to declare data types. Variables still have data types associated with them but you can do radical things like adding a string to an integer without resulting in an error.

In May of 2010 support for scalar type hinting was added to the PHP trunk. But because of community response this feature will not make its way into the 5.4 release.

Summary

Type hinting is a technique introduced into PHP for object-oriented programming (specifically for identifying the type of a caught exception). I encourage you to read more about working with objects here

Since PHP 5 you can use type hinting to specify the expected data type of an argument in a function declaration. When you call the function, PHP will check whether or not the arguments are of the specified type. If not, the run-time will raise an error and execution will be halted.

Valid types are class names for arguments that receive objects and array for those that receive arrays. Here’s an example:

1 <?php
2 function enroll(Student $student, School $school) {
3 echo "Enrolling " . $student->name . " in " . $school->name;
4 }

By telling PHP exactly what kind of objects the enroll() method expects to receive, you can ensure that students are being enrolled in a school instead of a nunnery or a 401K. Likewise, you know that you won’t have any stubborn pachyderms showing up for the first day of third grade.

What would happen if I tried to enroll myself into medicare?

1 <?php
2 $me = new Student("Amanda");
3 $medicare = new Program("Medicare");
4 $enroll = enroll($me, $medicare);

Although I am a student, the following error would occur:

Catchable fatal error: Argument 2 passed to enroll() must be an instance of School, instance of Program given, called in typehint.php on line 32 and defined in typehint.php on line 6

Ifnullis used as a default value for an argument it will also be allowed. Here’s an example, this time with arrays:

1 <?php
2 function startParty(array $guests, array $food = null) {
3     // party stuff...
4 }
5 $guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble");
6 startParty($guests, null);

There’ll be a party as long as there are guests, with or without food.

Limitations of Hinting

Any defined class can be a valid type hint, though PHP does not support type hinting for a generic object. What about everything else?

Here is a peculiar example of the limitations of PHP’s type hinting:

1 <?php
2 function stringTest(string $string) {
3     echo $string;
4 }
5 stringTest("definitely a string");
Catchable fatal error: Argument 1 passed to stringTest() must be an instance of string, string given, called in typehint.php on line 42 and defined in typehint.php on line 39

You’re not the first think “What is this madness? I gave you a string instance, and yet you complain it must be an instance of string!” It’s alright. It happens to the best of us. In fact, it can be quite a
confusing error message at first glance.

stringTest() is not looking for a string, it is looking for an instance of a string class. Scalar data types, such as strings or integer values, are not supported in PHP’s type hinting. But it’s okay! If you need to raise an error or throw an exception when an argument is not a scalar type (like a string or integer), you can do perform basic validation to serve this purpose using functions like is_string() or is_int().

The Scalar Wars

There has been a bit of controversy regarding the addition of scalar PHP type-hinting in PHP 5.4. Those who oppose the change argue that this support would go against the fundamental designs of PHP. PHP is considered to be a weak typed language. In essence, this means that PHP does not require you to declare data types. Variables still have data types associated with them but you can do radical things like adding a string to an integer without resulting in an error.

In May of 2010 support for scalar type hinting was added to the PHP trunk. But because of community response this feature will not make its way into the 5.4 release.

Summary

Type hinting is a technique introduced into PHP for object-oriented programming (specifically for identifying the type of a caught exception). I encourage you to read more about working with objects here