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

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

QA

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

본문

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>

 

기본 개념을 잘 모르겠네요

 

 

 

귀찮아서


$sql  = " SELECT * from XXX ";
$result = sql_fetch($sql);
if (!$result) {
   $result_keys = [ 'type', 'color', 'color1', 'color2', 'color3'  ];
   foreach ($result_keys as $v) {
      $result[$v] = $result[$v] ?? null;
   }

 

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

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

이 질문에 댓글 쓰기 :

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

 

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

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

 

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

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

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

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

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

좋은 답변 감사드립니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 123,622 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT