[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>