도덕적 질문에서 이 질문을 보고 매우 흥미로웠습니다. 함정을 여러분과 공유하고 여러분도 그 함정에 빠질지 알아보고 싶습니다.
질문 1
$arr = 배열(0=>1,"aa"=>2, 3, 4);
foreach($arr as $key=>$val){
Print($key == "aa" ? 5 : $val);
}
출력은 무엇입니까? 답이 1534라면 함정에 빠진 것입니다.
먼저 이 배열의 최종 구조를 살펴보겠습니다.
배열
(
[0] => 1
[aa] => 2
[1] =>3
[2] =>4
)
그런 다음 각 요소의 키를 반복하여 aa와 같지 않은지 확인합니다. 같으면 5로 바꿉니다. 정답이 5534라고 말하면 조금 놀라시겠죠? 0은 "aa"와 같나요? 예, 0은 "aa"입니다. 이 질문의 초점은 당신을 테스트하는 것입니다. PHP에서 두 값을 논리적으로 판단할 때 두 값의 유형이 일치하지 않으면 PHP는 자동으로 오른쪽 값을 왼쪽 유형으로 변환한 후 판단합니다. 따라서 "aa" 변환 정수는 0과 같으며 이는 자연스럽게 왼쪽의 0과 같습니다. 등호를 사용하여 이를 방지할 수 있습니다. 즉, 다음과 같이 작성하면 됩니다.
print($key === "aa" ? 5 : $val);
그러면 답은 1534이다.
질문 2
$i='11';
printf("%dn",printf("%d",printf("%d",$i)));
출력은 무엇입니까? 대답이 11 또는 111111이면 함정에 빠진 것입니다.
먼저 printf 함수를 이해하세요. Printf는 인쇄 함수일 뿐만 아니라 반환 값도 가지고 있습니다. 그게 포인트입니다
var_dump(printf("%d",$i));
위의 결과가 무엇일지 추측해 보세요. 먼저 printf는 변수 자체인 11을 인쇄한 다음 printf는 변수 문자열 길이의 값을 반환합니다. 11에는 두 개의 문자가 있으므로 2가 반환되므로 위 문의 실행 결과는 다음과 같습니다.
11int(2)
이 점을 명확히 한 후 다시 위의 테스트 문제를 살펴보세요. 우선순위에 따라 제한된 깊이 printf 함수는 11을 인쇄하고 2를 반환합니다. 그런 다음 두 번째 수준 printf 함수로 이동하여 2를 인쇄하고 1을 반환합니다. 마지막으로 세 번째 레이어에는 1이 직접 인쇄되므로 실행 결과는 1121이 됩니다.
질문 3
$a = 3;
$b = 5;
if($a = 5 || $b = 7) {
$a ;
$b ;
}
$a . " " . $b;
실행 결과는 무엇입니까? 6 8, 4 6 또는 6 6이라고 대답하면 함정에 빠진 것입니다.
첫 번째 함정은 답이 4 6 이라고 생각하는 것입니다. 실수로 $a = 5 || $b = 7 을 $a == 5 || 로 착각했을 수도 있습니다. 이는 초보자가 흔히 저지르는 실수입니다.
두 번째 함정, 답은 6 8이라고 생각하세요. $a = 5 || $b = 7이라는 사기를 꿰뚫어 보셨지만, 특정 표현식의 결과가 true가 될 때까지 논리적 OR이 순차적으로 실행되는 한 다음 표현식은 더 이상 실행되지 않는다는 사실을 눈치 채지 못하셨습니다. a = 5 true가 반환되면 후속 $b=7이 실행되지 않습니다.
세 번째 함정은 답이 6 6이라고 생각하는 것입니다. 자, 논리 OR의 규칙을 살펴보았으므로 $a=5는 실행되고 $b=7은 실행되지 않지만 이것이 논리식이라고 생각하지 않았으며 $a에 반환되는 값은 다음과 같아야 합니다. 부울 값으로 변환됩니다. 이렇게 보세요.
따라서 위의 세 가지 트랩 후에는 답이 무엇인지 알아야 합니다. 실제로 $a가 true가 되면 echo $a의 출력은 1이고 $b의 값은 변경되지 않으며 결과는 다음과 같습니다. 1 6.
질문 4
$count = 5;
함수 get_count() {
정적 $count = 0;
$count 반환 ;
}
$count;
get_count();
echo get_count();
실행 결과는 무엇입니까? 2라고 답하셨다면 축하드립니다. 함정에 빠진 것입니다.
실제로 이 질문은 주로 두 가지 사항을 테스트합니다. 첫 번째 사항은 정적 정적 유형입니다. 이러한 종류의 값은 항상 정적입니다. 첫 번째 호출은 0으로 선언되고 증분은 1입니다. 두 번째로 호출되면 1이 2로 증가됩니다. 그런데 사실 여기에는 또 다른 함정이 있는데, 그것이 a와 a의 차이입니다. 전자가 먼저 증가하고 후자가 먼저 반환된 값을 나중에 증가시키므로 결과는 1이 됩니다.
질문 5
$a = 개수 ("567") 개수(null) 개수(false);
에코 $a;
3이나 1이라고 답했다면 축하드립니다. 함정에 빠진 겁니다.
count(null)은 0이므로 false도 값으로 계산됩니다. 따라서 count(false)는 1과 같습니다.