많은 PHP 개발자들이 isset () 및 / 또는 empty ()와 같은 PHP의 유사하게 방어 기능을 사용하는 것을 싫어하는 이유는 무엇입니까?


27

stackoverflow 에서이 문제는 항상 발생합니다.

심지어 페카 (고체 PHP 조언을 많이 제공) 지칠대로 지친에 충돌 한 E_NOTICE괴물과 희망 사용하는 것보다 더 나은 솔루션 isset(): 는 isset () 못생긴 비우 () 메이크 코드

개인적으로, 나는 사용 isset()하고 empty()여러 곳에서 내 응용 프로그램의 흐름을 관리 할 수 있습니다. 예를 들면 다음과 같습니다.

public function do_something($optional_parameter = NULL) {
    if (!empty($optional_parameter)) {
        // do optional stuff with the contents of $optional_parameter
    }
    // do mandatory stuff
}  

다음과 같은 간단한 스 니펫도 :

if (!isset($_REQUEST['form_var'])) {
    // something's missing, do something about it.
}

나에게 매우 논리적으로 보인다. 부풀어 오른 것처럼 보이지 않고 안정적인 코드처럼 보입니다. 그러나 많은 개발자가 E_NOTICE활성화 된 상태에서 응용 프로그램을 실행 하고 많은 "초기화되지 않은 배열 인덱스"알림을 발견 한 다음 정의 된 변수를 확인하고 코드를 "글리터링"할 수 있다는 점에서 얼굴을 찡그 isset()립니다.

다른 언어가 다르게 처리한다고 가정합니다. 경험상 말하면, JavaScript는 PHP만큼 예의가 없습니다. 정의되지 않은 변수는 일반적으로 스크립트 실행을 중단합니다. 또한 ( 경험이 없다고 말하면 ) C / C ++와 같은 언어는 단순히 컴파일을 거부 할 것이라고 확신합니다.

PHP 개발자는 게으른가요? (당신에 대해 이야기하지 않고, Pekka, 나는 당신이 오래된 응용 프로그램을 리팩토링하고 있다는 것을 알고 있습니다.) 아니면 다른 언어가 정의되지 않은 변수를 정의했는지 프로그래머가 먼저 정의했는지 확인하는 것보다 더 우아하게 처리합니까?

( E_NOTICE정의되지 않은 변수 외에 다른 메시지가 있지만 가장 혼란을 일으키는 메시지 인 것 같습니다.)

부록
지금까지의 답변에서, 나는 isset()코드 팽창이 아니라고 생각하는 유일한 사람 이 아닙니다. 그래서 지금 궁금합니다. 다른 언어로 프로그래머에게 문제가 있습니까? 아니면 이것은 단지 PHP 문화 문제입니까?


4
슬프게도 "경고"가 꺼진 PHP 개발자의 작업도 보았습니다.
Viper_Sb

아야. 즉 입니다 슬픈.
Stephen

1
PHP 사용자가 아닌 이유 : 왜 정의되지 않은 변수를 확인해야합니까?
Winston Ewert

2
@Winston : 다른 많은 언어와 달리 PHP의 문제점은 PHP가 많은 구성 조합을 허용한다는 것입니다. 예를 들어, 프로그래머는 경고, 통지 및 폐기 알림을 무시하기로 결정할 수 있습니다. 보다 숙련 된 개발자는 error_reporting 세트를 사용하여 모든 것을보고합니다. PHP에는 예외를 던지기보다는 오류를 던지고 상태 코드를 반환하는 많은 함수가 있습니다. 방어 적으로 그리고 성공적으로 코딩하기 위해서는 언어와 매우 친밀해야합니다. 다른 많은 언어들은 선택을 허용하지 않습니다. 엄격함은 일반적으로 기본적이고 유일한 옵션입니다.
Wil Moore III

1
추가하는 자세한 정보 때문에 isset ()을 싫어합니다. @의 더 나은 형태는 좋은 대안이 될 것입니다.
Kzqai

답변:


34

나는 코딩 E_STRICT하고 아무것도 없다.

비어 있고 isset 검사를 사용하면 코드가보기 흉하지 않게되어 코드가 더 장황 해집니다. 내 마음에 그것들을 사용하여 발생할 수있는 절대 최악의 것은 무엇입니까? 문자를 몇 개 더 입력합니다.

최소한 경고로 사용하지 않은 결과를 확인합니다.


7
내 개발 환경도 있습니다 E_STRICT. 프로덕션의 모든 오류를 억제하지만 개발 과정에서 나에게 아무것도 미끄러지지 않도록합니다.
Stephen

2
+1 조쉬, 나도 똑같아. E_STRICT로 프로그래밍하면 코드에 놀라지 않을 것임을 수 있습니다. 비행하는 유일한 방법, imo.
EricBoersma

3
@Stephen : 항상 생산 오류를 끄십시오. 그것은 단지 안전망 일뿐입니다. 개발 (IMO)은 항상이어야 E_STRICT합니다. 코드를 작성하고 모든 경고 및 오류를 해결하십시오.
Josh K

나 한테 앵무새하고 있니? :)
Stephen

@Stephen : 동의합니다. :)
Josh K

17

알 수없는 요소에 대한 통지는 PHP의 디자인 실수라고 생각합니다. 나는 확실히 지금은 실수를 수정하는 것이 가능 아니지만, 그것은 같은 상용구 코드를 많이 생산 if(isset($foo['abc']) && $foo['abc'] == '123')-이 코드가 가를 isset특정 장소에 '123'이 있는지 확인하는 것입니다 의도 때문에, $foo아무것도 존재하지 않는 경우가있다 확실히 '123'이 아닙니다. PHP에서이 불행한 디자인 실수로 인해 코드를 두 배나 많이 작성해야하는 유일한 이유는 다음과 같습니다. 그리고 유감스럽게도 PHP에서 통지는 매우 비싸므로,이를 비활성화하는 것은 성능이 중요한 코드의 옵션이 아닙니다.

예, 코드를 못 생기게 만들며 성가 시게합니다. 그리고 그것은 경험 부족으로 인한 것이 아닙니다. 1998 년 이후로 PHP를 사용 .php3하고 있으며 확장 기능 이있을 때를 기억 하며 "PHP 2가 아닙니다"라는 의미입니다. 어쩌면 나는 게으르다 :) 그러나 게으름-적어도 특정 유형-프로그래머에게는 미덕이다.

반면에, 유효 사용 isset하고 empty- 그냥 원래의 게시물에있는 것과 같은이 - 괜찮습니다. PHP가 isset/empty실제로 필요하지 않은 곳의 경고에 대해 열심이라고 생각 합니다.


3
권리. 자세한 문제입니다. $eg = isset($_GET['eg'])? $_GET['eg'] : null;어리석게 장황하다. 나는 $eg = @$_GET['eg'];"이 배열의 존재하지 않는 것을 받아들이는 것" 이라는 짧은 의미로 "오류 억압"이 아닌 다른 연산자가 있었으면 좋겠다 . 요즘에는 짧은 기능을 사용하는 경향이 있습니다.
Kzqai

7
동의했다. 4 년 후, Null Coalesce Operator ( wiki.php.net/rfc/isset_ternary) 를 입력하십시오$eg = $_GET['eg'] ?? null;
Steve

또는 오류 억제 연산자를 사용하여 지금 수행하십시오 (예 :) $eg = @$_GET['eg'] ?: null;. 나는 일반적으로 그것을 사용하지 않지만,이 경우 우리는 그 오류를 명시 적으로 기대하고 그것을 무시하기로 결정합니다. null 병합보다 한 문자 길이가 길고 좋지 않습니다 (모든 오류를 억제하고 ArrayAccess가 배열뿐만 아니라 펑키 한 일을 할 수도 있음). 일반적으로 작업을 수행합니다.
El Yobo

12

나는 자유 언어로서 웹에서 해석되고 사용되는 PHP는 왜 방어 적이 지 않은 코드를 사용해야하는지에 대해 잘 모르고 경고를 또 다른 불필요한 오류로 보는 전문가가 아닌 훈련되지 않은 코더의 비율이 매우 높다고 생각합니다. .

