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 버전이 올라가면서, 초창기의 유연함이 점점 사라지고 있는 것 같습니다.
그래도 기본만 지켜 작성하면 더 상위 버전이 나와도 문제 없을 겁니다.
default 값이 있는 경우가
대부분은 프로그램하기가 수월합니다.
문법적인 접근보다는 설계적인 관점에서 생각을 해보시는 것이 좋습니다.
문법이야 버전이 올라갈때마다 바뀌는 경우가 많습니다.
php언어 스타일은 유연하고 느슨한 형식 스타일이라 변수가 런타임 중에 내용을 변경할 수 있습니다.
(예: 문자열 $str = "9"; $num = $str + 3; //결과값 12 )
php7부터는 청크별로 메모리가 할당이 되기 때문에 웹서비스에서 시작시 이미 많은양의 메모리를 할당합니다. 무엇을 어떻게 하시든, 메모리에 대해서 크게 신경을 안쓰셔도 됩니다.
날로 코딩을 하면 어디서 시작을 했는지 잘 모르겠지만
기본적으로 선언을 하면 변수의 출처는 알 수 있겠죠..(설계적관점..)
그런 생각을 하고계신거 보니 잘하고 계신겁니다.