본문 바로가기
재밌는 IT 개발/프로그래밍 자료 모음

PHP5에서 PHP7 업그레이드할때 발생하는 문제들의 해결 방안

by 만수킴 2020. 7. 21.

* 공식 문서 : www.php.net/manual/en/migration74.deprecated.php

 

PHP: Deprecated Features - Manual

 

www.php.net

1. Magic Quotes를 쓸 수 없음. (get_magic_quotes_gpc() 관련 함수)

if (get_magic_quotes_gpc()) { 
	$value = stripslashes($value); 
}



if ( function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() ) { 
	$value = stripslashes($value); 
}


if ( version_compare(phpversion(), '7.0.0', '>=') )
	$value = stripslashes($value);
else
	if (get_magic_quotes_gpc()) { $value = stripslashes($value); }

 

2. count() 함수
   - 에러 메세지 : Warning: count(): Parameter must be an array or an object that implements Countable in ...

for ( $i=0; $i<count($doRs); $i++ ) {	
	// ... ... ...
}
Warning: count(): Parameter must be an array or an object that implements Countable in ...


for ( $i=0; is_countable($doRs) && $i<count($doRs); $i++ ) {	
	// ... ... ...
}
// PHP7과 PHP5 버전에서 같이 써야 할 경우 다음과 같이 공통함수에 넣어놓자!
// is_countable 함수는 php7 이상에만 있음으로...
if (!function_exists('is_countable')) {
    function is_countable($var) {
        return (is_array($var) || $var instanceof Countable);
    }
}

3. 배열 및 문자열에서 중괄호 사용 금지 (Curly bracket)
  PHP Deprecated: Array and string offset access syntax with curly braces is deprecated in ... on line 9567

({([$,-,+,*,\/\w]+)\})

/*
위 정규식으로 IDE에서 전체 파일 검색을 진행하면 모두 찾을 수 있다.
단!!! 정규식에 있는 {}도 검색이 되니 이 부분은 잘 피해가자!!!
아... 또!!! 문자열 중간에 {$foo}와 같은 것들도 검색되니 잘 피해가자!!!
*/
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
    for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));


$c = substr(str_pad(decbin(ord($str[$len])),8,'0',STR_PAD_LEFT),0,2);
if ($c == '10')
    for (;$c != '11' && $c[0] == 1;$c = substr(str_pad(decbin(ord($str[--$len])),8,'0',STR_PAD_LEFT),0,2));

 

4. Short Open Tag 사용 금지

<? echo $foo; ?>


<?php echo $foo; ?>

 

5. real 타입과 is_real() 함수 삭제

$float_val = (real)$float_val;
if ( is_real($float_val) ) {
	// ... ... 
}



$float_val = (float)$float_val;
if ( is_float($float_val) ) {
	// ... ... 
}

 

6. PHP Deprecated: Cannot use "parent" when current class scope has no parent in ... on line 9567

parent::SetError("No connection");

$this->SetError("No connection");