저는 주니어 개발자와 자습 스크립트 코더로부터 이러한 요점을 항상 듣습니다.

  • 어쨌든 변수가 존재하면 변수를 초기화하는 이유는 무엇입니까?
  • 왜 우리가 그것을 사용하기 전에 무언가가 있는지 확인하면 정의되지 않은 것은 어쨌든 거짓입니까?
  • @ 접두사로 코드를 수정하면 왜 문제가 복잡합니까?

강력한 형식의 언어를 경험 한 적이 없거나 선언되지 않은 / 인스턴스화되지 않은 변수의 함정을 경험 한 경우에는 약간의 설득력이 있습니다. 나는 보통 한 시간 동안 코드 디버깅의 즐거움을 경험 한 후에 문제를 일으키는 변수 이름의 오타가 있음을 알게되면 보통 제공합니다.

다른 강력한 요소는 웹 산업에서 PHP를 사용하는 것인데, 이는 안전 및 코드 품질보다 처리량에 훨씬 더 관심이있는 경향이 있습니다.


10
"PHP [...]는 비전문가, 훈련되지 않은 코더의 비율이 매우 높다고 생각합니다."전용 PHP 개발자는 더 이상 동의 할 수 없습니다. +1
Stephen

@Stephen 글쎄요, 저는 최근에 주로 PHP와 jQuery로 코드를 작성하고 있습니다. 비록 공식적인 교육을 받았지만, 당신이 전에 책임을지는 전문가라고 생각하는 코드는 때때로 믿음을 무시합니다. ;-)
초에 Orbling

1
나는 그것이 PHP의 실제 문제라고 생각합니다. 언어의 일부 단점 (각각 새로운 버전에서 천천히 해결되고 있음) 외에도 주변에 아마추어주의의 분위기가 있습니다. 나는 전문 PHP 개발자가 때때로 좌절감을 느낄 수 있다고 상상할 수 있습니다.
Erik van Brakel

1
@Erik PHP는 10 년 전 Perl에 비해 상대적으로 열악했으며, 특히 웹 사용에있어 상당히 합리적인 해석 언어입니다. Facebook과 같은 회사에서 사용하는 이유가 있습니다. 그러나 어디에서나 사용할 수 있기 때문에 아마추어 세트는 광범위하게 사용하며 이는 명성을 손상시킵니다.
Orble

5

네, 그들은 게으르다. 어쨌든 그들 중 많은 ...

불행히도 많은 PHP 코더의 사고 방식은 "변수 누락 등으로 인한 오류를 처리하기 위해 언어에 의존하여 동일한 최종 결과를 더 빨리 얻을 수 있다면 방어 적으로 포인트 코딩이 없다"는 것입니다. 나는 그들 중 몇몇과 함께 일했다는 것을 안다.

그들은 올바른 오류 처리 및보고가 부족하여 몇 시간 동안 라이브 서버를 가져갈 때 이른 점심으로 신비롭게 향하는 사람들이기도합니다 ...


5
PHP 코더에 대한 주관적인 의견은 -1입니다.
Josh K

4
@Josh, 4 년 반 동안 선임 PHP 코더로 근무했으며 1999 년부터 PHP를 온 / 오프로 코딩 한 결과 다소 주관적입니다. 나는 "다른 한편으로는, 경험 많은 PHP 코더가 지연되지 않고 제대로 일을"로 자격이 있어야합니다 ...
Gruffputs

1
당신이 가지고 있어야합니다.
Josh K

5

데이터 전송 객체로 배열을 사용하지 않고 isset () 및 empty () 사용을 피하려고합니다. 정상적인 기본값으로 제한된 속성 집합을 허용하고 해당 속성에 대한 입력의 유효성을 검사하도록 구성 할 수있는 클래스를 만듭니다. ArrayAccess 인터페이스를 구현하여 배열처럼 사용할 수도 있습니다. 또한 누군가가 메소드에 잘못된 유형의 엔티티를 전달하려고 할 때 오류를 포착하기 위해 메소드 서명에 유형 힌트를 사용할 수 있습니다.


