記事一覧

PHP データ型と型変換まとめ




目次



PHPは厳密な比較演算子の使用が推奨されているということ

ハロー、みなさん。エジソンです。

PHPは型宣言しなくても良い言語です。しかしながら、型宣言が無いからといってデータ型が無い訳ではなく、内部的にはデータ型を保持しています。

過去の記事で、PHPにおける比較演算子には、厳密な比較演算子を使用すべきと提言しました。

その際に、意識すべきことは、PHPのデータ型とキャスト種類を正しく把握するということです。


Related Posts

PHP - 緩やかな比較 == と厳密な比較 ===




PHPのデータ型

PHPのデータ型には以下が存在します。

  • 真偽値(boolean)
  • 整数(integer)
  • 浮動小数点数(float)
  • 文字列(string)
  • 配列(array)
  • オブジェクト(object)
  • リソース
  • NULL(null)
  • コールバック(callback)

上記のうち、スカラーデータ型は、真偽値・整数・浮動小数点数・文字列です。

PHP公式サイト - 型


PHPのキャスト

PHPのデータキャストには以下が規定されています。

  • (int), (integer) - 整数へのキャスト
  • (bool), (boolean) - 論理値へのキャスト
  • (float), (double), (real) - float へのキャスト
  • (string) - 文字列へのキャスト
  • (array) - 配列へのキャスト
  • (object) - オブジェクトへのキャスト
  • (unset) - NULL へのキャスト (PHP 5)

PHP公式サイト - 型の相互変換


型キャストを試して見る

厳密な比較をする際に、左辺と右辺のデータ型が異なる場合には、どちらか一方を他方に合わせて型キャストする必要があります。

以下のように、型キャストを挟むことで、データ型の異なる2値の厳密な比較においても、正しく比較できるようになるでしょう。

<?php

$str = '1';
$int = 1;
$float = 1.0;
$bool = true;

// 厳密な比較では全て false になる
echo '$str   === $int    : ' . ($str === $int    ? 'true' : 'false') . PHP_EOL;
echo '$str   === $float  : ' . ($str === $float  ? 'true' : 'false') . PHP_EOL;
echo '$str   === $bool   : ' . ($str === $bool   ? 'true' : 'false') . PHP_EOL;
echo '$int   === $float  : ' . ($int === $float  ? 'true' : 'false') . PHP_EOL;
echo '$int   === $bool   : ' . ($int === $bool   ? 'true' : 'false') . PHP_EOL;
echo '$float === $bool   : ' . ($float === $bool ? 'true' : 'false') . PHP_EOL;

echo  PHP_EOL;

// キャストして値が同一なので全て true になる
echo '$str   === $int    : ' . ($str === (string)$int    ? 'true' : 'false') . PHP_EOL;
echo '$str   === $float  : ' . ($str === (string)$float  ? 'true' : 'false') . PHP_EOL;
echo '$str   === $bool   : ' . ($str === (string)$bool   ? 'true' : 'false') . PHP_EOL;
echo '$int   === $float  : ' . ($int === (int)$float     ? 'true' : 'false') . PHP_EOL;
echo '$int   === $bool   : ' . ($int === (int)$bool      ? 'true' : 'false') . PHP_EOL;
echo '$float === $bool   : ' . ($float === (float)$bool  ? 'true' : 'false') . PHP_EOL;


実行結果
$str   === $int    : false
$str   === $float  : false
$str   === $bool   : false
$int   === $float  : false
$int   === $bool   : false
$float === $bool   : false

$str   === $int    : true
$str   === $float  : true
$str   === $bool   : true
$int   === $float  : true
$int   === $bool   : true
$float === $bool   : true


中々難しい、string と boolean の相互型変換

booleanの取り得る値は、 "true, false" の2種類です。

これら "true, false" というスペルをbooleanの文字列表現とした場合に、stringとbooleanの相互変換を実施するにはどうしたら良いかを調べてみました。

以上の前提を踏まえて、stringとbooleanを相互変換するには、単にキャストすれば良いという訳ではありません。

問題の一つとして、stringをbooleanにキャストする際に、"" 空文字列をbooleanにキャストするとfalseになり、1文字以上の文字列ならtrueになる、という性質があるからです。

以下のようなコードで相互変換が実施できます。

<?php

// boolean型をstring型に変換する
$booltrue  = true;
$boolfalse = false;

// boolean → string は var_export が利用できる
$convStrTrue  = var_export($booltrue , true);
$convStrFalse = var_export($boolfalse, true);

var_dump($convStrTrue);
var_dump($convStrFalse);

// string型をboolean型に変換する
$strtrue   = 'true';
$strfalse  = 'false';

// string → boolean は 三項演算子 で実施する
$convBoolTrue  = $strtrue  === 'true' ? true : false;
$convBoolFalse = $strfalse === 'true' ? true : false;

var_dump($convBoolTrue);
var_dump($convBoolFalse);


実行結果
string(4) "true"
string(5) "false"
bool(true)
bool(false)

boolean → string は var_export を利用し、string → boolean は 三項演算子 を利用しています。後者の実現手段はナンセンスな気もしますが、他にやり方が見つかりませんでした。
関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp