Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

オレオレ定数「__FILEDIR__」

「毎回dirname(__FILE__)すんの、面倒くさくね?__FILEDIR__みたいなのがあったら済む話じゃん」といった内容です(多分)。


So why won’t we have constant that would mean dirname(__FILE__)? Something like __FILEDIR__. Would make a lot of code cleaner.

面白そうなので、PHP5.2.3を使って早速3分間ハッキング(^^;
__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__)相当の値が表示されました:-)