こんにちは、エンジニアの山田 (@yamadashy) です。
6月28日に大田区産業プラザPiOで開催された「PHP Conference Japan 2025」に出展しました。 今年はゴールドスポンサーとして協賛し、ブース出展を通して多くのPHP開発者の皆さんと交流する機会をいただきました。
PHP Conference Japan 2025 について
PHP Conference Japan は有志によるプログラミング言語 PHP にまつわる国内最大規模のカンファレンスで、一年に一度の頻度で開催されている技術系カンファレンスイベントです。
コロプラとしても 2022 年からシルバースポンサーとして協賛させていただいており、 今年はゴールドスポンサーとして協賛規模を拡大し、より積極的にPHPコミュニティへ貢献しました。
スポンサーブースの様子
コロプラブースに来ていただいた方に、「コロプラ水」「ステッカー」「クリアファイル」を配布しました。
今年のブースでは、「PHP予想外クイズ」というコンテンツを企画。 簡単なものからベテランのPHP開発者でも悩む問題まで5つの問題を用意し、回答いただいた方にはテックブログの二次元バーコード入りのコーヒーをプレゼントしました。
ブースで使うテーブルクロスやロールアップバナーも新調。
PHP予想外クイズの解説
ブースで出題したクイズの内容をご紹介します。皆さんも挑戦してみてください!
PHPのバージョンは8.4です。
問題1(正解率:22%)
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $arr = [null => 1]; print_r($arr);
選択肢
Array ( [null] => 1 )
Array ( [0] => 1 )
Array ( [] => 1 )
TypeError: Illegal offset type
正解・解説を見る
正解は 3. Array ( [] => 1 )
PHPでは、配列のキーとしてnull
を使用すると、自動的に空文字列''
に変換されます。これはPHPの型変換の仕様によるものです。
この例では、null
キーが空文字列に変換され、結果としてArray ( [] => 1 )
が表示されます。PHPのprint_r
関数では、空文字列のキーは[]
として表示されます。
参考: PHP: 配列
問題2(正解率 35%)
次のPHPコードを実行した場合、どのような結果になるでしょうか。
<?php $var = 1 + + 8; var_dump($var);
選択肢
int(1)
int(9)
int(18)
Parse error: syntax error
正解・解説を見る
正解は 2. int(9)
PHPでは、1 + + 8
という式は構文エラーではなく、正常に解析されます。この式は実際には1 + (+8)
として解釈されます。
+8
の最初の+
は単項演算子です。この演算子は値が文字列や論理値の場合はintまたはfloatに変換しますが、すでに数値の場合は実質的に何も変更しません。そのため、+8
は単純に8
と同じ値になります。
結果として、1 + + 8
は1 + 8
と同じ計算になり、答えは9
となります。
参考: PHP: 演算子の優先順位, PHP: 算術演算子
問題3(正解率:25%)
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $str = 'z'; $str++; echo $str;
選択肢
z
aa
{
- エラーが発生する
正解・解説を見る
正解は 2. aa
PHPでは文字列をインクリメント演算子(++
)で操作できます。文字列の末尾が'z'の場合、次の文字'a'が追加され、元の'z'は'a'に変わります。
参考: PHP: 加算子/減算子
問題4(正解率:33%)
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $value = 0; switch ($value) { case '': echo 'empty string'; break; case false: echo 'false'; break; case 0: echo 'zero'; break; }
選択肢
empty string
false
zero
- 何も出力されない
正解・解説を見る
正解は 2. false
switch文では緩い比較(==
)が使用されます。PHP 8.4では以下の比較結果になります。
0 == ''
→false
0 == false
→true
0 == 0
→true
switch文では上から順番に比較し、最初にマッチしたcaseが実行されます。
0 == ''
はfalse
なのでマッチしない0 == false
はtrue
なのでマッチし、case false:
が実行される
そのため、'false'
が出力されます。
PHP 8.0以降の重要な変更
PHP 8.0以降では、数値と文字列の比較時の動作が変更されました。数値文字列ではない文字列と数値の比較では、数値を文字列に変換して比較するようになりました。空文字列''
は数値文字列ではないため、0 == ''
はfalse
になります。
参考: PHP: switch, PHP: 型の比較表
問題5(正解率:41%)
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $a = 28; $b = 6; $result = $a | $b; echo "PHPは今年で{$result}周年!";
選択肢
PHPは今年で22周年!
PHPは今年で28周年!
PHPは今年で30周年!
PHPは今年で34周年!
正解・解説を見る
正解は 3. PHPは今年で30周年!
ビットOR演算(|
)を使用しています。
28 = 11100 (2進数) 6 = 00110 (2進数) OR = 11110 (2進数) = 30 (10進数)
ビットOR演算では、どちらかのビットが1の場合、結果も1になります。
結果: 11110
= 16 + 8 + 4 + 2 + 0 = 30
ということで、PHPは1995年に誕生し、2025年でちょうど30周年を迎えます!
この問題は一見鬼畜な問題ですが、PHPへの愛があれば解ける問題でしょう。
参考: PHP: ビット演算子
追加問題
カンファレンスでは出題しなかった、解き応えのある問題も特別に用意しました。 ぜひ挑戦してみてください!
追加問題1
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $arr = [0.0 => 0, 0.9 => 1]; print_r($arr);
選択肢
Array ( [0] => 0 [0.9] => 1 )
Array ( [0] => 0 [1] => 1 )
Array ( [0] => 1 )
Array ( [0.9] => 1 )
正解・解説を見る
正解は 3. Array ( [0] => 1 )
PHPでは、配列のキーとして浮動小数点数を使用すると、自動的に整数に変換されます。この変換は「切り捨て」によって行われます。つまり、小数点以下は単純に切り捨てられます。
この例では
0.0
は整数0
に変換される0.9
も整数0
に変換される(小数点以下が切り捨てられる)
同じキー(この場合は0
)に対して複数の値が設定された場合、後から設定された値が優先されます。そのため、最終的な配列は[0 => 1]
となります。
参考: PHP: 配列
追加問題2
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $family_emoji = '👨👩👧👦'; echo mb_substr($family_emoji, 0, 1);
(PHPのシンタックスハイライトを有効にすると実際の問題と乖離が発生するので無効にしています)
選択肢
👨👩👧👦
(家族の絵文字全体)👨
(男性の絵文字のみ)- 空の文字列
- エラーが発生する
正解・解説を見る
正解は 2. 👨
(男性の絵文字のみ)
複合絵文字「👨👩👧👦」(家族)は、実際には以下の要素で構成されています
- 👨 (U+1F468) - 男性
- U+200D - ゼロ幅接合子
- 👩 (U+1F469) - 女性
- U+200D - ゼロ幅接合子
- 👧 (U+1F467) - 女の子
- U+200D - ゼロ幅接合子
- 👦 (U+1F466) - 男の子
mb_substr
関数は、これらの文字を個別のUnicode文字として扱うため、最初の文字である「👨」(男性)だけを返します。
絵文字を正しく扱うにはgrapheme_substr
関数を使用してください。
参考: PHP: mb_substr, PHP: grapheme_substr
追加問題3
次のPHPコードを実行した場合、どのような結果になるでしょうか?
<?php $arr = [1, 2, 3]; foreach ($arr as &$value) { $value = $value * 2; } foreach ($arr as $value) { // 何もしない } print_r($arr);
選択肢
Array ( [0] => 2 [1] => 4 [2] => 6 )
Array ( [0] => 2 [1] => 4 [2] => 4 )
Array ( [0] => 1 [1] => 2 [2] => 3 )
- エラーが発生する
正解・解説を見る
正解は 2. Array ( [0] => 2 [1] => 4 [2] => 4 )
この問題が最も予想外な結果に感じられたでしょう。
以下のような流れで $arr
は [2, 4, 4]
になります。
最初のforeachループでは、
&$value
で参照を使用し、各要素を2倍にする- この時点で
$arr
は[2, 4, 6]
になる $value
はまだ$arr[2]
への参照を保持している
- この時点で
2番目のforeachループでは、参照を使用せず、各反復で
$value
に値が代入される- 1回目:
$value = 2
→$arr[2] = 2
(まだ$value
が$arr[2]
への参照を保持しているので、$arr[2]
が2になる) - 2回目:
$value = 4
→$arr[2] = 4
(参照経由での代入) - 3回目:
$value = 4
→$arr[2] = 4
(参照経由での代入だが、$arr[2]
が4で$value
も4なので変化なし)
- 1回目:
$arr[2]
が上書きされ、[2, 4, 4]
になる
参考: PHP: foreach
おわりに
今年もPHP Conference Japanに参加して、PHPコミュニティの盛り上がりを肌で感じることができました。ブースに立ち寄ってくださった皆さん、ありがとうございました。
クイズを通じて、PHPの意外な挙動や面白い仕様について知っていただけたでしょうか。普段書いているコードにも、まだまだ知らない発見があることでしょう。
記事でクイズの全問題と解答を紹介しましたので、ぜひ挑戦してみてください。同僚やチームメンバーとも共有して、技術議論のきっかけにしていただければ幸いです。
コロプラはこれからもPHPコミュニティの一員として、技術の発展と交流に貢献していきたいと考えています。
ColoplTechについて
コロプラでは、勉強会やブログを通じてエンジニアの方々に役立つ技術や取り組みを幅広く発信していきます。
connpass および X で情報発信していますので、是非メンバー登録とフォローをよろしくお願いいたします。
また、コロプラではゲームや基盤開発のバックエンド・インフラエンジニアを積極採用中です!
興味を持っていただいた方はぜひお気軽にご連絡ください。