[PHP-users 1578] Re: C 言語のGOTO みたいなことしたい

Osamu Shigematsu php-users@php.gr.jp
Tue, 28 Aug 2001 15:00:56 +0900


重松です。松嶋さん、こんにちは。

> なかなかトリッキーな方法ですね。^^;

try{}catch(){} がつかれば、こんなべたべたなことをしなくてもいいんですが。;-)

> PHP マニュアルより
>> breakでは、オプションの引数で ネストした
>> ループ構造を抜ける数を指定することができます。
> 
> ということで、
> 
> for($i=0; $i<10; $i++) {
> for($j=0; $j<10; $j++) {
> for($k=0; $k<10; $k++) {
> break 3;
> }
> }
> }
> 
> とかできるようですよ。
> 
> # とはいえ、外側にループが増えたり減ったりしたら、その内側の
> # break に指定した数字はすべて変更しなければなりませんが。

というか、思いっきり破綻しそうな予感がしますね。

    $err = false;
    do{
        do{
            do{
                /* 処理 */
                $db = new database;
                $sql = "select * from person_master";
                if(!$db->query($sql)){
                    $err  = "SQL error: $s ";
                    $err .= sprintf("in %s at %d",__FILE__,__LINE__);
                    break;
                }
            while(false);
            if($err) break;
        while(false);
        if($err) break;
    }while(false);

    if($err){
        print "err = $err";
    }

みたいに、ちまちま抜けた方が、安全かも、しれませんね。

あるいは関数にしておいて、return で一発抜け。

ところで、ふと思ったんですが、

$foo = "world";
$bar = "Hello, $foo!";

で、$bar は "Hello, world!" になると思いますが、定数とか、__FILE__ だとか、
「.」で連結したり、sprintf() に頼らずに出力できないのでしょうか。

$foo = "file: {__FILE__}";

とかでできるのかしら?
# やって見ろと言われそう。

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/
mailto:shige@ravi.ne.jp