PHP에서 재미있는 버그를 만드는 문자 위치 오류

8206 단어 php
PHP 개발자로서 몇 년 동안 경력을 쌓는 동안 나는 물론 대부분이 php 버그가 아닌 몇 가지 버그에 직면했습니다.
좋아 보이는 스니펫에 너무 많은 시간을 할애할 수 있지만 예상한 결과를 얻지 못하고 마침내 어딘가에서 놓친 작은 것을 발견할 수 있습니다.
다음은 작업할 때 더 신중하게 만든 PHP에 대한 몇 가지 사실 목록입니다.

1. 조건 결과에 관계없이 항상 실행 중이면 참인지 아닌지에 대한 설명

$age= 17;

if( $age > 18 ); {
    echo you can get a license;
}



이 사람이 면허를 취득할 수 없다고 생각할 수도 있지만 틀렸습니다.
PHP는 이 스니펫을 다음과 같이 이해합니다.

$a = 17;

if( $a > 18 ) {

}

{
    echo you can get a license;
}



빈 문이 있는 동안 세미콜론이 if 블록을 닫기 때문입니다.

2. 확실히 잘못된 조건이 있지만; true가 반환됩니다.


function should_wear_a_hat($is_raining, $is_snow_comming) 
{
        $wear_a_hat = $is_raining and $is_snow_comming;

        return $wear_a_hat;
}


밖에 눈이 있음에도 불구하고 내 코드에서 모자를 쓰지 말라고 하는 이유는 무엇입니까?
PHP에서 할당(=)은 논리 연산자(and)보다 우선 순위가 높습니다. 따라서 php는 다음과 같은 코드가 있다고 생각합니다.

function should_wear_a_hat($is_raining, $is_snow_comming) 
{
        ($wear_hat = $is_raining) and $is_snow_comming;

        return $wear_hat;
}


이 문제를 해결하려면 대괄호를 사용하여 우선 순위를 변경하십시오.

$wear_a_hat = ($is_raining and $is_snow_comming);


또는 단순히 (및)보다 우선 순위가 낮은 반환을 사용하십시오.

return $is_raining and $is_snow_comming;


3. 보이지 않는 문자열이 있습니다.

$text = `i am 18 y/o`;

echo $text;


이상하지만 발생합니다. 작은 따옴표(') 대신 Backtick을 사용했다면 php는 문자열이 아닌 쉘 명령에 대해 준비될 것입니다.

** 4. 바보 php는 (1과 4)의 결과가 거짓이라고 생각합니다 **

$number_of_wheels = 4;
$number_of_engine = 1;

$is_car_ready = ($number_of_wheels & $number_of_engine);


차량이 준비되었는지 확인할 준비가 되었지만 안타깝게도 그렇지 않습니다.
(&)를 놓치면 PHP는 바이너리의 논리적 비교에도 불구하고 바이너리 시스템에서 조건을 평가합니다(4 & 1 = 0 ).

$number_of_wheels  = 4; // 100
$number_of_engine = 1; // 001

echo ($number_of_wheels & $number_of_engine) // 100 & 001 = 000 



5. 두 개의 다른 숫자가 있지만 php는 동일하다고 말합니다.

$a = 2.0;
$b = 2.0000000000000001;

echo $a == $b; 


php 한계보다 더 정확할 수 없으므로 이러한 종류의 검사를 사용할 때 주의하십시오.

6. Php는 내 과일 배열에 토마토가 있다고 말하지만 그렇지 않다는 것을 알고 있습니다.

$fruits = [
     'apple' => 1,
     'banana' => 0,
     'cherry' => 1,
];


echo in_array('tomato', $fruits);



php는 배열을 살펴보고 각 값에 대해 '토마토'를 느슨하게 검사합니다.

tomato == 1 // yes
tomato == 0 // no
tomato == 1 // yes


따라서 실제로 배열에 토마토가 있습니다. 이 문제를 해결하려면 php가 엄격하게 체크인하도록 하는 세 번째 매개변수를 전달하기만 하면 됩니다.

$fruits = [
    'apple' => 1,
    'banana' => 0,
    'cherry' => 1,
];


echo in_array('tomato', $fruits, true);



결론
이들 중 일부는 간단한 문자가 누락되었을 때 발생하는 신경이 쓰이는 실수였습니다.
PHP 메커니즘을 더 깊이 이해하고 코드에 대한 테스트를 작성하면 이를 처리할 수 있습니다.

좋은 웹페이지 즐겨찾기