[PHP-dev 1066] PHP 4.3.10RC1/RC2 における var_export() の挙動変更について

komura komura @ ma9.seikyou.ne.jp
2004年 12月 12日 (日) 10:20:59 JST


komura です。

PHP 4.3.10 RC1/RC2 が公開されましたが、var_export() の挙動が
少し変更されていることに気がつきました。

空文字列と NULL のキーを持つ要素が出力されなくなっています。

$ php-4.3.10RC2 -r 'var_export( array( "" => 1, "a" => 2 ) );'
array (
  'a' => 2,
)

$ php-4.3.9 -r 'var_export( array( "" => 1, "a" => 2 ) );'
array (
  '' => 1,
  'a' => 2,
)

var_dump()、print_r() では空文字列のキーも正しく出力されます。


NEWS にある、以下の修正が影響していると思うのですが、どういった問題が
修正されているのか御存じの方がおられましたら教えていただけませんで
しょうか。

- Fixed potential problems with unserializing invalid serialize data. (Marcus)


これが重要な問題を修正するものであれば、PHP スクリプトの方で
空文字列、または NULL のキーが入らないように修正するつもりなのですが、
もし、それほど重要な問題を修正するものでは無いと言うことであれば、
bug.php.net にバグとして報告しようと考えています。

英語は得意ではないのですが・・・。


また、PHP 4.3.10RC1 で修正された以下の部分の修正を元に戻すことで、
PHP 4.3.9 以前と同じ挙動になることまでは確認しました。

http://cvs.php.net/diff.php/php-src/ext/standard/var.c?r1=1.150.2.14&r2=1.150.2.15&ty=u

@@ -260,13 +267,17 @@ static int php_array_element_export(zval
 	if (hash_key->nKeyLength==0) { /* numeric key */
 		php_printf("%*c%ld => ", level + 1, ' ', hash_key->h);
 	} else { /* string key */
-		char *key;
-		int key_len;
-		key = php_addcslashes(hash_key->arKey, hash_key->nKeyLength - 1, &key_len, 0, "'\\", 2 TSRMLS_CC);
-		php_printf("%*c'", level + 1, ' ');
-		PHPWRITE(key, key_len);
-		php_printf("' => ");
-		efree(key);
+		if (va_arg(args, int) && hash_key->arKey[0] == '\0') {
+			return 0;
+		} else {
+			char *key;
+			int key_len;
+			key = php_addcslashes(hash_key->arKey, hash_key->nKeyLength - 1, &key_len, 0, "'\\", 2 TSRMLS_CC);
+			php_printf("%*c'", level + 1, ' ');
+			PHPWRITE(key, key_len);
+			php_printf("' => ");
+			efree(key);
+		}
 	}

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-dev メーリングリストの案内