2011年8月20日土曜日

phpのキャスト

Zend Frame Workのバリデータの挙動がなかなか思い通りにいかず、仕方なくコードをトレース実行していたところ、見慣れないキャストを見つけました。
foreach (array_merge(array_keys($this->_missingFields), array_keys($this->_invalidMessages)) as $rule) {
	foreach ((array) $this->_validatorRules[$rule][self::FIELDS] as $field) {
		unset($this->_data[$field]);
	}
}
(array) $this->_validatorRules[$rule][self::FIELDS]
arrayへのキャストですか? C,C++ではキャストといえばスカラー型どうしか、あってもポインタのキャストしか触ったことがないので違和感があります。ということで、調べてみました。

phpのマニュアルの「型の相互変換」のページには、キャストの一覧にこう書いてあります。

使用可能なキャストを以下に示します。
  • 整数へのキャスト
  • (bool), (boolean) - 論理値へのキャスト
  • (float), (double), (real) - float へのキャスト
  • (string) - 文字列へのキャスト
  • (array) - 配列へのキャスト
  • (object) - オブジェクトへのキャスト
  • (unset) - NULL へのキャスト (PHP 5)
(array), (object), (unset)あたりがクセモノですねぇ。(unset)なんて使い道すら想像できません。
arrayへのキャストは、マニュアルを読めばすぐ理解できました。
要素1つの配列に変換するというキャストでした。

これが何の使い道があるかというと、phpの関数の引数のアバウトさと関係しています。phpは関数の引数のチェックを厳密に行う必要がないため、スカラ型でも配列でも引数としてokという関数が作成できます。
そして、関数内部では(array)にキャストしてやれば、スカラ型が渡されたとしても配列として扱うことができます。
簡単な例です。

function echoList($list)
{
	$list = (array)$list;
	foreach ($list as $element) {
		echo $element . PHP_EOL;
	}
}
キャストすることで、if (is_array($list)) ... と分岐する必要がなくなります。

0 件のコメント:

コメントを投稿