関数の挙動をソースを追って調べてみよう
d:id:maru_cc:20080207:1202364374
$_ENVとか$_SERVERとかはvariables_orderの設定に依存するから getenvを使ったほうがいいよ。という突っ込みを同僚から受けました。
ということがあった時に、getenv関数は$_SERVERと$_ENVの両方に同じキーで違う値が入っている場合にどういう挙動になるんだろう?という疑問が沸いた。
もちろん、実際の挙動はWebを調べればすぐにわかるのだろうが、せっかくだからCのソースから追っかけてみたら面白いかもしれないと思った。
id:mirさんに教えてももらったcscopeを使ったソース読みも最近できていないので、いい機会かな。
MySQLのソースを見ようとした時の自分の記事を参考に、落としてきたphp-5.2.5のソースを覗いてみる。
http://blog.maru.cc/archives/97
該当する箇所は、すぐに見つかった。
basic_functions.c
/* {{{ proto string getenv(string varname) Get the value of an environment variable */ PHP_FUNCTION(getenv) { char *ptr, *str; int str_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) { RETURN_FALSE; } ptr = sapi_getenv(str, str_len TSRMLS_CC); if(ptr) RETURN_STRING(ptr, 0); ptr = getenv(str); if(ptr) RETURN_STRING(ptr, 1); RETURN_FALSE; } /* }}} */
もうちょっと深くいろいろ追っかけてみよう。
他の関数とかも見てみたら面白いかもしれない。