그룹 비디지털 키 이름 따옴표 해석의 필요성

나는 많은 사람들이 수조를 조작할 때 수조 중의 비디지털 키 이름에 대해 인용부호

  $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']}"

좋은 웹페이지 즐겨찾기