use命令?
昨日の件でパッチを眺めていたところ奇妙な定義を(たまたま)発見。
ソースを確認してみる。
% less -N php4-STABLE-200707050230/Zend/zend_language_scanner.l 〜 省略 〜 954 <ST_IN_SCRIPTING>"include" { 955 return T_INCLUDE; 956 } 957 958 <ST_IN_SCRIPTING>"include_once" { 959 return T_INCLUDE_ONCE; 960 } 961 962 <ST_IN_SCRIPTING>"require" { 963 return T_REQUIRE; 964 } 965 966 <ST_IN_SCRIPTING>"require_once" { 967 return T_REQUIRE_ONCE; 968 } 969 970 <ST_IN_SCRIPTING>"use" { 971 return T_USE; 972 } 〜 省略 〜 % less -N php5.2-200707050230/Zend/zend_language_scanner.l 〜 省略 〜 1177 <ST_IN_SCRIPTING>"include" { 1178 return T_INCLUDE; 1179 } 1180 1181 <ST_IN_SCRIPTING>"include_once" { 1182 return T_INCLUDE_ONCE; 1183 } 1184 1185 <ST_IN_SCRIPTING>"require" { 1186 return T_REQUIRE; 1187 } 1188 1189 <ST_IN_SCRIPTING>"require_once" { 1190 return T_REQUIRE_ONCE; 1191 } 1192 1193 <ST_IN_SCRIPTING>"use" { 1194 return T_USE; 1195 } 〜 省略 〜 % less -N php6.0-200707050230/Zend/zend_language_scanner.l 〜 省略 〜 1686 <ST_IN_SCRIPTING>"include" { 1687 return T_INCLUDE; 1688 } 1689 1690 <ST_IN_SCRIPTING>"include_once" { 1691 return T_INCLUDE_ONCE; 1692 } 1693 1694 <ST_IN_SCRIPTING>"require" { 1695 return T_REQUIRE; 1696 } 1697 1698 <ST_IN_SCRIPTING>"require_once" { 1699 return T_REQUIRE_ONCE; 1700 } 1701 1702 <ST_IN_SCRIPTING>"use" { 1703 return T_USE; 1704 } 〜 省略 〜
「use」って、もしかしてPerlのuse命令と同義?PHPでも使えるの?ちょっと確認。
% less -N ./use.php 1 <?php 2 3 use "use.inc"; 4 5 ?> % php ./use.php Fatal error: use: Not yet supported. Please use include_once() or require_once() in ./use.php on line 3
って、おいっ!
わざわざエラーメッセージを出すくらいなら削除しとけよな。。。_| ̄|○
定義があるという事は古い時代には使われていたって事なのかな?何時の頃なんだろう。。。
一応、メッセージの定義場所を確認。
% grep 'use: Not yet supported.' php4-STABLE-200707050230/Zend/*.* php4-STABLE-200707050230/Zend/zend_language_parser.c: { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&(yyvsp[(2) - (3)]).u.constant); } php4-STABLE-200707050230/Zend/zend_language_parser.y: | T_USE use_filename ';' { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&$2.u.constant); } % grep 'use: Not yet supported.' php5.2-200707050230/Zend/*.* php5.2-200707050230/Zend/zend_language_parser.c: { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&(yyvsp[(2) - (3)]).u.constant); } php5.2-200707050230/Zend/zend_language_parser.y: | T_USE use_filename ';' { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&$2.u.constant); } % grep 'use: Not yet supported.' php6.0-200707050230/Zend/*.* php6.0-200707050230/Zend/zend_language_parser.c: { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&(yyvsp[(2) - (3)]).u.constant); } php6.0-200707050230/Zend/zend_language_parser.y: | T_USE use_filename ';' { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()"); zval_dtor(&$2.u.constant); }
うーむ。それにしても巧妙に騙された気がして悔しい。
実行直前に(もしや、もしかして、と)少しでもドキドキした自分が恥ずかしい。
エンターキーを押した瞬間に左肩から(コントみたいに)ずっこけました。
それ以外にも変な定義を発見。
% less -N php4-STABLE-200707050230/Zend/zend_language_scanner.l 〜 省略 〜 780 <ST_IN_SCRIPTING>"old_function" { 781 return T_OLD_FUNCTION; 782 } 783 784 <ST_IN_SCRIPTING>"function"|"cfunction" { 785 return T_FUNCTION; 786 } 〜 省略 〜 % less -N php5.2-200707050230/Zend/zend_language_scanner.l | grep old_function % less -N php5.2-200707050230/Zend/zend_language_scanner.l | grep cfunction % less -N php5.2-200707050230/Zend/zend_language_scanner.l | grep function * Usually, HEREDOC_NEWLINE will just function like a simple NEWLINE, but some <ST_IN_SCRIPTING>"function" { func_name = CG(active_op_array)->function_name; char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; % less -N php6.0-200707050230/Zend/zend_language_scanner.l | grep old_function % less -N php6.0-200707050230/Zend/zend_language_scanner.l | grep cfunction % less -N php6.0-200707050230/Zend/zend_language_scanner.l | grep function * Usually, HEREDOC_NEWLINE will just function like a simple NEWLINE, but some <ST_IN_SCRIPTING>"function" { func_name = CG(active_op_array)->function_name; zstr func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL_ZSTR;
「old_function」に「cfunction」?PHP5とPHP6には存在しないみたい。
PHPマニュアルのUser Contributed Notesにそれっぽい定義が見つかりました。
PHP/FI2時代の頃のものなのね。でも後者は?
「function」と同じ位置に定義されているので同じように使えるんだろう、という事は容易に予想できますが。。。知っている人がいたら教えて下さい。
とりあえず確認。
% less -N ./function.php 1 <?php 2 3 function hoge1( $A ) 4 { 5 return $A; 6 } 7 8 cfunction hoge2( $B ) 9 { 10 return $B; 11 } 12 13 old_function hoge3 $C1, $C2 14 ( 15 return ( $C1 + $C2 ); 16 ); 17 18 var_dump( hoge1( 1 ) ); 19 var_dump( hoge2( 2 ) ); 20 var_dump( hoge3( 3, 4 ) ); 21 22 ?> % php ./function.php int(1) int(2) int(7)
後学に全く役に立たなさそうな知識だなぁ。うーん。