2013-02-22 2 views
4

나에게 나는이 매우 특정 코드의 경우에 부탁 해요이

if(@$_GET['key'] === '123') 
{... 

대신이

if(isset($_GET['key']) && ($_GET['key'] === '123')) 
{... 

을 할 수있는 하나의 좋은 이유를 및 일반적으로 아닙니다!

다음과 같은 이유로 환영하지 않습니다 ". 오류가 어쨌든 (이 supressed 될지라도) 만들어지기 때문에 일부 나노초하여 응용 프로그램을 느려집니다 @을 사용는"

  • 그럼 난 느린 코드를 선호 더 읽기 쉽습니다.
  • "@는 나쁜 습관이다 사용.는"그것은 일반적으로 사실 일 수도 있지만이 경우 (또한 나쁜 습관이 들이 제안 fopen 같은 기능에 PHP 매뉴얼에, 상황에 따라 수에 믿지 않는다
+0

그래서 당신은 오류 억제하면 코드 읽기가 쉬워라고 생각 사용할 수 있습니다

if($_GET['key'] ?? '' === '123') {} 

기본적으로 이것에 대한 대체?!? wtf! –

+1

이 작업을 수행 할 수있는 동안 전체 GET 함수를 정의하는 것이 가장 좋은 이유는 무엇입니까? –

+0

복구 가능성. 일반적인'isset' 마샬링은 변수가 설정되지 않았는지 알아내는 것을 불가능하게 만들 것이며 항상 대체 값으로 대체합니다. '@'억제는 되돌릴 수 있습니다. 나중에 뭔가를 디버그 할 필요가 없다는 것이 확실하다면,'isset'을 사용하십시오. 입력 매개 변수가 중요/보안 관련 (그리고 로깅 오류 핸들러 사용) 일 경우'@'를 사용하십시오. – mario

답변

1

에 대해 생각) http://www.php.net/manual/en/function.fopen.php에서 에러/예외를 참조 특정 circumstainces에 @을 사용하는 얼마나 당신은 당신의 응용 프로그램을 느리게 할 수 귀하의 웹 사이트/응용 프로그램은 요청의 수천 개 (또는 그 이상)의 수십/수백을 받고 시작할 때 하루. 오류를 표준으로 사용하지 않는다면 모든 요청에 ​​대해 수십 가지가있을 것입니다. 갑자기 사이트가 눈에 띄게 느려지 게됩니다.

이 외에도 개발 중에 실제로 알고 싶어하는 오류를 억제 할 수 있습니다.

+0

나는 이것에 동의한다 @ @ 코드를 훨씬 느리게 만든다. –

+1

""오류가 어쨌든 (이 supressed 될지라도) 만들어지기 때문에 사용 @ 몇 나노초하여 응용 프로그램을 느리게 할 것이다. "그럼 난 느린 코드를하지만, 더 읽기를 좋아한다." – Nick

+0

코드를 프로파일 링 해 본 적이 있습니까? 아마 작은 따옴표만을 사용하고 있습니까? – mario

4

성능에 미치는 영향은 실제로이 예제에 대한 최상의 인수가 아니며 문제인지 여부를 결정하기 위해 자체 응용 프로그램의 성능을 측정해야합니다. 많은 수의 항목이 설정되지 않았거나 루프와 같은 검사를 한 경우 속도가 느려질 수 있습니다.

if(@IsAvailable()) { 
:

@ 연산자를 사용과 관련된 주요 문제는 귀하의 예제는 무해한 것처럼 보일 수 있지만, 나중에 사용하여 자신이나 팀을 찾을 수 있도록 코드에서 대회가 될 가능성이 있다는 것이다

그리고 오류 억제는 예상하지 못한 실제 오류를 숨기 시작합니다. 예외 정보를 전혀 얻지 못하면 어떤 일이 일어 났는지 전혀 알지 못합니다.

+1

네, 그렇게하지 않는 것이 가장 중요한 이유라고 생각합니다. 나중에 코드에서 숨길 수 있으므로 숨길 수 있습니다. +1 –

0

성능 문제를 인수로 사용하지 않으면 실제로 성공한 것입니다. 그러나 모든 경우에있을 필요는 없습니다. 왜냐하면 @는 가능한 모든 오류를 억제 할 것이기 때문입니다. 그러나이 경우에는 당신이 원하지 않는 다른 오류는 없다고 생각됩니다.

값을 읽기 전에 isset()가 매우 추악하고 나는 그것을 쓰고 싶지 않다는 것에 동의합니다. 하지만 삽입하기 전에 @ 성명을 못생긴 것 같다. 긴 코드에서 가독성을 떨어 뜨릴 수 있습니다.

좋은 소식은 PHP 7 이후 우리는 훨씬 더 멋진 방식을 사용할 수 있다는 것입니다. null-coalescence 연산자 ?? 이는 다음과 같이 작동

지금
$result = isset($value) ? $value : $anotherValue; 

당신이

$result = $value ?? $anotherValue;