PHP イベントレポート

PHPクイズの解答と解説 (PHP Conference Japan 2022)

PHP イベントレポート

こんにちは!カラーミーショップのエンジニアをしているやんまーです。 2022/09/24〜25に開催されたPHP Conference Japan 2022において、GMOインターネットグループはブース「PHP神社」でPHPに関するクイズを出題しておりました。 当日GMOインターネットグループのブースに来てくださった方、PHPクイズに参加してくださった方、ありがとうございました。

本記事ではクイズの問題を紹介し、解答と解説をいたします。 解答と解説は折りたたんでいるので、現地で参加されていない方も本記事でクイズをお楽しみください。

PHP Conference Japan 2022 GMOインターネットグループのブース「PHP神社」の様子

問題/解答/解説

問1: 開始タグ

問題: PHPの開始タグは次のうちどれでしょう?

  1. <php>
  2. <script>
  3. <script lang="php">
  4. <?php
解答と解説

解答: 4

選択肢の中で有効なPHPの開始タグは <?php のみです。 PHP Conference Japan 2022のセッションスライド内のサンプルコードなどでも開始タグが出現していたため、PHPを全く知らない方でも会場内で見かける機会があったかもしれません。

参考: PHP: PHP タグ - Manual

問2: マスコットキャラクター

問題: PHPのマスコットキャラクターは次のうちどれでしょう?

  1. dolPHPin (イルカ)
  2. elePHPant (ゾウ)
  3. ePHPemera (カゲロウ)
  4. PHPeasant (キジ)
解答と解説

解答: 2

PHPのマスコットキャラクターelePHPantは、ブースのクイズを出題していたボードのすぐ上やノベルティグッズにも出現していました。 余談ですが、他の選択肢も全て実在する動物の英単語をもじったものになっています。 phの入る動物の英単語はあまりないようで、作問者は選択肢の用意に少し苦労しました。

参考: PHP: ElePHPant

問3: str_replaceの挙動

問題: PHP8.1の環境で str_replace(['suzuri', 'minne'], ['lolipop', 'colorme'], 'lolipop-colorme-suzuri-minne') を実行した場合の戻り値は次のうちどれでしょう?

  1. minne-minne-colorme-colorme
  2. colorme-colorme-colorme-colorme
  3. lolipop-colorme-lolipop-colorme
  4. colorme-lolipop-colorme-lolipop
解答と解説

解答: 3

str_replaceは文字列を置換する関数です。 引数に2つの配列と置換元の文字列をとります。 第三引数の文字列の中で、第一引数の配列の要素に該当する部分文字列があれば、第二引数の配列の要素へ置換されます。 なお、引数に渡された配列の各要素はGMOペパボ株式会社が運営するサービスの名前です。(SUZURIminneロリポップ!レンタルサーバーカラーミーショップ)

参考: PHP: str_replace - Manual

問4: issetemptyis_nullの挙動

問題: PHP 8.1の環境での以下のa,b,cのコードに対する説明のうち、正しいものはどれでしょう?

  • a. $var = '0'; var_dump(isset($var));
  • b. $var = '0'; var_dump(empty($var));
  • c. $var = '0'; var_dump(is_null($var));
  1. a,b,cともに true を出力する
  2. a,b は true、cは false を出力する
  3. aは true 、b,cは false を出力する
  4. a,b,cともに false を出力する
解答と解説

解答: 2

isset関数は、引数が変数として宣言されnullとは異なることを確認する関数です。 empty関数は、引数が空であること(真偽値への変換を行ったときにfalseになること)を確認する関数です。 is_null関数は、引数がnullであることを確認する関数です。 どの関数も、確認した結果を戻り値として真偽値で返却します。

会場ではempty関数の戻り値がtrueになるか、falseになるかで回答が割れている印象でした。 この問題が各関数の挙動を確認するきっかけになれば幸いです。

参考: PHP: isset - ManualPHP: empty - ManualPHP: is_null - Manual

問5: 配列のキーのキャスト

問題: PHP 8.1の環境で次のコードを実行した場合、$number に代入される値のうち、正しいものはどれでしょう?

<?php

