[링크]PHP4에서 PHP5로 넘어가면서 호환되지 않게 된 점들

오늘은 이 블로그를 내가 처음 만들면서 생각했던 기능인 [링크] 기능을 참 많이 활용하는 날인 듯하다.

궁금한 게 많았고, 찾아 볼 시간이 있었고, 흥미로운 게 많이 나왔기 때문이다.

여튼간에, PHP4에서 PHP5로 넘어가면서 호환되지 않게 된 점들을 설명한 문서가 PHP.net에 한글로 버젓이 있는 것을 발견했다.

그래서 퍼다놓기로 결정! 바뀐 점 전체를 보고 싶은 사람은 여기를 : 바뀐 점 전체 보기(한글)

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

기존 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[php버그를 수집하는 서버 다운으로 지금은 페이지가 사라졌다.-녹풍]를 확인하고, 매뉴얼에서 $_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는 argcargv를 가져야 합니다. 시스템이 $_SERVER를 생성하지 않게 설정하였다면, 물론 존재하지 않았습니다. 변경 후에는 variables_order 설정에 관계 없이, CLI 버전에서 argcargv를 사용할 수 있게 만듭니다. 또한, 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 {
}

?>

 

카테고리 글 목록 👉

대표글

댓글 남기기