Skip to content
isdnetworks
Go back

PHP에 없는 것들

새로 일을 시작하면서 PHP를 쓰게 됐다. 이전에는 자바만 했다. 문법은 며칠 만에 익혔는데 자바에서 당연하던 것이 없는 자리가 계속 나왔다.

Table of contents

Open Table of contents

컴파일이 없다

제일 먼저 부딪힌 것이 이거였다. 자바는 저장하고 빌드하면 오타가 잡히는데 PHP는 저장하고 새로고침하면 끝이다. 빠른 대신 오타도 실행할 때까지 모른다.

$userName = "홍길동";
echo $userNmae;   // 아무것도 안 나온다

자바라면 컴파일이 안 되는데 PHP 는 그냥 빈 값이 나온다. 화면이 비어 있는데 어디가 문제인지 알려 주지 않는다.

error_reportingE_ALL 로 올리고 display_errors 를 켜니 그때부터 메시지가 나왔다. 없는 변수를 읽는 것은 E_NOTICE 인데 php.ini 기본값이 그것을 빼고 있었다. 운영에서는 화면에 안 띄우는 것이 맞지만 개발 서버에는 항상 켜 두게 됐다.

타입이 없어서 생기는 일

처음에는 타입을 안 적어도 되는 것이 편하다고 생각했다. 그런데 이런 코드에서 막혔다.

if ($result == 0) {
    // 실패 처리
}

$result 가 빈 문자열일 때도 여기로 들어오고 "abc" 같은 문자열도 들어왔다. == 는 양쪽 타입이 다르면 맞춰서 비교한다. 숫자와 문자열을 비교하면 문자열을 숫자로 바꿔서 비교하는데 숫자가 아니면 0이 되기 때문이었다.

타입까지 보는 === 가 따로 있다는 것을 알고 조회 결과 비교를 전부 그쪽으로 바꿨다. 이걸 모르고 짜면 실패를 성공으로 처리하게 된다. 실제로 그런 코드가 있었고 왜 잘못된 데이터가 들어가는지 한참 찾았다.

요청마다 다시 시작한다

자바는 Servlet 컨테이너가 떠 있고 그 안에서 요청을 처리하니 클래스에 값을 담아 두면 다음 요청에서도 쓸 수 있다. PHP는 요청 하나가 끝나면 다 사라진다.

처음에 이걸 모르고 설정을 static 변수에 담아 뒀다가 왜 매번 비어 있는지 몰라 헤맸다. 매 요청마다 파일에서 다시 읽어야 했다.

불편하기만 한 것은 아니다. 요청끼리 서로 영향을 안 주니 한 요청이 이상해져도 다른 요청은 멀쩡하다. 자바에서 정적 변수를 잘못 건드려 전체가 이상해지는 것보다 나은 면이 있다. 대신 매번 다시 읽는 비용이 들어서 memcached 같은 것을 밖에 두는 구조가 필요하다는 것도 이때 알았다.

같은 뿌리로 배열도 걸렸다. 자바에서는 순서가 있으면 List 를 쓰고 키가 있으면 Map 을 쓰는데 PHP 는 둘 다 배열이다.

$list = [1, 2, 3];
$map  = ["name" => "홍길동", "age" => 30];

함수가 배열을 받으면 그것이 목록인지 사전인지 코드만 봐서는 알 수 없었다. var_dump 로 안을 열어 봐야 안다. 그래서 이름으로 구분하는 습관을 들였다. 여러 건이면 복수형으로 쓰고 키가 있는 것은 다른 이름으로 쓴다. 언어가 안 나눠 주면 사람이 나눠야 했다.

아직 판단이 안 선다

어느 쪽이 나은지는 아직 모르겠다. PHP는 고치고 새로고침하면 바로 보이는데 그 속도는 확실히 좋다. 자바는 틀린 것을 실행 전에 잡아 주는데 그 안전함도 확실히 좋다.

지금 드는 생각은 둘 중 하나를 고르는 문제가 아니라 쓰는 쪽에서 부족한 것을 메워야 한다는 쪽이다. PHP 에서는 컴파일이 안 잡아 주니 E_ALL 로 켜고 === 를 쓰고 이름 규칙을 정했다. 언어가 해 주던 것을 손으로 하는 것 같아 번거로운데 다른 방법을 아직 모르겠다.

정리


Share this post on:

Previous Post
처리 중에 바뀌는 대상 집합
Next Post
거쳐 가는 것을 설정으로 뺐다