こんにちは!カラーミーショップのエンジニアをしているやんまーです。 2022/09/24〜25に開催されたPHP Conference Japan 2022において、GMOインターネットグループはブース「PHP神社」でPHPに関するクイズを出題しておりました。 当日GMOインターネットグループのブースに来てくださった方、PHPクイズに参加してくださった方、ありがとうございました。
本記事ではクイズの問題を紹介し、解答と解説をいたします。 解答と解説は折りたたんでいるので、現地で参加されていない方も本記事でクイズをお楽しみください。
問題/解答/解説
問1: 開始タグ
問題: PHPの開始タグは次のうちどれでしょう?
<php>
<script>
<script lang="php">
<?php
解答と解説
解答: 4
選択肢の中で有効なPHPの開始タグは <?php
のみです。
PHP Conference Japan 2022のセッションスライド内のサンプルコードなどでも開始タグが出現していたため、PHPを全く知らない方でも会場内で見かける機会があったかもしれません。
問2: マスコットキャラクター
問題: PHPのマスコットキャラクターは次のうちどれでしょう?
- dolPHPin (イルカ)
- elePHPant (ゾウ)
- ePHPemera (カゲロウ)
- PHPeasant (キジ)
解答と解説
解答: 2
PHPのマスコットキャラクターelePHPantは、ブースのクイズを出題していたボードのすぐ上やノベルティグッズにも出現していました。
余談ですが、他の選択肢も全て実在する動物の英単語をもじったものになっています。
ph
の入る動物の英単語はあまりないようで、作問者は選択肢の用意に少し苦労しました。
参考: PHP: ElePHPant
問3: str_replace
の挙動
問題: PHP8.1の環境で str_replace(['suzuri', 'minne'], ['lolipop', 'colorme'], 'lolipop-colorme-suzuri-minne')
を実行した場合の戻り値は次のうちどれでしょう?
minne-minne-colorme-colorme
colorme-colorme-colorme-colorme
lolipop-colorme-lolipop-colorme
colorme-lolipop-colorme-lolipop
解答と解説
解答: 3
str_replace
は文字列を置換する関数です。
引数に2つの配列と置換元の文字列をとります。
第三引数の文字列の中で、第一引数の配列の要素に該当する部分文字列があれば、第二引数の配列の要素へ置換されます。
なお、引数に渡された配列の各要素はGMOペパボ株式会社が運営するサービスの名前です。(SUZURI、minne、 ロリポップ!レンタルサーバー、カラーミーショップ)
問4: isset
、empty
、is_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));
- a,b,cともに
true
を出力する - a,b は
true
、cはfalse
を出力する - aは
true
、b,cはfalse
を出力する - a,b,cともに
false
を出力する
解答と解説
解答: 2
isset
関数は、引数が変数として宣言されnull
とは異なることを確認する関数です。
empty
関数は、引数が空であること(真偽値への変換を行ったときにfalse
になること)を確認する関数です。
is_null
関数は、引数がnull
であることを確認する関数です。
どの関数も、確認した結果を戻り値として真偽値で返却します。
会場ではempty
関数の戻り値がtrue
になるか、false
になるかで回答が割れている印象でした。
この問題が各関数の挙動を確認するきっかけになれば幸いです。
参考: PHP: isset - Manual、PHP: empty - Manual、PHP: 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));
5
6
7
null
解答と解説
解答: 1
$array
に代入されている配列のキーがどのようにキャストされるかを問う問題です。
配列のキーは整数または文字列であるので、それ以外の値の場合はキャストが発生します。
-
"0"
は十進数の数値として解釈可能なので、キーは数値の0
になります。 -
" 0"
、"01"
はそれぞれ十進数の数値として解釈されないので、キーはそれぞれ文字列の" 0"
、"01"
になります。 -
null
は空文字列""
にキャストされます -
e
という要素にはキーが指定されていないので、この要素のキーはここまでのキー中の最大整数に1を加えた値である、数値の1
になります。 -
true
、false
はそれぞれ数値の1
、0
になります。
よって、$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;
499
4994
9449
949
9499
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
です。
問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));
1EEGMNNORTT
EEGMNNORTT1
1TTRONNMGEE
TTRONNMGEE1
解答と解説
解答: 1
文字列の配列$keys
を並び替えて結合した結果を問う問題でした。
usort
関数は第一引数に並び替え対象の変数、第二引数に比較に用いるコールバック関数を受け取ります。
コールバック関数は、コールバック関数に渡される第一引数のほうが第二引数より大きい場合は正の数を、小さい場合は負の数を返し、大きい順に並び替えることとなっています。すなわちこの問題では、数字以外の要素はアルファベットの昇順に並び替えられます。
コールバック関数strSort()
の中の比較$a < $b
は、文字列同士の比較もしくは文字列と数値の比較が発生します。
文字列と数値の値の比較は、問題で指定されているPHP8.1の環境において、数値を文字列にキャストしてから比較されます。例えば1
と'E'
の値の比較では、'1'
と'E'
が比較されます。
これらの挙動をもとに、答えは1EEGMNNORTT
です。
おわりに
以上、解答と解説でした。 クイズを楽しんでいただけたでしょうか? 当日は問題の正解数に応じたノベルティを用意していたため、後半の問題は難易度を調整しながら作成しています。
ここまで記事をお読みいただきありがとうございました。 これらのクイズがPHPのマニュアルを読んだり仕様を把握するきっかけになれば幸いです。