단, __construct와 __destruct는 그대로 둘 것. 이유는 모름...
parent::__construct(...
parent::__destruct(...

 

7. 미리 선언되지 않은 상수
   미리 선언되지 않은 상수가 사용이 될때 Warning에러 발생 (원래 나는거 아니였나? 왜 7에서만 보이는건지...)
  Warning: Use of undefined constant T_URL - assumed 'T_URL' (this will throw an Error in a future version of PHP) in M:\***R***\K***_PHP\******.lib.php on line 1085

if (!$url) $url = T_URL;
===> 선언되지 안흔 상수를 지우고 특정한 값을 지정해버리거나, 
===> 사용한 상수를 상단 어딘가에 미리 선언하라.

 

8. 배열에 접근하려는 offset의 값이 null인 경우
  Notice:  Trying to access array offset on value of type null in

$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);


$crTmp = isset($cOTLdata['char_data']) ? (int)$content_range[1] : 0;
$uploaded_bytes = $this->fix_integer_overflow($crTmp);

 

9. 숫자의 사칙연산 수행시 숫자가 아닌 것과 연산을 하면 Notice 에러 발생
   Notice: A non well formed numeric value encountered in

    function get_config_bytes($val) {
        $val = trim($val);
        $last = strtolower($val[strlen($val)-1]);
        $val = (int)$val;  //<== $val을 정수로 변환하면 에러 발생 안함.
        switch($last) {
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }
        return $this->fix_integer_overflow($val);
    }

 

10. loop 또는 switch 문에서는 break를 쓸 수 없다. 
     Fatal error:  'break' not in the 'loop' or 'switch' context in ...
     break를 쓰면 안되고, return을 써야 한다... 고 한다...
     그러나 문제는 또 다른 곳에서도 발생한다. 
     break를 쓸 일이 없는 경우에 사용해도 동일한 에러가 발생한다.

	public static function TYPE($value = NULL) {
		$value	= self::flattenArrayIndexed($value);
		if (is_array($value) && (count($value) > 1)) {
			$a = array_keys($value);
			$a = array_pop($a);
			//	Range of cells is an error
			if (self::isCellValue($a)) {
				return 16;
			//	Test for Matrix
			} elseif (self::isMatrixValue($a)) {
				return 64;
			}
		} elseif(empty($value)) {
			//	Empty Cell
			return 1;
		}
		$value	= self::flattenSingleValue($value);

		if (($value === NULL) || (is_float($value)) || (is_int($value))) {
				return 1;
		} elseif(is_bool($value)) {
				return 4;
		} elseif(is_array($value)) {
				return 64;
				break;    //<== 삭제해야 한다.
		} elseif(is_string($value)) {
			//	Errors
			if ((strlen($value) > 0) && ($value[0] == '#')) {
				return 16;
			}
			return 2;
		}
		return 0;
	}	//	function TYPE()


11. switch문에서도 "continue"를 쓸 수 있었다. PHP7부터는 "continue 2;"라고 써야 한다.
     Warning:  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in      

			switch ($type) {
			case self::OLE_PPS_TYPE_ROOT:
				$pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array());
				$this->root = $pps;
				break;
			case self::OLE_PPS_TYPE_DIR:
				$pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null,
								   null, null, null, null, array());
				break;
			case self::OLE_PPS_TYPE_FILE:
				$pps = new PHPExcel_Shared_OLE_PPS_File($name);
				break;
			default:
				continue;  //<== continue 2; 로 변경하라.
			}

 

실전 예제(?) 걍 내 소스... 중복 처리 위하여...

		if ( get_magic_quotes_gpc() )
			$value = htmlspecialchars( stripslashes((string)$value) );
		else
			$value = htmlspecialchars( (string)$value );
--------------------------------------------------------------------------          
		if ( version_compare(phpversion(), '7.0.0', '>=') ) 
			$value = htmlspecialchars( stripslashes((string)$value) );
		else 
			if ( get_magic_quotes_gpc() ) 
				$value = stripslashes($value); 
			else 
				$value = htmlspecialchars( (string)$value );  
==========================================================================
					if (get_magic_quotes_gpc()) {
						$value = stripslashes($value);
					}
--------------------------------------------------------------------------  
					if ( version_compare(phpversion(), '7.0.0', '>=') ) 
						$value = stripslashes((string)$value);
					else 
						if (get_magic_quotes_gpc())
							$value = stripslashes($value);
==========================================================================
if( !get_magic_quotes_gpc() )
--------------------------------------------------------------------------  
if ( function_exists('get_magic_quotes_gpc') && !get_magic_quotes_gpc() )
==========================================================================
		parent::ResetError();	// 에러 셋팅
		if (! parent::IsConnected()) { // DB 연결 여부 확인
			parent::SetError("No connection");
			return false;
		} else {
			$sql = parent::BuildSQLSelect($tableName, $whereArray,
					$columns, $sortColumns, $sortAscending, $limit);
			// Execute the UPDATE
			if (! parent::Query($sql)) {
				return parent::last_result;
			} else {
				return true;
			}
		}
--------------------------------------------------------------------------  
		$this->ResetError();	// 에러 셋팅
		if (! $this::IsConnected()) { // DB 연결 여부 확인
			$this->SetError("No connection");
			return false;
		} else {
			$sql = $this->BuildSQLSelect($tableName, $whereArray,
					$columns, $sortColumns, $sortAscending, $limit);
			// Execute the UPDATE
			if (! $this->Query($sql)) {
				return $this->last_result;
			} else {
				return true;
			}
		}
==========================================================================
// 한글 한글자(2byte, 유니코드 3byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
// 유니코드는 http://g4uni.winnwe.net/bbs/board.php?bo_table=g4uni_faq&wr_id=7 의 Mr.Learn님의 글을 참고하였습니다.
function cutString($str, $len, $suffix="…")
{
    $c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
        for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
    return substr($str,0,$len).(strlen($str)-strlen($suffix) >= $len ? $suffix : '');
}

