그룹 비디지털 키 이름 따옴표 해석의 필요성
$array[key] = $value;
를 사용하지 않는 것을 본 적이 있다. 나는 어떤 사람들이 이런 코드가 매우 깔끔하다고 느낄 수도 있고 정상적으로 실행될 수도 있다는 것을 이해할 수 있다.더욱이 만약에 그가'행운의'php를 잘 배치한다면:
error_reporting = ~E_NOTIC
그는 영원히 자신의'깔끔한'스타일에 빠져있을지도 모른다. 어떤 알림도 볼 수 없고, 그가 이렇게 하면 얼마나 많은 성능을 손실할 수 있는지도 의식하지 못할 것이다. 자, 우리 함께 보자. good.php:
<?php
$array = array();
$i = 0;
while(++$i < 1000){
$array['good'] = 2;
}
?>
bad.php:
<?php
$array = array();
$i = 0;
while(++$i < 1000){
$array[good] = 2;
}
?>
각각 운행 시간(여러 번 평균 시간): 인용부호를 붙인 것:
$ time php -f good.php
real 0m0.013s
user 0m0.005s
sys 0m0.007
인용부호를 넣지 않은 것:
$ time php -f bad.php
PHP Notice: Use of undefined constant bad - assumed 'bad' in /home/huixinchen/tmp/bad.php
on line ( 999 NOTICE)
real 0m0.100s
user 0m0.020s
sys 0m0.029
봐봐, 차이가 얼마나 돼?읊다, 읊조리다우리는 두 개의 파일이 생성한 OPCODE 서열을 각각 보았다. good.php :
$ time php -f bad.php
real 0m0.037s
user 0m0.018s
sys 0m0.018
bad.php:
filename: /home/huixinchen/tmp/good.php
compiled vars: !0 = $array, !1 = $i
line # op fetch ext return operands
-------------------------------------------------------------------------------
2 0 INIT_ARRAY ~0
1 ASSIGN !0, ~0
3 2 ASSIGN !1, 0
4 3 PRE_INC $3 !1
4 IS_SMALLER ~4 $3, 1000
5 JMPZ ~4, ->9
5 6 ZEND_ASSIGN_DIM !0, 'good'
7 ZEND_OP_DATA 2, $6
6 8 JMP ->3
8 9 RETURN 1
10* ZEND_HANDLE_EXCEPTIO
우리가 알 수 있듯이 (사실, NOTICE의 제시에 따라) PHP는 인용부호가 없는 키 이름을 상량으로 가져온다. 찾을 수 없을 때 NOTICE를 던지고'상량명'에 따라 문자열을 생성한다. 그리고 이 문자열을 키 이름으로 계속한다. 똑똑한 당신은 다음과 같은 예상치 못한 오류가 발생할 수 있다는 것을 반드시 생각할 것이다.
filename: /home/huixinchen/tmp/bad.php
compiled vars: !0 = $array, !1 = $i
line # op fetch ext return operands
-------------------------------------------------------------------------------
2 0 INIT_ARRAY ~0
1 ASSIGN !0, ~0
3 2 ASSIGN !1, 0
4 3 PRE_INC $3 !1
4 IS_SMALLER ~4 $3, 1000
5 JMPZ ~4, ->10
5 6 FETCH_CONSTANT ~5 'bad'
7 ZEND_ASSIGN_DIM !0, ~5
8 ZEND_OP_DATA 2, $7
6 9 JMP ->3
8 10 RETURN 1
11* ZEND_HANDLE_EXCEPTIO
알겠는가?수조 중의 비숫자 키의 키 이름은 반드시 인용부호가 있어야 한다. 오, 문자열 변수가 바뀔 때 인용부호를 쓰면 오류가 발생할 수 있다는 것을 기억하는 사람이 있다. 응, 표준 표기법:
define('key_name' , 'laruence');
....
//
$array[key_name] = 2; // $array['laruence'] = 2;
// , ?
나는'be lazy'에 찬성하지만, lazy도 원칙이 있어야 한다.마지막으로, 좋은 코드는 error_를 닫으면 안 됩니다보고로 위장하다.참고, FETCH_CONSTANT OPCODE에서 상수 관련 논리를 찾을 수 없음:
$string = "variable value is {$array['key']}"
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 범용 요약(二): 범용과 수조수조는 원소의 실제 유형을 추적할 수 있으며, 이 유형은 수조가 생성될 때 만들어진 것이다.위에서 설명한 코드 한 줄: gia = (Generic<Integer>[])new Object[SIZE], 그룹을 만들 때 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.