型ジャグリングと型キャスト
PHPが型を自動変換する仕組みと、手動でキャストする方法を学びます。
「型ジャグリングと型キャスト」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
型の自動変換とは何ですか?
型の自動変換(type juggling)とは、演算子や関数が別の型を必要としたときに、PHPが値の型を自動的に変換することです。
便利な仕組みですが、規則を理解していないと、見つけにくいバグの原因になることがあります。
算術演算での型ジャグリング
PHPは文字列を算術コンテキストで使用すると、数値に変換します。
<?php
echo '5' + 3; // 8 — string '5' becomes int 5
echo '5.5' + 1.5; // 7 — string '5.5' becomes float
echo '5 cats' + 1; // 6 — leading numeric part used, rest ignored
echo 'cats' + 1; // 1 — non-numeric string becomes 0弱い比較 ==
== 演算子は型ジャグリング後の値を比較するため、予想外の結果になることがあります。
<?php
var_dump(0 == 'a'); // true in PHP 7 (both become 0)
// false in PHP 8 (improved rules!)
var_dump('' == false); // true
var_dump('1' == true); // true
var_dump(null == false); // true厳密な比較 ===
値と型の両方を比較するには、必ず === を使用してください。型ジャグリングは発生しません。
<?php
var_dump(1 === '1'); // false — different types
var_dump(1 === 1); // true
var_dump(null === false); // false
var_dump(0 === false); // false
// Rule of thumb: prefer === unless you explicitly need type coercion明示的な型キャスト
(type) を先頭に付けて、値を特定の型にキャストします。
<?php
$str = '42.7';
$int = (int) $str; // 42
$float = (float) $str; // 42.7
$bool = (bool) $str; // true
$arr = (array) $str; // ['42.7']
echo $int; // 42
echo $float; // 42.7settype() 関数
settype() は変数の型をその場で変更し、true または false を返します。
<?php
$value = '123';
settype($value, 'integer');
var_dump($value); // int(123)
// Alternative: intval(), floatval(), strval() functions
$n = intval('0xFF', 16); // 255 — parse hex string文字列から数値への変換における例外的なケース
PHPが文字列を数値に変換するときの主なルールです。
- 先頭と末尾の空白は無視されます:
' 42 '→ 42 - 先頭が数値でない場合:
'php8'→ 0(PHP 8では通知が発生します) - 指数表記:
'1e3'→ 1000.0 - 16進数文字列:
'0x1A'はPHP 7以降では自動的に int に変換されません
論理値へのキャスト規則
次の値は false にキャストされ、それ以外はすべて true になります。
<?php
$falsy = [false, 0, 0.0, '', '0', [], null];
foreach ($falsy as $v) {
var_dump((bool) $v); // all bool(false)
}
// Careful:
var_dump((bool) '0'); // false — the STRING '0' is falsy!
var_dump((bool) '00'); // true — only exactly '0' is falsy基数を指定した intval()
intval() は、数値文字列を解析するためのオプションの基数パラメーターを受け取ります。
<?php
echo intval('0b1010', 2); // 10 — binary
echo intval('077', 8); // 63 — octal
echo intval('1F', 16); // 31 — hexadecimal
echo intval('42'); // 42 — decimal (default base 10)PHP 8で改善された型ジャグリング
PHP 8では、以前のバージョンにあった一貫性のない型ジャグリングの一部が修正されました。
0 == 'foo'は現在ではfalseになります(PHP 7ではtrueでした)- 数値と数値でない文字列を比較しても、文字列はもう 0 に強制変換されません
- これによりPHP 8はより安全になりますが、以前の動作に依存するレガシーコードが壊れる可能性があります
型ジャグリングによるバグを避ける
型ジャグリングによる予想外の動作を避けるためのベストプラクティスです。
<?php
declare(strict_types=1); // enforce types at function boundaries
// Always use === for comparisons
if ($status === 'active') { /* safe */ }
// Cast explicitly before arithmetic
$total = (float) $_POST['price'] * (int) $_POST['qty'];
// Validate with filter_var
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT);
if ($age === false) { /* invalid input */ }クイックチェック
PHPで (int) '42abc' は何と評価されますか。
まとめ: 型ジャグリング
PHPの型処理について学んだことです。
- PHPは演算中に型を自動的に強制変換します。これが型ジャグリングです
==は型ジャグリング後に比較し、===は厳密に比較します(型 + 値)(int)、(float)、(string)、(bool)で明示的にキャストします- 関数による代替手段として
intval()、floatval()、strval()を使用します - PHP 8では型ジャグリングに関する一部の例外的なケースが改善されました
strict_types=1を有効にすると、コード内の予想外の動作を減らせます
よくある質問
「型ジャグリングと型キャスト」レッスンは無料ですか?
はい。「型ジャグリングと型キャスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「型ジャグリングと型キャスト」で何を学びますか?
PHPが型を自動変換する仕組みと、手動でキャストする方法を学びます。 ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「型ジャグリングと型キャスト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- PHPでの変数宣言
- PHPのデータ型概要
- EchoとPrintによる出力
- 型ジャグリングと型キャスト