PHP 5.0.x부터 바뀐 것들
CLI와 CGI
PHP 4에서 PHP 5.0.x로 이행
PHP Manual

## 이전 버전과 호환되지 않는 변경점

기존 PHP 4 코드의 대부분은 변경 없이 작동하지만, 다음의 호환 되지 않는 변경점에는 주의해야 합니다:

- 새 예약어가 있습니다.
- strrpos()와 strripos()가 전체 문자열을 needle로 사용합니다.
- 문자열 오프셋의 비정상적인 사용은 `E_WARNING` 대신 `E_ERROR`를 발생합니다. 비정상적인 사용의 예제: $str = 'abc'; unset($set[0]);
- array_merge()가 배열만을 받아들이게 변경되었습니다. 배열이 아닌 값을 넘기면, 그러한 인수마다 `E_WARNING`을 발생합니다. 코드가 갑작스레 `E_WARNING`를 표시하기 시작할 수 있으므로 주의하십시오.
- 더이상 Apahce2 SAPI에서 PATH_TRANSLATED 서버 변수를 자동으로 설정하지 않습니다. PHP 4에서는 아파치가 생성하지 않았을 때, SCRIPT_FILENAME 서버 변수와 동일하게 설정했었습니다. 이 변경은 » CGI 규격에 따르기 위한 점입니다. 자세한 정보는 » 버그 #23610를 확인하고, 매뉴얼에서 $_SERVER['PATH_TRANSLATED'] 설명을 참고하십시오. 이 내용은 PHP >= 4.3.2에도 영향이 있습니다.
- Tokenizer 확장은 더 이상 `T_ML_COMMENT` 상수를 정의하지 않습니다. error_reporting을 `E_ALL`로 설정하면, PHP가 주의문을 생성합니다. `T_ML_COMMENT`는 사용되지 않았지만, PHP 4에서 정의되어 있었습니다. PHP 4와 PHP 5 둘 다, `T_COMMENT` 상수가 //와 /* */를 모두 인식합니다. 그러나 PHP 5에서 도입한, PHP가 처리하는 PHPDoc 스타일 주석 /** */은, `T_DOC_COMMENT`로 인식합니다.
- variables_order가 "S"를 포함하고 있으면, $_SERVER는 argc와 argv를 가져야 합니다. 시스템이 $_SERVER를 생성하지 않게 설정하였다면, 물론 존재하지 않았습니다. 변경 후에는 variables_order 설정에 관계 없이, CLI 버전에서 argc와 argv를 사용할 수 있게 만듭니다. 또한, CLI 버전은 항상 전역의 $argc와 $argv도 가지게 되었습니다.
- 프로퍼티가 없는 객체를 더 이상 "빈" 것으로 판단하지 않습니다.
- 몇몇 경우에 클래스는 사용하기 전에 선언해야 합니다. 이는 PHP 5의 신기능(인터페이스 등)을 사용할 경우이며, 다른 경우엔 이전과 같습니다.
- get_class(), get_parent_class(), get_class_methods()가 클래스/메쏘드 이름을 선언한 대로(대소문자 구분) 반환하므로, 이전의 동작(클래스/메쏘드 이름을 항상 소문자로 반환)에 의존하는 스크립트에 문제가 발생합니다. 해결법 중 하나는 모든 스크립트에서 위 함수들을 검색하여 strtolower()을 적용하는 방법입니다. 이 대소문자 구분은 마법 예약 상수 `__CLASS__`, `__METHOD__`, `__FUNCTION__`에도 적용됩니다. 반환되는 값은 정확히 선언한 대로(대소문자 구분) 입니다.
- ip2long()에 잘못된 IP 주소를 인수로 넘겼을 때 이제 -1이 아닌 `FALSE`를 반환합니다.
- 포함한 파일에 함수 정의가 있으면, return()의 위치에 상관 없이 메인 파일에서 독립적으로 사용할 수 있습니다. 그 파일을 두번 포함하면, PHP 5는 함수가 이미 정의되어 있기에, 치명적인 오류를 발생합니다. PHP 4는 아무런 오류를 내지 않았었습니다. 포함하는 파일에서 포함 여부를 판단하고 리턴하는 대신, include_once()를 사용하길 권장합니다.
- include_once()와 require_once()은 윈도우에서 포함하는 파일의 경로를 정규화해서, A.php와 a.php는 한번만 포함하게 됩니다.

Example #1 strrpos()와 strripos()가 전체 문자열을 needle로 사용합니다.

`<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>`

Example #2 프로퍼티가 없는 객체를 더 이상 "빈" 것으로 판단하지 않습니다.

`<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// 이 부분이 실행됩니다.
}
?>`

Example #3 몇몇 경우에 클래스는 사용하기 전에 선언해야 합니다.

`<?php
// 오류 없이 실행:
$a = new a();
class a {
}
// 오류 발생:
$a = new b();
interface c {
}
class b implements c {
}
?>`

PHP 5.0.x부터 바뀐 것들
CLI와 CGI
PHP 4에서 PHP 5.0.x로 이행
PHP Manual