ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

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)

後学に全く役に立たなさそうな知識だなぁ。うーん。