[PHP入門]8つの型と型変換で気を付けるべきこと

PHPの8つの型とPHPの型において気を付けるべきことについて解説したいと思います。

スポンサーリンク

整数

10進数、0xで始まる16進数、0で始まる8進数などの整数をintで指定することが可能です。
また、PHPの整数には+、-がつけることもできます。

int型にはある程度環境によって、サイズ(扱える数の広さ)に差があります。
サイズは、PHP_INT_SIZEという定数を使うことによって確認することができます。
また、最大値はPHP_INT_MAX定数を使うことによって確認することができます。

もし、intのサイズを越した場合、自動的にintよりサイズの大きい浮動小数点数(float)型に変換されます。

自分でint型にキャスト(他の型から変換)したい場合には、変換したいものの前に(int)や(integer)を記述するか、intval()関数を使うことによってできます。

<?php
//先頭に(int)を付けて文字列からキャスト
$int1 = (int)"1";
//intval()を使うことによって文字列からキャスト
$int2 = intval("1");

浮動小数点数

浮動小数点数は、整数型では扱いきれない分数や小数などといった実数を取り扱います。
浮動小数点数型の変数を取り扱う場合には、小数点を用いた記述法と1.2e3(1.2 x 10の3乗)のような指数表記の2つの方法があります。

PHPの浮動小数点数はfloatと記述しますが、実際は倍精度浮動小数点数型のdoubleです。

float型へのキャストは先頭に(float)または(double)を付けるか、floatval()関数を使います。

<?php
//先頭に(float)を付けてキャスト
$float1 = (float)"1.0";
//floatval()を使ってキャスト
$float2 = floatval("1.0");

文字列

PHPの型で特に重要なのが文字列です。PHPの多くのものは文字列として扱われ、文字列に対しての処理をするための関数も多くあります。

また、PHPはほかの言語では、PHPでいうechoなどと同じように正規表現を使えるのですが、
PHPでは正規表現を用いたい場合、文字列を使わなければなりません。

文字列は'(シングルクォート)や”(ダブルクォート)で囲むことによって、文字列として変数に代入できます。

シングルクォートとダブルクォートの違いは、シングルクォートでは文字列内に$記号から始まる変数があった場合にその変数を展開しないし、\nや\tなどのエスケープシーケンスを用いることができないです。逆に、ダブルクォートでは変数を{}でくくることによって展開することができエスケープシーケンスも使えます。

$string = 'Hello, string';

//シングルクォートでの出力
echo '$string1';
//変数は展開されず$string1と出力される

//ダブルクォートでの出力
echo "{$string1}";
//変数が展開されて、Hello, stringと出力される

ヒアドキュメント

PHPでは、複数行にまたがる改行を含めた文字列をヒアドキュメントを用いることによって、
簡単に記述することができます。

ヒアドキュメントを使うには、<<<の後に終端識別子(文の終わりを識別するための文字列)を記述します。

また、ヒアドキュメントでは変数の展開や”(ダブルクォート)をエスケープシーケンスを用いず、そのまま記述することができます。

$name = "太郎"

//ヒアドキュメント
$heredocument = <<<EOI
ヒアドキュメントは、複数行にまたがって出力
変数を$nameと出力することによって展開
""をそのまま出力することができます。
EOI
//EOIが終端識別子

Nowdoc

ヒアドキュメントと似たようなものにNowdocがあります。

Nowdocは、<<<の後に終端識別子’(シングルクォート)で囲むことによって使うことができます。また、Nowdocは変数の展開を行わないヒアドキュメントのようなものです。

Nowdocは中身を翻訳しないため、定数に用いることができます。

ですが、ヒアドキュメントでも変数を使わなければ、定数に使うことができるので、
結果的にほとんどNowdocを使う機会はありません。

<?php
$Nowdoc = <<<'EOL'

論理型

論理型は、true(正しい)とfalse(間違っている)の2つの値からなります。

この時の、trueとfalseは大文字、小文字どっちでも大丈夫です。

制御構文(if,for)の条件式、関数の引数で論理型が指定されている場合、論理型に自動的にキャストされます。PHPでは、何か値がある場合は、trueです。0、空、nullなどに相当する場合は、falseです。

配列

配列は、複数の値を保持するものです。

配列には、一つ一つの値に0,1,2,3…と順番に数値が割り当てられる添え字配列と、一つ一つの値に別の値が割り当てられる連想配列があります。

他の言語では、この2つの配列は別々のものとして扱われるのですが、PHPでは同じものとして扱われます。

オブジェクト

オブジェクト型は、クラスをnew演算子によってインスタンス(実体化)したものへの参照です。

リソース

リソース型は、外部のデータベースやファイルなどを保持してくれる型です。

null

null型は、変数が値を何も持ってないことを表わす型です。
次の3つに変数が該当する場合、値はnullとなります。

  • nullが代入されている
  • 値が何も代入されてない
  • unset()をされている場合

unset()は、値の割り当て自体を解除するので、変数を出力したりしようとエラーになります。

PHPの型で注意すべきこと

PHPの型で注意すべきことは、PHPの型は自動的にキャストしてくれて、柔軟で使いやすいです。
ですが、意図していない自動変換によって、思わぬバグを生むかもしれないということです。

これを解決するためには、どのような時に自動キャストがどのように行われるかを把握して、対策するようにすることが大切です。

自動キャストが行われるのは、次の3つの場合です。

  • 異なる型で、演算を行った場合
  • 何かしらの引数が特定の型を指定している時に、異なる型を使った場合
  • 文字列が数値らしいとき

文字列が数値らしいというのは、文字列が10進数や0xから始まる16進数の時です。

また、バグの例として、ユーザー登録で、パスワードを2度入力する際に
起こりうるバグを紹介します。

<?php

if ($pw1 == $pw2) {
//処理
}
else {
echo "パスワードが違います";
}

この時、変数pw1が”012″,変数pw2が”12″だった時、数値に自動キャストが起こりpw1が12と解釈され、結果的にtrueとなり認証されます。

このようなエラーを防ぐために、比較演算をする際にあらかじめ(===)で厳密に演算を行うことを推奨します。

まとめ

PHPの8つの型と注意すべきことについて紹介しました。

PHPの自動キャストは、便利ですが時に問題を起こしかねないので、どのような時に起こるのかを把握して、対策を行ってみてください。

コメント

タイトルとURLをコピーしました