文字型関数(ctype)を使った変数チェック

2008/05/26 | PHPの基本

変数チェックで、また自分の知らない(使ったことがない)関数とであった。与えられた変数の値がどのような文字列で構成されているかをチェックするための関数群ctypeだ。以前は正規表現で書いていたりしたのだが、こちらの関数のほうがお手軽で簡単だ。マニュアルには「ctype 関数は、正規表現よりもつねに好ましく、さらに str_* および is_* のような いくつかの等価な関数よりも好ましいことに注意してください。 これは、ctype 関数がネーティブな C ライブラリを使用しており、処理が著しく 高速であるためです。」と書いてある。まぁ、当然ダイレクトにCのライブラリを呼ぶのだから、正規表現との速度の差は明らかだろう(といってもアクセス数が少なければ、そのオーバーヘッドはわからないだろうけど)。

■ ctype_alnum
英数字かどうかを調べる

■ ctype_alpha
英字かどうかを調べる

■ ctype_cntrl
制御文字かどうかを調べる

■ ctype_digit
数字かどうかを調べる

■ ctype_graph
空白以外の印字可能な文字かどうかを調べる

■ ctype_lower
小文字かどうかを調べる

■ ctype_print
印字可能な文字かどうかを調べる

■ ctype_punct
空白、英数字以外の出力可能な文字かどうかを調べる

■ ctype_space
空白文字かどうか調べる

■ ctype_upper
大文字かどうか調べる

■ ctype_xdigit
16 進数を表す文字かどうかを調べる

「ctype_digit」は見たことがあったけど、他にもこんなにあったんだ。さらにマニュアルを読むと「PHP 4.2.0以降、これらの関数はデフォルトで有効となりました。」とあるので昔はモジュールをロードしなくてはいけなかったのね。どうりで知らないわけだ。

変数チェック

2008/05/22 | PHPの基本

最近便利に使っている変数チェック用の関数にemptyがある(なぜ今まで使っていなかったのかが、われながら不思議)。emptyは、その引数である変数が、文字通り「空」であったときにtureを返すわけだが、厳密には以下の場合にtrueを返す(一部マニュアルから抜粋)。

■ “” (空文字列)
$value=”; と定義された場合

■ 0 (0 は整数)
$value=0; と定義された場合

■ “0” (0は文字列)
$value=’0′; と定義された場合

■ NULL
$value=NULL; として定義された場合

■ FALSE
$value=FALSE; として定義された場合

■array() (空の配列)
$value=array(); として定義された場合

■ var $var;(変数が宣言されているが、値が設定されていない)
クラス内で値が設定されていない場合

あと、もう一個便利なのが「未定義の変数を引数として渡した場合」もundefinedなエラーではなく、trueを返してくれる。

便利だ。

call_user_func関数とcall_user_func_array関数の違い

2008/04/23 | PHPの基本

call_user_func関数とcall_user_func_array関数の違いについて調べてみた。根本的な機能の違いを見つけることはできなかった。両者の違いは以下の点。

○call_user_func関数の引数は一つ以上(可変)
一つ目はコールバックする関数名。二つ目以降はその関数に引数として渡される。

○call_user_func_array関数の引数は二つ(固定)
一つ目はコールバックする関数名。二つ目は配列で指定し、コールバックする関数への引数として渡される。

根本的な問題ではないが、引数の渡し方だけが違うようだ。しかし、ある意味call_user_func_array関数のほうが便利に使えるかもしれないと思った。引数の数が固定だから、扱いやすいような気がする(なんとなくcall_user_funcのほうが軽そうだが、おそらく差はほとんどないだろう)。

try、throw、catch・・・その2

2008/04/19 | PHPの基本

try{}catch(){}構文の研究中につき、理解できた範囲をメモ。
PHP5から使えるようになったJAVAライクなエラー処理だが、慣れない自分にとっては理解に苦しむ記述なので、自分でいろいろ試してみることにした。
こんなスクリプトを書いた。

class myException extends Exception
{
}

class myClass
{
  function __construct()
  {
    print(‘1′);
    print(‘2′);
    throw(new myException(‘error’));
    print(‘3′);
    print(‘4′);
  }
}

try{
  $obj=new myClass;
}catch(myException $e){
  exit();
}

まずExceptionというクラスを継承してmyExceptionという派生クラスを作った。別に特別な処理をしているわけではないけれど、いろいろ調べたかったので、まずは派生クラスを定義しておいた。
次に実際に例外を投げるクラスをつくった。このクラスのコンストラクタの中で、
throw(new myException(‘error’));
と単に例外を投げるように記述した(実際はif文とか使ってエラーが発生した場合に例外を投げることは言うまでもない)。
最後のところで実際にオブジェクトを生成する処理を書いてある。
これを自分なりに読んでいく。

throw(new myException(‘error’));
throw関数の引数は例外として生成したオブジェクトらしい。おそらくいろいろな例外をあらかじめ想定し、例外の種類に応じてそれぞれの例外派生クラスを引き当てるのだろう。この例外クラスの引数は文字列でないといけないっぽい。つまりエラーメッセージをセットするようなイメージだろうか。いちおうもうひとつ引数を取れるみたいで、そちらにはエラーコード(番号)をセットするような感じ。

エラーが発生(例外をthrow)すると、そのスクリプトは途中で中断され(上記で言えば関数内の処理が途中で中断され)、catch構文へ処理が遷移することになる。

catch(myException $e)
この構文の意味がなかなか理解できなかった。どうやらmyExceptionのところは事前に想定した例外のクラス名を割り当てる(のだと思う)。後ろの$eはというと、実はここは$abcでも$errorでも何でもよさそう。new myException(‘error’)で「作りっぱなし」かよ、と思えたオブジェクトはこの変数に代入されるようだ。
あとは$eを煮るなり焼くなりすればいい。

ちなみに、いくつもの例外を想定するわけだから、実際はこんな記述になるのだろうか。

try{
  $obj=new myClass;
}catch(my1Exception $e){
  exit();
}catch(my2Exception $e){
  exit();
}catch(my3Exception $e){
  exit();
}catch(Exception $e){
  exit();
}

いろんなエラーを想定しておいて、どれに合致するか試してみて、それにも合致しないエラーが出てしまったら最後のデフォルトの例外クラスでキャッチ。

理解できたようなできていないような・・・。まだしっくりこない。

classに関するメモ

2008/04/18 | PHPの基本

PHPのクラスに関するメモ。
クラスAとそれを継承したクラスBのコンストラクタに関して、時々どうだったっけ、と思うのでメモしておく。

class A
{
  function A(){print(‘A’);}
}

クラスBにコンストラクタがない場合
class B extends A
{
}
$obj=new B;
// Aと表示される(親クラスのコンストラクタが実行される)

クラスBにコンストラクタがある場合
class B extends A
{
  function B(){print(‘B’);}
}
$obj=new B;
// Bと表示される(親クラスのコンストラクタは実行されない)

コンストラクタはPHP5以降、__construct()とも書けたりもするのでこんがらがってしまうけど、__construct()のほうがわかりやすい。

だって、
class B extends A
{
}

って書いてるのだから、コンストラクタはB()か__construct()であって、A()がコンストラクタにはならないほうがいいように思う。だって複数回継承されたときの元のコンストラクタがなんだったかわからなくなるから。昔からの名残だからしょうがないんだろうけど・・・。
やはりPHP5ライクな記述を目指すべきだと思った(PHP4の環境が当面なくなりそうにないからしょうがないか)。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net