PHP: 객체 비교와 복사

객체 비교 객체에 대한 비교는 단순히 가지고 있는 값이 똑같은지 비교하는 것과 객체의 주소값이 같은지를 비교하는 것이 있습니다. 각각 ==, === 연산자를 사용하고, 아래의 코드를 보면, 두 개의 객체는 서로 다른 주소값을 가지고 있기 때문에 === 를 사용했을 때 false 를 반환합니다. 아주 단순하지만 이는 중요합니다. $class1 = new stdClass(); $class2 = new stdClass(); var_dump($class1 == $class2); // -> true var_dump($class1 === $class2); // -> false 객체 복사 결론부터 이야기하자면 PHP는 clone 키워드를 통해 복사하는 경우 기본적으로 얕은 복사입니다. 복사는 단순 복사, 얕은 복사,..

PHP: 참조 (WeakReference)

참조 참조는 포인터와 비슷하지만 사실 전혀 다른 개념입니다. 그저 변수의 실질적 값이 담긴 공간에 그저 이름을 하나 더 부여할 뿐입니다. hello 라는 변수에 Hello, world 라는 값이 담겨있고, 이 변수의 참조인 sayHello 라는 변수를 만들면 그저 Hello, world 라는 값이 담긴 메모리 공간에 이름이 하나 더 부여 될 뿐이라는 것입니다. 그 말은 hello 변수와 sayHello 라는 변수는 같다는 이야기로 해석할 수 있습니다. & & 기호를 사용하여 참조를 나타낼 수 있으며, 이는 위에서 언급한 바와 같이 이름을 하나더 부여하는 것과 같습니다. 그래서 sayHello 라는 값을 바꿨더니 hello 변수의 값도 변하는 효과가 나타난 것입니다. 포인터와 헷갈려서는 안 됩니다. 포인터..

PHP: 제네레이터 (Iterator)

제네레이터 제네레이터는 모던 PHP에서 등장한 흥미로운 기능으로, 내부적으로 Iterator 인터페이스를 구현한 빌트인 클래스입니다. 생긴건 함수처럼 생겼지만, 함수 내부에서 yield 라는 키워드를 사용하여 마치 Break Point 를 넣은 것처럼, 값을 외부에 던져주고 다시 내부로 돌아가서 진행할 수 있습니다. 사실 이야기만 들어서는 잘 모를 수 있는데, 코드를 보면 쉽게 알 수 있을 것입니다. 자바스크립트에도 제네레이터는 존재하지만, 그보다는 복잡하지 않습니다. yield 제네레이터는 마치 함수처럼 생겼습니다. 그런데 사실 이렇게 만든 제네레이터를 호출해서 값을 반환받으면 흥미로운 객체를 얻을 수 있습니다. 바로 제네레이터 객체입니다. 즉, 함수의 모습을 하고 있지만, 실은 전혀 다른 개념이라는 ..

PHP: 에러와 예외 (try, catch, finally)

에러 여기서 에러라는 것은 문법 에러와 치명적 에러 등을 말합니다. 에러는 보통 문법 에러, 컴파일 에러 등 컴파일 타임에 나타나는 것이 일반적이며 예외는 데이터베이스 연결 예외 등 런타임에 나타나는 것이 일반적입니다. PHP 언어에서는 에러를 처리할 수 있는 몇 가지 기법이 있는데, 알아보도록 하겠습니다. error_reporting(int) 에러 발생 레벨을 조정할 수 있습니다. 상수 E_ 로 시작하는 것이 일반적입니다. 예를 들면 다음과 같이 레벨을 조정할 수 있습니다. 예제에 나온 설정이 일반적으로 사용되고, 프로덕션에서는 꺼놓는 경우도 있습니다. 사실 보안을 위해서라면 꺼놓는게 좋기는 합니다. int $level 에러 보고 레벨 error_reporting(E_ALL & ~E_NOTICE); e..

PHP: 네임스페이스

네임스페이스 네임스페이스는 분량은 짧지만 매우 x 2 중요합니다. 클래스와 함께 모던 PHP를 이루는 근간이며, composer 와 같은 패키지 매니저를 사용할 때 중요하게 작용하기 때문입니다. 이는 우리가 composer package 를 만들거나 할 때도 필요합니다. 이는 단순히 우리가 작성한 코드를 구역으로 나누는 것으로 같은 서드 파티, 또는 빌트인에 속하는 함수, 클래스와 중복을 고려하지 않고도 클래스나 함수의 이름을 지정해줄 수 있습니다. 네임스페이스를 사용하기 이전에는 중복을 피하기 위해 긴 함수, 클래스 이름을 사용하여 나타내야 했는데 이제는 그럴 필요가 없습니다. namespace 네임스페이스는 naemspace 키워드를 사용하여 나타낼 수 있으며, 내부에는 함수와 클래스, 상수 등 여러..