function cutStringHangul ($str, $len, $suffix="…") {
    $c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
        for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
    $tmp = substr($str,0,$len).(strlen($str)-strlen($suffix) >= $len ? $suffix : '');
	return cutHangulLast($tmp);
}
--------------------------------------------------------------------------  
// 한글 한글자(2byte, 유니코드 3byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
// 유니코드는 http://g4uni.winnwe.net/bbs/board.php?bo_table=g4uni_faq&wr_id=7 의 Mr.Learn님의 글을 참고하였습니다.
function cutString($str, $len, $suffix="…")
{
    $c = substr(str_pad(decbin(ord($str[$len])),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
        for (;$c != '11' && $c[0] == 1;$c = substr(str_pad(decbin(ord($str[--$len])),8,'0',STR_PAD_LEFT),0,2));
    return substr($str,0,$len).(strlen($str)-strlen($suffix) >= $len ? $suffix : '');
}

function cutStringHangul ($str, $len, $suffix="…") {
    $c = substr(str_pad(decbin(ord($str[$len])),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
        for (;$c != '11' && $c[0] == 1;$c = substr(str_pad(decbin(ord($str[--$len])),8,'0',STR_PAD_LEFT),0,2));
    $tmp = substr($str,0,$len).(strlen($str)-strlen($suffix) >= $len ? $suffix : '');
	return cutHangulLast($tmp);
}
==========================================================================
for ($i=0; $i<count($authResult); $i++){
--------------------------------------------------------------------------  
for ($i=0; is_countable($authResult) && $i<count($authResult); $i++){
==========================================================================
if (!$url) $url = T_URL; //미리 선언 되지 않은 상수.
--------------------------------------------------------------------------  
if (!$url) $url = "/index.php";
==========================================================================
$uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
--------------------------------------------------------------------------  
$crTmp = isset($cOTLdata['char_data']) ? (int)$content_range[1] : 0;
$uploaded_bytes = $this->fix_integer_overflow($crTmp);
==========================================================================
    function get_config_bytes($val) {
        $val = trim($val);
        $last = strtolower($val[strlen($val)-1]);
        switch($last) {
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }
        return $this->fix_integer_overflow($val);
    }
--------------------------------------------------------------------------  
    function get_config_bytes($val) {
        $val = trim($val);
        $last = strtolower($val[strlen($val)-1]);
        $val = (int)$val; //숫자 연산시 형을 명확히 지졍하지 않으면 Notice 에러 발생함. by tank. at 200726.
        switch($last) {
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }
        return $this->fix_integer_overflow($val);
    }
==========================================================================
	public static function utf16_decode($str, $bom_be = TRUE) {
		if( strlen($str) < 2 ) return $str;
		$c0 = ord($str{0});
		$c1 = ord($str{1});
		if( $c0 == 0xfe && $c1 == 0xff ) { $str = substr($str,2); }
		elseif( $c0 == 0xff && $c1 == 0xfe ) { $str = substr($str,2); $bom_be = false; }
		$len = strlen($str);
		$newstr = '';
		for($i=0;$i<$len;$i+=2) {
			if( $bom_be ) { $val = ord($str{$i})   << 4; $val += ord($str{$i+1}); }
			else {        $val = ord($str{$i+1}) << 4; $val += ord($str{$i}); }
			$newstr .= ($val == 0x228) ? "\n" : chr($val);
		}
		return $newstr;
	}
--------------------------------------------------------------------------  
	public static function utf16_decode($str, $bom_be = TRUE) {
		if( strlen($str) < 2 ) return $str;
		$c0 = ord($str[0]);
		$c1 = ord($str[1]);
		if( $c0 == 0xfe && $c1 == 0xff ) { $str = substr($str,2); }
		elseif( $c0 == 0xff && $c1 == 0xfe ) { $str = substr($str,2); $bom_be = false; }
		$len = strlen($str);
		$newstr = '';
		for($i=0;$i<$len;$i+=2) {
			if( $bom_be ) { $val = ord($str[$i])   << 4; $val += ord($str[$i+1]); }
			else {        $val = ord($str[$i+1]) << 4; $val += ord($str[$i]); }
			$newstr .= ($val == 0x228) ? "\n" : chr($val);
		}
		return $newstr;
	}
==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================

--------------------------------------------------------------------------  

==========================================================================
        

 

댓글