매우 흥미로운 접근법.
Toby

2

질문 중 하나는 내 것이므로 다시 말씀 드리겠습니다.

많은 개발자 isset()가 품질 표시로 많은 부분 을 오해합니다. 그것은 신뢰성의 외관을 제공하고 어떤 사람들은 그것을 보안 기능으로 생각합니다.

그러나 PHP는 컴파일 된 언어가 아니라는 점을 고려해야합니다. 동적 유형 시스템을 가진 스크립팅 언어입니다. E_NOTICE 오류는 이름 별 오류 일뿐입니다. 그리고 통지를 억제 하려는 의도 로만 많은 isset것이 사용 된다면 실제로 는 언어에 대해서만 코딩하는 것입니다 .

PHP 개발자는 게으른가요?

많은 통지와 경고가 표시되는 경우가 사실입니다. 많은 초보자가 통지에 신경 쓰지 않으며 일반적으로 완전히 비활성화 된 결과입니다 error_reporting(0).

그러나 다른 개발자가 @가 아니거나 억압 당하지 않았기 때문에 E_NOTICE를 인식하지 못한다고 잘못 알고 있습니다. 적어도 그것은 유지 통지 문제 뒤에 내 의도였다 . 그것들은 제거 할 것이 아니라 때때로 중요한 디버그 정보입니다.

모든 일반화와 마찬가지로, isset을 고려하지 않아도 최적의 코드가 생성되지는 않습니다. 필요한 장소 issetempty필요한 장소 및 구문 소금 을 구별하는 것이 중요합니다 .

아니면 이것은 단지 PHP 문화 문제입니까?

정의되지 않은 변수 "오류"는 PHP 문제 만은 아닙니다. Bash, TCL 및 Perl 또는 JavaScript는 정의되지 않은 변수의 사용을 허용합니다. 그러나이 비현실적인 언어 기능은 결함으로 보이지 않습니다. 정의되지 않은 값을 확인하기위한 유사한 언어 구성이 있습니다. 그러나 undef 값이 "error"로 잘못 특성화되지 않기 때문에 PHP 에서처럼 지속적으로 사용되지는 않습니다.


1

흥미 롭군 나는 거의 isset ()을 사용하지 않습니다. 내 PHP 코드는 변수가 처음 설정되었는지 알 수없는 상태가 아닙니다. 사용 된 모든 GET 또는 POST 변수는 존재하지 않는 경우 기본값을 제공하는 함수를 통해 액세스됩니다. 함수 호출의 기본값은 일반적으로 명시 적으로 0 또는 빈 문자열로 설정됩니다.


+1. 함수 나 클래스 메소드에 전달하는 것은 좋은 해결책입니다. 실제로 마십시오 이렇게하지만, 내 위의 예제는 여전히 깨끗하고 나에게 않은 부풀어 볼 꼬집어.
Stephen

0

나는 isset을 사용하고 많이 비 웁니다. 그러나 대부분이 누군가가 매개 변수를 망친 경우를 대비하여 $ _REQUEST 처리와 같이 언급하는 장소입니다. 주위를 비행하는 모든 변수를 제어 할 수있는 경우 일반적으로 필요하지 않습니다.


0

나는 isset을 사용하는 것을 좋아하지 않지만 다른 코드가 수행하는 대량의 코드가 있으면 절약 할 수 있습니다. 이 문제를 해결하기 위해 아래의 wee 코드를 작성했습니다 .isset () 대신 isseter ($ a, $ b)는 $ a가 정의되지 않았거나 비어 있거나 함수가 null을 반환하면 $ b를 반환합니다. 개선 사항은 다음과 같습니다.

//returns var or NULL (if undefined)
//$reserve optional second value is returned as $default if undefined
function isseter(&$default,&$reserve=NULL)
{
$default = isset($default) ? $default : NULL;
$reserve = isset($reserve) ? $reserve : NULL;
if ((!$default) && ($reserve)) $default=$reserve;
return $default;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.