金曜日, 4月 19, 2013

PHPでJava風のprintStackTrace()を実現する方法

PHP では try-catch が使えます。

catchで捕まえた例外をどのように処理するかはまた人それぞれだとは思いますが、Java には printStackTrace() という便利な関数があります。

コールした関数を順に出力してくれる関数です。

ここではPHPで関数コールを出力する関数を実装してみました。

例外処理で呼び出すと、関数呼び出しのトレース文字列を出力します。

    try
      {
 // 関数本体
      }
    catch(Exception $e)
      {
 echo trace(debug_backtrace());
      }

関数のコールを順に出力するための関数です。

function trace($traceList)
{
  $html="";
  foreach($traceList as $debugInfo)
    {
      $pathInfo=pathinfo($debugInfo['file']);
      $baseName=$pathInfo['basename'];
      $funcName=$debugInfo['function'];
      $lineNum=$debugInfo['line'];
      $html.="@$funcName ($baseName: $lineNum)";
    }
  return $html;
}

水曜日, 4月 17, 2013

PHPでJava風のstartsWith()とendsWith()がない件について

読みやすさ、美しさというのもプログラムの質に影響してくるとおもいます。

startsWith(), endsWith()という関数がJavaにはあります。

文字列を比較して、指定した文字列で始まっていれば startsWith()は true を返します。

指定した文字列で終わっていれば endsWith()で true を返します。

Javaのネーミングセンスは最高だと常々思うわけですが、これらの関数はPHPにはありません。

substr_compare()という関数を使って startsWith()とendsWith()を実現してみました。

#文字長を制限し比較するよう変更しました(2013-06-05)。

function endsWith($haystack,$needle,$case=FALSE)
{
  $len=mb_strlen($needle);
  if(0<mb_strlen($haystack) && mb_strlen($needle)<=mb_strlen($haystack))
    $res= (substr_compare($haystack,$needle,-$len,$len,$case)==0);
  return $res;
}

function startsWith($haystack,$needle,$case=FALSE)
{
  $res=false;
  if(mb_strlen($needle)<=mb_strlen($haystack))
    $res=(substr_compare($haystack,$needle,0,mb_strlen($needle),$case)==0);
  return $res;
}


Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...