AI 요약
필자는 2007년에 설립되어 모든 백엔드를 PHP로 구축한 회사에서 5년간 개발자로 근무한 경험을 바탕으로, PHP 언어가 가진 독특하고 비직관적인 특성들을 정리했습니다. PHP는 과거 HTML을 서빙하기 위해 개발되었으나 최근 버전들이 발전을 거듭하며 타 언어에 뒤처지지 않는 다목적 범용 언어로 자리 잡았습니다. 그럼에도 불구하고 실무에서는 설계상의 기이한 특징들로 인해 빈번하게 버그가 발생하는데, 대표적인 원인 중 하나가 바로 '배열(Array)'의 오버로딩 문제입니다. PHP의 배열은 전통적인 메모리 할당 방식의 배열이 아니라 실제로는 '순서가 있는 키-값 딕셔너리'로 작동합니다. 이로 인해 배열 필터링이나 요소 삭제 시 인덱스가 순서대로 재정렬되지 않고 기존 키를 유지하여 개발자가 예상치 못한 'Undefined array key' 오류를 마주하게 만들며, 이를 해결하기 위해 매번 array_values 함수를 호출해야 하는 번거로움을 유발합니다.
핵심 인사이트
- 필자가 근무했던 기업은 2007년 창업 당시의 결정에 따라 전체 백엔드 시스템을 PHP로 구축하여 운영해 왔습니다.
- PHP는 HTML 템플릿 전용 언어라는 과거 오명에서 벗어나 최근 버전 업데이트를 통해 강력한 범용 목적 프로그래밍 언어로 성숙했습니다.
- PHP의 표준 라이브러리에는 전통적인 배열 자료구조가 없으며, 대신 '순서가 있는 키-값 딕셔너리(ordered key-value dictionary)'를 유일한 배열 구조로 제공합니다.
array_filter나unset()등의 내장 함수로 배열을 수정하면 정수형 인덱스의 연속성이 깨져 런타임 버그의 주요 원인이 됩니다.
주요 디테일
- 설계적 한계: PHP는 메모리에 연속해서 할당되는 고정 크기의 전통적인 배열 구조를 가질 수 없으며, 단 하나의 유연한 자료구조를 만능으로 사용하도록 설계되어 복잡성을 키웠습니다.
- 인덱스 유실 현상: 3개의 과일명이 담긴 배열에서
unset($fruits[0])으로 첫 번째 요소를 제거하면, 인덱스 자동 재정렬이 발생하지 않아[1] => oranges,[2] => limes형태로 키가 보존됩니다. - 필터링 버그:
array_filter를 통해 조건에 맞는 요소를 걸러낼 때도 원본 인덱스 값이 유지되므로, 필터링 후 0번째 인덱스($filteredFruits[0])에 접근하려고 하면Undefined array key경고가 발생합니다. - 해결책의 부재: 이렇게 어긋난 키-값 배열을 다시 자연스럽게 0부터 정렬된 인덱스 배열로 복구하기 위해서는 반드시 무거운
array_values함수를 호출해 키를 재설정해야 합니다.
향후 전망
- PHP가 최신 언어 스펙을 갖추며 성능을 개선해 가고 있지만, 배열과 같이 언어 뿌리에 내재된 비직관적인 작동 방식은 레거시 마이그레이션이나 신규 개발자 유입 시 여전히 높은 진입장벽이자 디버깅의 걸림돌로 작용할 것입니다.
출처:hackernews
