PHP Reference
PHP 프로그래밍 레퍼런스
PHP Reference 소개
PHP 레퍼런스는 PHP 8.0과 8.1 기능에 특히 중점을 둔 PHP 개발자를 위한 포괄적인 치트 시트입니다. 6개 카테고리를 다룹니다: 핵심 언어 문법(변수, 제어 흐름, match 표현식, null 병합 연산자 `??`, nullsafe 연산자 `?->`, 열거형), 배열 조작 함수(array_map, array_filter, array_reduce, array_merge, array_slice), 문자열 함수(멀티바이트를 위한 strlen vs mb_strlen, str_contains/str_starts_with, explode/implode, preg_match/preg_replace, sprintf), 객체지향 PHP(생성자 프로모션이 포함된 클래스, 인터페이스, 트레이트, 추상 클래스, readonly 프로퍼티), 파일 I/O(file_get_contents, fopen/fread, json_encode/json_decode, file_exists), PDO 데이터베이스 접근(연결, 준비된 구문, 트랜잭션).
이 레퍼런스는 Laravel이나 Symfony 같은 프레임워크로 PHP 애플리케이션을 개발하는 웹 개발자, PHP 5/7 경험 후 최신 PHP 8 기능을 익히는 개발자, `array_map`과 `array_walk`의 차이나 명명된 파라미터를 사용한 PDO 준비된 구문 작성 방법을 빠르게 찾아야 하는 모든 사람에게 유용합니다. 모든 예제는 실용적이고 실제 애플리케이션에서 바로 사용할 수 있습니다.
PHP 레퍼런스는 실제 PHP 코드 작성 방식을 반영하여 구성되어 있습니다: 기본 문법과 제어 구조로 시작하여, 배열과 문자열 변환을 거쳐, PHP 8의 생성자 프로퍼티 프로모션과 readonly 프로퍼티 같은 기능을 사용해 클래스와 인터페이스를 정의하고, 파일 시스템과 상호작용하며, 적절한 오류 처리와 트랜잭션 지원이 포함된 PDO를 사용해 데이터베이스에 연결합니다.
주요 기능
- PHP 8 기본문법: 변수, match 표현식, for/foreach/while 반복문, 상수
- 안전한 기본값을 위한 null 병합 연산자(??)와 체인 호출을 위한 nullsafe 연산자(?>)
- 백드 케이스(string/int)와 값 접근을 포함한 PHP 8.1 열거형(enum)
- 배열 함수: array_map, array_filter, array_reduce, array_merge, array_slice
- 유니코드를 위한 mb_strlen, PHP 8+ str_contains/str_starts_with, preg_match/preg_replace
- OOP: 생성자 프로퍼티 프로모션, interface/implements, 트레이트, 추상 클래스, readonly 프로퍼티
- 파일 I/O: file_get_contents/file_put_contents, fopen/fgets 스트리밍, json_encode/json_decode
- PDO: 데이터베이스 연결, 명명된 파라미터 준비된 구문, lastInsertId, 롤백을 포함한 트랜잭션
자주 묻는 질문
PHP 8의 생성자 프로퍼티 프로모션이란 무엇인가요?
생성자 프로퍼티 프로모션은 PHP 8의 간략한 표기법으로, 생성자 시그니처에서 직접 클래스 프로퍼티를 선언하고 초기화할 수 있습니다. `private string $name;`을 프로퍼티로 선언하고 생성자 본문에서 `$this->name = $name`을 할당하는 대신, `public function __construct(private string $name, private int $age) {}`처럼 작성합니다. 파라미터 목록의 접근 제한자(`public`, `protected`, `private`)가 자동 프로퍼티 생성 및 할당을 트리거합니다.
PHP 8의 ?? 연산자와 ?-> 연산자의 차이점은?
null 병합 연산자 `??`는 왼쪽 피연산자가 null이 아니면 그것을 반환하고, 그렇지 않으면 오른쪽 피연산자를 반환합니다. 기본값을 제공할 때 유용합니다: `$name = $_GET["name"] ?? "Guest"`. nullsafe 연산자 `?->`는 null 값에 대한 메서드 및 프로퍼티 접근을 단락시켜 오류를 던지는 대신 null을 반환합니다: `$city = $user?->getAddress()?->getCity()`는 `$user`나 `getAddress()`가 null이면 null을 반환합니다.
PHP 열거형(PHP 8.1)은 어떻게 작동하나요?
PHP 8.1 열거형은 닫힌 명명된 값 집합을 정의합니다. "백드" 열거형은 각 케이스에 문자열 또는 정수 값을 연결합니다: `enum Status: string { case Active = "active"; case Inactive = "inactive"; }`. `->value`로 백킹 값에 접근합니다: `Status::Active->value`는 `"active"`를 반환합니다. `Status::from("active")`(잘못된 값이면 예외 발생)나 `Status::tryFrom("invalid")`(null 반환)로 값에서 변환할 수도 있습니다.
PHP에서 array_map과 array_filter의 차이점은?
`array_map(콜백, $배열)`은 모든 요소에 함수를 적용하고 변환된 값의 새 배열을 반환합니다 — 항상 같은 길이의 배열을 반환합니다. `array_filter($배열, 콜백)`은 콜백이 true를 반환하는 요소만 유지합니다 — 결과가 더 짧을 수 있습니다. `array_filter`는 키를 보존한다는 점에 주의하세요. 순차적인 정수 키가 필요하면 이후 `array_values()`를 사용하세요.
PHP 트레이트는 추상 클래스 및 인터페이스와 어떻게 다른가요?
인터페이스는 클래스가 구현해야 하는 계약(메서드 시그니처만)을 정의합니다. 추상 클래스는 추상 메서드(본문 없음)와 구현이 있는 구체적 메서드를 모두 포함할 수 있지만, 클래스는 하나의 추상 클래스만 상속할 수 있습니다. 트레이트는 수평적 코드 재사용을 위한 메커니즘으로, `use Timestamps;`로 클래스에 "혼합"되는 메서드 구현을 포함합니다. 클래스는 여러 트레이트를 사용할 수 있지만 하나의 부모 클래스만 상속할 수 있습니다.
PHP에서 PDO로 SQL 인젝션을 방지하는 방법은?
항상 바운드 파라미터와 함께 준비된 구문을 사용하세요. SQL 문자열에 `":id"` 같은 명명된 파라미터나 `"?"` 위치 플레이스홀더를 사용하고, 실제 값은 `$stmt->execute(["id" => $userId])`나 `$stmt->execute([$userId])`로 전달합니다. 사용자 입력을 SQL 문자열에 직접 연결하지 마세요. PDO 준비된 구문은 입력 값에 관계없이 데이터베이스 드라이버가 이스케이핑을 올바르게 처리하도록 보장합니다.
PHP에서 file_get_contents와 fopen의 차이점은?
`file_get_contents()`는 전체 파일을 한 번의 호출로 문자열로 읽습니다 — 소~중간 크기 파일에 간단하고 충분합니다. `fopen()`과 `fgets()` 또는 `fread()`는 파일을 메모리에 전부 로드하지 않고 줄별로 처리할 수 있도록 파일 핸들을 열어 스트리밍합니다. 메모리 사용이 중요한 대용량 로그 파일이나 CSV 파일에는 `fopen()`을 사용하세요. 두 함수 모두 추가를 위한 `FILE_APPEND` 플래그를 지원합니다.
PHP에서 PDO 트랜잭션은 어떻게 작동하나요?
`$pdo->beginTransaction()`으로 트랜잭션을 시작합니다. try-catch 블록 안에서 쿼리를 실행합니다. 성공하면 `$pdo->commit()`을 호출합니다. 예외가 발생하면 catch 블록에서 `$pdo->rollBack()`을 호출해 `beginTransaction()` 이후의 모든 변경을 취소합니다. 이를 통해 원자성이 보장됩니다 — 트랜잭션의 모든 쿼리가 성공하거나 하나도 적용되지 않습니다. 쿼리 오류가 예외를 던지도록 연결 시 `PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION`을 설정하세요.