$array = [
  "0" => "a",
  " 0"=> "b",
  "01" => "c",
  null => "d",
  "e",
  true => "f",
  false => "g",
];
$number = count(array_keys($array));
  1. 5
  2. 6
  3. 7
  4. null
解答と解説

解答: 1

$arrayに代入されている配列のキーがどのようにキャストされるかを問う問題です。 配列のキーは整数または文字列であるので、それ以外の値の場合はキャストが発生します。

  • "0"は十進数の数値として解釈可能なので、キーは数値の0になります。
  • " 0""01"はそれぞれ十進数の数値として解釈されないので、キーはそれぞれ文字列の" 0""01"になります。
  • nullは空文字列""にキャストされます
  • eという要素にはキーが指定されていないので、この要素のキーはここまでのキー中の最大整数に1を加えた値である、数値の1になります。
  • truefalseはそれぞれ数値の10になります。

よって、$arrayのキーは0" 0""01"""1の5つとなり、これが正解になります。

参考: PHP: 配列 - Manual

問6: 遅延静的束縛

問題: PHP 8.1の環境で次のコードを実行した場合の出力のうち正しいものはどれでしょう?

<?php

class A {
    public static function hoge(): string {
        return '4';
    }
}

class B extends A {
    public static function hoge(): string {
        return '9';
    }

    public static function test(): string {
        return static::hoge() . parent::hoge() . self::hoge();
    }
}

class C extends B {
    public static function hoge(): string {
        return '94';
    }
}

echo C::test() . PHP_EOL;
  1. 499
  2. 4994
  3. 9449
  4. 949
  5. 9499
  6. 9994
解答と解説

解答: 3

この問題はPHPの遅延静的束縛と呼ばれる機能の動作を問う問題です。 問題の中では3つの::演算子によるコールが行われています。 self::static::、そしてparent::です。 このなかでstatic::のみが、メソッドが定義されているクラスではなく実行時に最初にコールされたクラスを参照します。 問題でいえば、C::test()と呼び出されたとき、クラスB中のtestメソッド内の処理の実体は以下のような対応関係になります。

  • static::hoge() ... クラスCに定義されたhogeメソッドが呼ばれる
  • parent::hoge() ... クラスAに定義されたhogeメソッドが呼ばれる
  • self::hoge() ... クラスBに定義されたhogeメソッドが呼ばれる

よって答えは9449です。

参考: PHP: 遅延静的束縛 (Late Static Bindings) - Manual

問7: 整数と文字列の比較

問題: PHP 8.1の環境で次のコードを実行してソートした出力のうち正しいものはどれでしょう?

<?php

// ※GMOの「O」は文字列です
$keys = ['G','M','O',1,'N','T','E','R','N','E','T'];
function strSort($a, $b) {
    return $a < $b ? -1 : 1;
};
usort($keys, 'strSort');
var_dump(implode($keys));
  1. 1EEGMNNORTT
  2. EEGMNNORTT1
  3. 1TTRONNMGEE
  4. TTRONNMGEE1
解答と解説

解答: 1

文字列の配列$keysを並び替えて結合した結果を問う問題でした。

usort関数は第一引数に並び替え対象の変数、第二引数に比較に用いるコールバック関数を受け取ります。 コールバック関数は、コールバック関数に渡される第一引数のほうが第二引数より大きい場合は正の数を、小さい場合は負の数を返し、大きい順に並び替えることとなっています。すなわちこの問題では、数字以外の要素はアルファベットの昇順に並び替えられます。

コールバック関数strSort()の中の比較$a < $bは、文字列同士の比較もしくは文字列と数値の比較が発生します。 文字列と数値の値の比較は、問題で指定されているPHP8.1の環境において、数値を文字列にキャストしてから比較されます。例えば1'E'の値の比較では、'1''E'が比較されます。

これらの挙動をもとに、答えは1EEGMNNORTTです。

参考: PHP: 比較演算子 - ManualPHP: usort - Manual

おわりに

以上、解答と解説でした。 クイズを楽しんでいただけたでしょうか? 当日は問題の正解数に応じたノベルティを用意していたため、後半の問題は難易度を調整しながら作成しています。

ここまで記事をお読みいただきありがとうございました。 これらのクイズがPHPのマニュアルを読んだり仕様を把握するきっかけになれば幸いです。