# PHP 5.3 제약사항 및 호환성 가이드 ## 개요 Infoway는 **PHP 5.3.29** 환경에서 운영되며, 이는 2014년에 출시된 매우 구버전입니다. PHP 7+ 또는 최신 프레임워크의 문법을 사용할 수 없으므로, 개발 시 주의가 필요합니다. ## PHP 버전 히스토리 ``` PHP 5.3.29 (2014-08-14) ← 현재 사용 중 ⚠️ PHP 5.4.0 (2012-03-01) - [] 배열 문법, trait 추가 PHP 5.5.0 (2013-06-20) - finally, generators 추가 PHP 5.6.0 (2014-08-28) - ** 연산자, const 배열 추가 PHP 7.0.0 (2015-12-03) - 성능 2배 향상, type hints PHP 7.4.0 (2019-11-28) - 타입 프로퍼티, arrow functions PHP 8.0.0 (2020-11-26) - JIT 컴파일러, named arguments PHP 8.3.0 (2023-11-23) - 최신 안정 버전 ``` ## 사용 불가 문법 ### 1. Namespace (PHP 5.3+, 제한적) ```php // ❌ 사용 불가 namespace App\Controllers; use App\Models\Member; class MemberController extends Controller { // ... } // ✅ 대안: 클래스명 접두사 class IW_Member_Controller { // ... } class IW_Member_Model { // ... } ``` **이유**: PHP 5.3에서 namespace 기본 지원은 있으나, 기존 레거시 코드와 호환성 문제로 사용하지 않음. ### 2. 짧은 배열 문법 (PHP 5.4+) ```php // ❌ 사용 불가 $arr = ['key' => 'value']; $list = [1, 2, 3]; // ✅ 사용 가능 $arr = array('key' => 'value'); $list = array(1, 2, 3); ``` ### 3. ::class 상수 (PHP 5.5+) ```php // ❌ 사용 불가 $className = Member::class; call_user_func(array(Member::class, 'method')); // ✅ 대안: 문자열 사용 $className = 'Member'; call_user_func(array('Member', 'method')); ``` ### 4. Trait (PHP 5.4+) ```php // ❌ 사용 불가 trait TimestampTrait { public function getCreatedAt() { return $this->created_at; } } class Member { use TimestampTrait; } // ✅ 대안: 상속 또는 별도 함수 class TimestampBase { public function getCreatedAt() { return $this->created_at; } } class Member extends TimestampBase { // ... } ``` ### 5. finally 블록 (PHP 5.5+) ```php // ❌ 사용 불가 try { // 코드 } catch (Exception $e) { // 에러 처리 } finally { // 정리 작업 } // ✅ 대안: try-catch 후 별도 처리 $cleanup = false; try { // 코드 $cleanup = true; } catch (Exception $e) { // 에러 처리 $cleanup = true; } if ($cleanup) { // 정리 작업 } ``` ### 6. Generators (PHP 5.5+) ```php // ❌ 사용 불가 function getNumbers() { for ($i = 0; $i < 1000; $i++) { yield $i; } } // ✅ 대안: 일반 배열 반환 function getNumbers() { $numbers = array(); for ($i = 0; $i < 1000; $i++) { $numbers[] = $i; } return $numbers; } ``` ### 7. ** 거듭제곱 연산자 (PHP 5.6+) ```php // ❌ 사용 불가 $result = 2 ** 8; // ✅ 대안: pow() 함수 $result = pow(2, 8); ``` ### 8. 가변 길이 인수 (PHP 5.6+) ```php // ❌ 사용 불가 function sum(...$numbers) { return array_sum($numbers); } // ✅ 대안: func_get_args() function sum() { $numbers = func_get_args(); return array_sum($numbers); } ``` ### 9. Null 병합 연산자 (PHP 7.0+) ```php // ❌ 사용 불가 $name = $_GET['name'] ?? 'Guest'; // ✅ 대안: isset() 또는 삼항 연산자 $name = isset($_GET['name']) ? $_GET['name'] : 'Guest'; ``` ### 10. Spaceship 연산자 (PHP 7.0+) ```php // ❌ 사용 불가 usort($array, function($a, $b) { return $a <=> $b; }); // ✅ 대안: 조건문 usort($array, function($a, $b) { if ($a == $b) return 0; return ($a < $b) ? -1 : 1; }); ``` ### 11. Type Hints (PHP 7.0+ 확장) ```php // ❌ 사용 불가 (PHP 7+) function sum(int $a, int $b): int { return $a + $b; } // ⚠️ 제한적 사용 (PHP 5.3) // 클래스, 배열만 가능, 스칼라 타입 불가 function process(array $data) { // ... } function setMember(Member $member) { // ... } // ✅ 권장: 주석으로 타입 명시 /** * @param int $a * @param int $b * @return int */ function sum($a, $b) { return $a + $b; } ``` ## 사용 가능한 기능 ### 1. 클로저 (PHP 5.3+) ```php // ✅ 사용 가능 $greet = function($name) { return "Hello, $name"; }; echo $greet('World'); // use로 외부 변수 사용 $message = "Hi"; $greet = function($name) use ($message) { return "$message, $name"; }; ``` ### 2. 늦은 정적 바인딩 (PHP 5.3+) ```php // ✅ 사용 가능 class Base { public static function getClass() { return get_called_class(); // 또는 static::class (PHP 5.5+) } } class Child extends Base { } echo Child::getClass(); // "Child" ``` ### 3. goto 문 (PHP 5.3+) ```php // ✅ 사용 가능 (권장하지 않음) for ($i = 0; $i < 10; $i++) { if ($i == 5) { goto end; } } end: echo "Done"; ``` ### 4. __DIR__ 상수 (PHP 5.3+) ```php // ✅ 사용 가능 echo __DIR__; echo __FILE__; echo __CLASS__; ``` ## 데이터베이스 제약사항 ### mysql_* 함수 사용 (Deprecated) ```php // ⚠️ PHP 5.5+에서 deprecated, PHP 7.0+에서 제거됨 // 하지만 PHP 5.3에서는 사용해야 함 // 현재 사용 중 $conn = mysql_connect($host, $user, $pass); mysql_select_db($db); $result = mysql_query($sql); $row = mysql_fetch_array($result); // ❌ PHP 5.3에서 사용 불가 (또는 제한적) // mysqli (PHP 5.0+이지만 일부 기능 제한) // PDO (PHP 5.1+이지만 일부 드라이버 제한) ``` ### Prepared Statements 제한 ```php // ⚠️ mysqli나 PDO 사용 제한으로 인해 // Prepared Statements 사용 어려움 // 현재 방식: addslashes() 사용 $safe_input = addslashes($_POST['input']); $sql = "SELECT * FROM table WHERE field = '$safe_input'"; // ✅ 이상적 방식 (PHP 5.3에서 제한적) // $stmt = $pdo->prepare("SELECT * FROM table WHERE field = ?"); // $stmt->execute(array($input)); ``` ## Composer 제약사항 ### 패키지 호환성 ```bash # 대부분의 최신 패키지는 PHP 7.0+ 요구 # PHP 5.3 호환 패키지는 매우 제한적 # ❌ 사용 불가한 인기 패키지 composer require laravel/framework # PHP 7.3+ 요구 composer require symfony/symfony # PHP 7.2+ 요구 composer require guzzlehttp/guzzle # PHP 7.2+ 요구 # ✅ 일부 사용 가능 (구버전) composer require monolog/monolog:1.23.* # PHP 5.3 호환 composer require twig/twig:1.* # PHP 5.3 호환 ``` ## 보안 관련 제약 ### 1. password_hash() 미지원 (PHP 5.5+) ```php // ❌ 사용 불가 $hash = password_hash($password, PASSWORD_DEFAULT); $verify = password_verify($password, $hash); // ✅ 대안: crypt() 또는 hash() 사용 // 하지만 보안성 낮음 $hash = hash('sha256', $password . $salt); // 또는 password_compat 라이브러리 사용 // composer require ircmaxell/password-compat ``` ### 2. random_bytes() 미지원 (PHP 7.0+) ```php // ❌ 사용 불가 $random = random_bytes(32); // ✅ 대안: openssl_random_pseudo_bytes() $random = openssl_random_pseudo_bytes(32); // 또는 mt_rand() (보안성 낮음) $random = mt_rand(); ``` ## 성능 제약 ### 1. Opcache 미지원 ``` PHP 5.3: APC 사용 (별도 설치) PHP 5.5+: Opcache 내장 성능 차이: PHP 7.0은 PHP 5.3 대비 2배 빠름 ``` ### 2. 메모리 관리 ```php // PHP 5.3의 메모리 관리는 PHP 7+보다 비효율적 // 대용량 데이터 처리 시 주의 필요 // ⚠️ 메모리 많이 사용 $data = array(); for ($i = 0; $i < 100000; $i++) { $data[] = array('id' => $i, 'name' => "User $i"); } // ✅ 청크 처리 권장 $chunk_size = 1000; for ($i = 0; $i < 100000; $i += $chunk_size) { $chunk = array_slice($data, $i, $chunk_size); // 처리 unset($chunk); } ``` ## 업그레이드 로드맵 ### 단계적 업그레이드 권장 ``` 현재: PHP 5.3.29 ↓ Step 1: PHP 5.6 (2014) - mysql_* → mysqli 전환 - 기본 호환성 테스트 - 주요 버그 수정 ↓ Step 2: PHP 7.0 (2015) - 성능 2배 향상 - Type hints 활용 - Error → Exception 변환 ↓ Step 3: PHP 7.4 (2019) - 타입 프로퍼티 - Arrow functions - Preloading ↓ Step 4: PHP 8.x (2020+) - JIT 컴파일러 - Named arguments - Union types ``` ### 마이그레이션 체크리스트 ``` [ ] 코드 호환성 검토 - namespace 사용 계획 - [] 배열 문법 전환 - Type hints 추가 [ ] 데이터베이스 - mysql_* → mysqli/PDO - Prepared Statements 적용 [ ] 보안 - password_hash() 적용 - random_bytes() 적용 [ ] 테스트 - 단위 테스트 작성 - 통합 테스트 - 성능 벤치마크 [ ] 인프라 - PHP 버전 업그레이드 - 확장 모듈 설치 - 서버 설정 변경 ``` ## 참고 자료 - [PHP 5.3 매뉴얼](https://www.php.net/manual/en/migration53.php) - [PHP 5.3 → 5.4 마이그레이션](https://www.php.net/manual/en/migration54.php) - [PHP 5.6 → 7.0 마이그레이션](https://www.php.net/manual/en/migration70.php) - [PHP Compatibility Checker](https://github.com/PHPCompatibility/PHPCompatibility) --- **마지막 업데이트**: 2024-11-05 **관련 문서**: [.cursorrules](/.cursorrules), [README.md](README.md)