PHPでは変数にデータ型の指定を行わず、文脈によって変数の型が決まります。例えば$strに’moji’と代入すれば$strは文字列型になりますし、100を代入すれば整数型になります。
データ型は自動変換する
異なるデータ型で、例えば足し算して変数に代入するとします。その場合どのように変数に代入するか学習していきましょう。
$num = 1;
$num = $num + 1.1; //1.0 + 1.1となる
print $num; // 2.1
結果、出力されるのは2.2となります。初めに1を入れたので整数型になったと思いますが、その直後に1.1と$numの演算をしているので、$numはfloat型となります。これは、計算の対象に1つでもfloatがあれば、全ての計算対象がfloat型として扱われているためです。
次は文字列と数値を足してみましょう。
<?php
print 1 + '1';
print 2 + '2 + 5';
print 3 + 'a3';
print 4.0 + '4';
print 5.0 + '5.0+a+4';
?>
ちょっとテキトーに文字列を並べて足してみました。これを実行してみましょう。
計算結果が出力されたりエラー文が表示されていますね。文字列の中が整数または浮動小数点数だけだとその値が演算に使用され正常に出力されていますが、それ以外の文字が含まれていると上の画像のようなエラーが表示されます。しかし、エラーが表示されていますがその後に演算結果の数値も表示されていますね。これは文字列の頭に数値があるとその数値が演算に使われているのです。数字が含まれていても最初が数値じゃなければ0として扱われ演算します。なので上の画像のような表示がされるのです。38となっているのは3 + ‘a3’は3 + 0となり、3が出力され、次の4.0 + ‘4’は正常に4.0 + 4と演算され、38と表示されています。
先程、float型が含まれているとfloat型になるというのを学習しましたが、小数点以下が0の場合は表示されないので8と出力されています。
A non well formed numeric value encountered in〜は数値で始まっているが文字が含まれて演算した場合に発生します。
A non-numeric value encountered in〜は数値以外の文字で始まっている文字列で演算した場合に発生します。
自動変換じゃなくキャストさせる
型の自動変換は便利ですが、自分が予想した変換がされず、処理が意図しない結果になってしまうこともあります。
そこで強制的に変換させる(キャスト)ことができます。
使い方は、変数やリテラルの前に(int)というように型を()で囲んでくっつけます。以下がキャスト一覧です。
(int), (integer) | 整数へのキャスト 例:(int)123.5 |
(bool), (boolean) | 論理値へのキャスト 例:(bool)1 |
(float), (double), (real) | 浮動小数点数へのキャスト 例:(float)123 |
(string) | 文字列へのキャスト 例:(string)123 |
(array) | 配列へのキャスト 例:(array)1 |
(object) | オブジェクトへのキャスト |
(unset) | nullへのキャスト |
<?php
var_dump((int)123.5); //int(123)
print '<br>';
var_dump((int)true); //int(1)
print '<br>';
var_dump((int)false); //int(0)
print '<br>';
var_dump((array)1); //array(1){[0]=> int(1)}
?>
var_dump()とは、()の中の変数などが、何の型の何の値が代入されているかといった情報を見ることができる関数です。処理の途中で変数の中身を知りたい時などによく使います。
trueをint型にすると1、falseをint型にすると0になります。また、int型を配列にすると要素1つ目に指定した値が代入されている配列になります。他にもキャストしてみて、どんな値になるか把握しておくと便利です。
まとめ
- 異なるデータ型で演算した場合自動で型変換される
- 数値以外の文字列を含んで演算するとエラーが発生するが演算結果も出力される
- 最初に数字じゃない文字列は0に変換されて演算される
- (int)のように()で型を囲み、変数や値の前に付けるとキャストできる
- var_dump()は変数や値の情報を出力できる
コメント