オレオレ定数「__FILEDIR__」
「毎回dirname(__FILE__)すんの、面倒くさくね?__FILEDIR__みたいなのがあったら済む話じゃん」といった内容です(多分)。
面白そうなので、PHP5.2.3を使って早速3分間ハッキング(^^;
So why won’t we have constant that would mean dirname(__FILE__)? Something like __FILEDIR__. Would make a lot of code cleaner.
__LINE__、__FILE__はZend/zend_language_scanner.lで定義されているようなので、「Zendエンジンに手を入れるのかぁ。。。普通の定数の方が良いかなぁ」と思いつつ、そのまま編集。内容はホントにベタベタですw
$ diff -u Zend/zend_language_scanner.l.org Zend/zend_language_scanner.l --- Zend/zend_language_scanner.l.org 2007-05-24 17:56:35.000000000 +0900 +++ Zend/zend_language_scanner.l 2007-07-24 09:32:55.000000000 +0900 @@ -1535,6 +1535,19 @@ return T_FILE; } +<ST_IN_SCRIPTING>"__FILEDIR__" { + char *filename = zend_get_compiled_filename(TSRMLS_C); + size_t len = php_dirname(filename, strlen(filename)); + if (!filename) { + filename = ""; + } +// zendlval->value.str.len = strlen(filename); + zendlval->value.str.len = len; + zendlval->value.str.val = estrndup(filename, zendlval->value.str.len); + zendlval->type = IS_STRING; + return T_FILE; +} + <INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" { #ifdef ZEND_MULTIBYTE if (SCNG(output_filter)) { $
再build後、
<?php var_dump(__FILEDIR__);
を試してみると、正しくdirname(__FILE__)相当の値が表示されました:-)