테스트 사이트 - 개발 중인 베타 버전입니다

PHP 변수 할당에 관련하여 PHP7, PHP8에서 에러가 나는 경우에 대한 경우 처리 방법에 대한 생각들이 궁금합니다. 채택완료

59xk 3년 전 조회 4,316

PHP7 이상 그리고 PHP8 부터

변수 할당(?)에 관련하여

(제가 전문적으로 배운 것은 아니라서 표현하는 용어자체가 틀릴 수도 있으니 양해 부탁 드립니다.)

 

많은 부분들이

$a = $result['mb_id'];

위와 같은 내용에서

$a = isset($result['mb_id'])?$result['mb_id']:'' ;

이렇게 변경된 경우가 많습니다 (그누보드에서)

 

제가 PHP7.3을 쓰다가 7.4로 바꿔보니

Array-style access of non-arrays

Trying to use values of type null, bool, int, float or resource as an array (such as $null["key"]) will now generate a notice.

(null, bool, int, float 또는 리소스 유형의 값을 배열(예: $null["key")로 사용하려고 하면 알림이 생성됩니다.)

 

위의 문제도 생기더군요

 

예를들면

$sql="select * XXX ";

$result = sql_fetch($sql);

 

위와 같이 조회하였을 때 조회된 내용이 없는 상태에서

echo $result['mb_id']; 하게 되면 알림이 생길 것 입니다.

 

해결 방법은

isset($result['mb_id'])?$result['mb_id']:null

$result['mb_id']&&null

등등 이 있는 것 같고 실제로 잘 해결 되고 있습니다만

 

제가 궁금한 점은

 

앞으로 PHP 사용에 있어서

어떠한 식으로 해결하는게 좋은지가 궁금하네요

 

이미 코딩 해둔 것들과도 연관이 있겠지만

저런 것들이 에러를 뿜어낸다면

$mb_id = isset($result['mb_id'])?$result['mb_id']:null;

이렇게 미리 $result 든 $post 든 모든 것들을

새로 변수에 할당 하여 사용하는게 좋은 방법인지

 

코딩에 대해서 전문적으로 배우지 않아서 그 기초랄까

그런게 궁금합니다

 

어떻게 코딩하느냐는 상황에 따라 다르겠지만

 

모든 내용을 새로 변수에 할당하여 사용하면?

그게 그만큼 자원(메모리?) 를 잡아 먹기 때문에

 

간략한 내용의 프로그램이라면 그냥 아래 두줄 중 2번 처럼 하는게 더 좋은건지

 

1. <span><?php echo $mb_id; ?></span>

2. <span><?php echo isset($result['mb_id'])?$result['mb_id']:null ?></span>

 

기본 개념을 잘 모르겠네요

 

 

 

귀찮아서

</p>

<p>$sql  = " SELECT * from XXX ";</p>

<p>$result = sql_fetch($sql);</p>

<p>if (!$result) {</p>

<p>   $result_keys = [ 'type', 'color', 'color1', 'color2', 'color3'  ];</p>

<p>   foreach ($result_keys as $v) {</p>

<p>      $result[$v] = $result[$v] ?? null;</p>

<p>   }</p>

<p>

 

저는 이렇게 변수를 미리 할당하여 에러가 안나도록 하고 있는데

잘하고 있는건지 궁금하네요

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
B
3년 전

PHP 7.0 버전부터 Null coalescing operator 사용이 가능합니다.

- https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

 

<span><?=$result['mb_id']??''?></span>처럼 사용하면 됩니다.

미만 버전은

<span><?=isset($result['mb_id'])?$result['mb_id']:''?></span>

 

* PHP v5.4 이상부터 설정과 상관없이 <?= 표현이 가능합니다.

 

 

모든 항목에 적용 시 코드가 길어지기 때문에

질문 하단처럼 대상 값이 없을 때 기본값 설정해주는 것도 좋은 방법입니다.

참고로 array_fill_keys() 함수를 사용하면 질문의 코드를 줄일 수 있습니다.

 

if ( !$result ) $result = array_fill_keys(['mb_id', 'type', 'color', 'color1', 'color2', 'color3'], '');

<span><?=$result['mb_id']?></span>

 

+ array_fill_keys()

- https://www.php.net/manual/en/function.array-fill-keys.php

 

 

중요한 것은 오류가 발생하지 않도록 작성하는 것이죠.

 

PHP 버전이 올라가면서, 초창기의 유연함이 점점 사라지고 있는 것 같습니다.

그래도 기본만 지켜 작성하면 더 상위 버전이 나와도 문제 없을 겁니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

문법적인 접근보다는 설계적인 관점에서 생각을 해보시는 것이 좋습니다.

문법이야 버전이 올라갈때마다 바뀌는 경우가 많습니다.

 

php언어 스타일은 유연하고 느슨한 형식 스타일이라 변수가 런타임 중에 내용을 변경할 수 있습니다.

(예: 문자열 $str = "9"; $num = $str + 3; //결과값 12 )

 

php7부터는 청크별로 메모리가 할당이 되기 때문에 웹서비스에서 시작시 이미 많은양의 메모리를 할당합니다. 무엇을 어떻게 하시든, 메모리에 대해서 크게 신경을 안쓰셔도 됩니다.

 

날로 코딩을 하면 어디서 시작을 했는지 잘 모르겠지만

기본적으로 선언을 하면 변수의 출처는 알 수 있겠죠..(설계적관점..)

 

그런 생각을 하고계신거 보니 잘하고 계신겁니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

5
59xk
3년 전
감사합니다. 가장 적절한 답변을 주신 것 같습니다 채택을 드렸어야 했는데 가장 먼저 해주신 분께 하였습니다.

변수를 미리 초기화(OR할당) 하는 것 자체는 퍼포먼스 적으로 별 차이가 없을 거라는 것과 마찬가지 이네요
결국 얼마 안되는 내용은 이러나 저러나 별반 차이가 없으니

설계적으로 훨씬 용이하고 유지 보수가 편한 쪽이 더 좋겠구나 하는 생각이 들었고
아마도
다시 변수 할당을 새로 하지 않는 것은
(%_POST['XX'] 같은 경우나 $arr['XX'], $sql_result['XX'] 같은 것들)

아무래도 예전 PHP에서 유연하게 코딩이 가능 하다보니 생략한 것이 맞는 것 같네요

좋은 답변 감사드립니다.

댓글을 작성하려면 로그인이 필요합니다.

default 값이 있는 경우가 

대부분은 프로그램하기가 수월합니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인