PHPの型について解説!(確認・キャスト・指定方法など)

PHP

PHPのデータの型について書いています。
PHPでプログラムを書くときには、データの型をあまり気にせず書くことができますが、データの型はしっかりと存在します。

PHP7.4以降からは、PHPの型を宣言して関数を作ったり、クラスのプロパティを設定することができるようになりました。

PHPの型について

型はデータの種類になります。
代表的なもので、数値や文字列などがあります。

PHPには下記の型が存在します。(公式ドキュメントのこちらの内容です。)

・null
・bool
・int
・float
・string
・array
・object
・callable
・resource

基本的には、変数に値を入れたときに動的に型が決まってきます。
型宣言をすると、静的に型指定することが可能です。

型指定しておくことで、違う型のデータが入ってくるとエラーになるため、バグを生み出しづらくなるかと思います。
次項で実際に動的に型がついた変数を確認していきます。

PHPのデータの型を確認する

gettype関数を使うと、変数のデータの型を確認することができます。
gettype関数に調べたい変数を渡すと、文字列で型を返してくれます。

また、var_dump関数でも型を確認できます。
今回はgettypeで返ってきた文字列を出力して確認しました。

null

nullを入れた変数をチェックすると、NULLになっていることが確認できました。

$test = null;
echo gettype($test); // NULL

論理型(boolean)

trueやfalseの論理値を入れた変数をチェックすると、論理型(boolean)になっていることが確認できました。

$test = true;
echo gettype($test); // boolean

$test = false;
echo gettype($test); // boolean

数値型(int)

数値を入れた変数をチェックすると、数値型(int)になっていることが確認できました。

$test = 777;
echo gettype($test); // integer

浮動小数点数型(float)

小数点を含む数値を入れた変数をチェックすると、浮動小数点数型(float)になっていることが確認できました。

$test = 3.14;
echo gettype($test); // double

doubleとなっていますが、公式ページを確認すると、歴史的な理由によりfloatの場合はdoubleが返ってくるとのことです。

文字列型(string)

文字列を入れた変数をチェックすると、文字列型(string)になっていることが確認できました。

$test = "hello";
echo gettype($test); // string

配列型(array)

配列を入れた変数をチェックすると、配列型(array)になっていることが確認できました。

$test = ['apple', 'banana', 'grape'];
echo gettype($test); // array

オブジェクト型(object)

クラスから作成したオブジェクトをチェックすると、このようにオブジェクト型(object)になりました。

class User {
    private string $name;
    private int $age;
}

$user = new User();
echo gettype($user); // object

このようにgetttype関数で、型を確認することができます。

キャストを使って変換する

キャストを使うことで、他の型に変換することができます。
使用可能なキャストとして、下記が用意されているとのことです。(公式ページ)

キャスト式 内容
(int) 数値型へキャスト(変換)する
(bool) 論理型へキャスト(変換)する
(float) 浮動小数点数型へキャスト(変換)する
(string) 文字列型へキャスト(変換)する
(array) 配列型へキャスト(変換)する
(object) オブジェクト型へキャスト(変換)する
(unset) NULLへキャスト(変換)する

いくつか使ってみました。

文字列から数値へのキャスト

文字列型から数値型にキャストしてみました。
その後に、数値に変換した「700」に対して「77」を足しています。

$numberText = '700';
echo gettype($numberText); // string

$number = (int)$numberText;
echo gettype($number); // integer

echo $number + 77; // 777

最初は文字列型(string)になっていて、キャストすると数値型(int)に変わって、加算できることが確認できました。

文字列から浮動小数点数へのキャスト

文字列型から浮動小数点数型にキャストしてみました。

$piText = '3.14159265359';
echo gettype($piText); // string

$pi = (float)$piText;
echo gettype($pi); // double

円周率「3.14...」の文字列から、浮動小数点数型にキャストしました。
それぞれgettypeで型を確認すると、変わったことがわかります。

数値から文字列へのキャスト

数値型から文字列型にキャストしてみました。

$number = 100;
echo gettype($number); // integer

$numberText = (string)$number;
echo gettype($numberText); // string

数値の「100」から文字列の「100」にキャストできました。

数値から論理値へのキャスト

数値から論理値にキャストしてみます。

$number = 1;
echo gettype($number); // integer

$result = (bool)$number;
echo gettype($result); // boolean

var_dump($result); // bool(true)

数値の「1」を論理型にキャストしました。
キャストできて、論理型(boolean)になりました。

var_dumpで出力すると、trueになっています。

PHPで型を指定する

クラスのプロパティと、メソッドの引数に型を指定することができます。
実際に簡単なクラスを作って試してみました。

クラスのプロパティとメソッドに型指定

Userという名前のクラスを作りました。
プロパティの名前が文字列型(string)で、年齢が数値型(int)です。

class User {
    private string $name;
    private int $age;

    public function setName(string $name)
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setAge(int $age)
    {
        $this->age = $age;
    }

    public function getAge(): int
    {
        return $this->age;
    }
}

それぞれgetとsetメソッドを作って、メソッドに引数に型を定義しています。

string $name」や「int $age」としている箇所です。
これで、メソッドに引数を受け取った際に受け取れないものであれば、エラーとなります。

数値の箇所に文字列を渡す

例えば、数値を受け取るメソッドに下記のように文字列を入れます。

$user = new User();
$user->setAge("aaa");

これは受け取ることができないので、下記のように型エラーになります。

Fatal error: Uncaught TypeError: User::setAge(): Argument #1 ($age) must be of type int

文字列の箇所に数値を渡す

その一方で、文字列型の引数の箇所に数値を渡した場合は、自動的に文字列として受け取られます。
このコードは問題なく動いて、数値の「100」は普通に設定できます。

$user = new User();

$user->setName(100);
echo $user->getName(); // 100

厳密な型付けをする

厳密な型付けをすると、型に対して正確に対応している場合しか受け入れないとのことです。(公式のこちらのページです)

ファイルごとに「declare(strict_types=1)」を使って、strictモードを有効にすると良いとのことです。
実際に使ってみました。

<?php
declare(strict_types=1);

// --- クラス宣言省略 ---

$user = new User();

$user->setName(100);
echo $user->getName();

先ほど、文字列の引数が必要なところに、数値を渡したコードでも下記のように型エラーとなりました。

PHP Fatal error: Uncaught TypeError: User::setName(): Argument #1 ($name) must be of type string

このようにstrictモードを有効にすると厳密にチェックできるようです。

PHPの型についてのまとめ

今回はPHPの型について見ていきました。

PHPには9個の型が存在して、変数に代入したときに、自動的に型が決まっていました。
型自体は、gettype関数やvar_dump関数を使うことで確認できました。

キャストは丸括弧「()」の間に型を書くことでできました。
クラスのプロパティや引数に型指定すると、受け付けることができない場合には型エラーとなりました。

さらに厳密にチェックしたいときにはstrictモードを使うと良かったです。

コメント

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