[PHP-users 8022] Re: 自分自身のファイル名取得

Mashiki php-users@php.gr.jp
Mon, 10 Jun 2002 17:10:20 +0900


 Mashikiです。

もりかわさん、回答ありがとうございます。

>ということではあるんですが、語尾が濁ったのは、function 内で
>やるとfunc宣言がネストされてしまうという欠陥もあるからで。。。(^^;
>$hogeWrapper を呼ぶ箇所は問いたくないのが実際ですからね〜。

あれから急な出張が入ってしまって、これについて、さらに考える
ひまがなく、返事が遅れました。

その後、evalで関数定義を行うのでなく、関数呼び出しの文字列を
返す関数を評価するようにすると、目的の動作ができることに気が
付きました。関数内からの呼び出しや、include_onceの階層構造にも
影響は受けません。


結果、次のような本来の呼び出し方

$result = sql_exec($conn, 'SQL文', __FILE__, __LINE__);

を

$result = eval(sql_execX($conn, 'SQL文'));

で、呼び出せるようになります。(これにどんな意味があるのか
といわれればそれまでですが...)

以下、テスト用ソースです。

test0.inc -----------------

<?php
// SQL 処理など
function sql_exec($conn, $sql, $caller_file, $caller_line) {
  // SQL発行処理
  //  :

  if (true) { // エラー処理など
    if (ereg('^(.*)\(([0-9]+)\)', $caller_file, $arr)) {
      list($dummy, $caller_file, $caller_line) = $arr;
    }
    echo <<< ___EOT___
<table border=1>
  <caption><b>エラー発生</b></caption>
  <tr><th>スクリプト<td>$caller_file
  <tr><th>行番号<td>$caller_line
  <tr><th>接続<td>$conn
  <tr><th>SQL文<td>$sql
  <tr><th>エラー<td>SQLパースエラー
</table>
<br><br>
___EOT___;
  }
}

function sql_execX($conn, $sql) {
  $sql = str_replace('\\', '\\\\', $sql); // EUC only
  $sql = str_replace('\'', '\\\'', $sql);
  return "sql_exec($conn, '$sql', __FILE__,__LINE__);";
}
?>

test0.php -------------------

<html><body>
テスト
<?php
  include_once('test0.inc');


  echo "本来の呼び方<br>\n";
  $result = sql_exec(0, 'SQL文0', __FILE__, __LINE__);

  $result = eval(sql_execX(1, 'SQL文1'));

  bbb();

  $result = eval(sql_execX(3, 'SQL文3'));


function bbb() {
  echo "関数bbbから。ここは関数からの呼び出しになります<br>\n";
  $result = eval(sql_execX(2, 'SQL文2'));
}
?>
</body></html>