1.4K Views
July 19, 25
スライド概要
PHPカンファレンス関西2025 (2025/7/19) の資料です
遊びながら強くなる! コードゴルフで学ぶPHPの言語仕様 PHPカンファレンス関西2025 荒巻拓哉 (@takaram71)
おことわり ● 資料は公開済みです ● 右下のQRコードが資料のURLです ○ 次の次のスライドまで出しときます ● X, fortee からも辿れます
今日のテーマ コードゴルフ
今日の目標 ● コードゴルフ面白そうと思ってもらう ● PHPに少し詳しくなる
荒巻拓哉 @takaram71 ● 株式会社ラクス ○ メールマーケティングサービス 「配配メール」開発 ● 大阪出身 大阪在住
コードゴルフ ● お題の仕様に沿うコードを書く ● ただしできるだけ短く ● コードのバイト数=スコア ○ スコアが小さいほどよい ○ ゴルフと同じ
コードゴルフ ● PHPerKaigi 2025 ○ 「PHPerコードバトル」 ○ PHPのコードゴルフで競う ■ 事前に予選 ■ Day0に決勝トーナメント
コードゴルフ ● 優勝しました🏆 ○ 後日いただいた記念品 → ● 感想 ○ 楽しかった ■ パズル感覚 ○ PHPの勉強にもなった
コードゴルフの問題って どんな感じ?
コードゴルフ:例題 標準入力で与えられた整数Nに対して、以下のルールに従い 1からNまでを標準出力に出力してください。 ● ● ● ● 3の倍数のとき "Fizz" 5の倍数のとき "Buzz" 両方の倍数のとき "FizzBuzz" それ以外のときは数字そのもの 各出力は改行で区切ってください。
普通のFizzBuzz
コードゴルフのFizzBuzz 230 byte → 74 byte
コードゴルフのFizzBuzz ● 空白、改行はできるだけ消す
コードゴルフのFizzBuzz ● forの中身が一文なら {} 不要
コードゴルフのFizzBuzz ● forの中で代入 ● (int) キャストしない
コードゴルフのFizzBuzz ● インクリメント ($i++) と比較を同時に ○ $i = 0 のとき ■ echo $i++; // 0 ■ echo ++$i; // 1
コードゴルフのFizzBuzz ● 配列の活用 ○ 要素数1の配列 ['Fizz'] ○ $i が3の倍数 → 'Fizz' ○ それ以外 → null → . 演算子で空文字列に
コードゴルフのFizzBuzz ● Warning上等 ○ Undefined variable, Undefined array key ○ エラー制御演算子 @ で握りつぶす
コードゴルフのFizzBuzz ● 改行は \n を使わない ○ PHPの文字列は普通に複数行書ける
このへんはコードゴルフ的 テクニック 普段のコーディングではあんまり……
コードゴルフで (きっと普段も) 役立つPHPの知識
コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数
コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数
PHPの言語仕様:文と式 ● 文 ○ すべての PHP スクリプトは、一連の文からなります。[1] ● 式 ○ 最も簡単で最も正確な式の定義は、"値があるもの全て" です。 [2] 出典:PHPマニュアル (The PHP Documentation Group, CC BY 3.0) [1] https://www.php.net/manual/ja/control-structures.intro.php [2] https://www.php.net/manual/ja/language.expressions.php
PHPの言語仕様:文と式 ざっくり言うと: ● 式: $a = ここ ; return ここ ; var_dump( ここ ); ● 文: それ以外 に書けるもの
PHPの言語仕様:文と式 文 式 制御構文 演算子式 if while switch foreach … + * . == ! && ?? … class Foo {...} match function foo() {...} function() {...} const FOO = 1; $foo = 1 return throw echo print
PHPの言語仕様:文と式 ● 書ける場所が決まっている ○ ○ ○ ○ ○ $a = 式 myFunc(式, 式) function foo() { 文... } if (式) 文 elseif (式) 文 else 文 for (式; 式; 式) 文 ● 式の来るべきところに文は書けない
PHPの言語仕様:文と式 ● echo → print に変えると式として扱える
PHPの言語仕様 ● コールバック ○ callable 型 ○ array_map や usort の引数に渡すやつ ○ $callback() で呼び出せる ● 大きく分けると3種類
PHPの言語仕様:コールバック
1. 無名関数
○ function() {...}
○ fn() => ...
2. 関数/メソッド名の文字列、配列
○
○
○
○
'strlen'
'DateTime::createFromFormat'
['DateTime', 'createFromFormat']
[$date, 'format']
3. __invoke() メソッドがあるオブジェクト
PHPの言語仕様:コールバック 70byte 53byte
PHPの言語仕様:コールバック ● 代入は式=値を返すので、以下のようにも書ける
コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数
PHPの標準関数 ● PHPは標準関数がかなり豊富 ● 約800個とも約2000個とも ○ インストールされた拡張モジュール次第 ● 標準関数を知る → 車輪の再発明を回避
PHPの標準関数 ● 全関数の暗記は無理 ○ 「こんな関数あった気がする」で調べればいい ● 必要なのは大体このへん ○ ○ ○ ○ PHP: String 関数 - Manual PHP: マルチバイト文字列 関数 - Manual PHP: PCRE 関数 - Manual PHP: 配列 関数 - Manual
コードゴルフに便利な関数 ● file ○ 入力を配列で読み込む ● printf / sprintf ○ 0埋めや固定幅での出力 ● strtr ○ 文字列置換 ○ 使い方が2種類 ■ strtr('bar', 'ab', 'AB') // BAr ■ strtr('bar', ['a' => 'A', 'b' => 'B']) // BAr
おわりに
PHPerKaigi 2025 PHPerコードバトル ● 問題と参加者の提出コードが公開中 ○ https://t.nil.ninja/phperkaigi/2025/code-battle/ ○ ぜひ挑戦してみてください! ● 解説ブログ ○ PHPer コードバトル最終コード鑑賞・解説 – PHPerKaigi スタッフブログ ○ PHPerコードバトルで書いたコードを紹介してみる
まとめ ● コードゴルフで役立つ知識 ○ 特有のテクニック ○ PHPの深い知識 ■ 文法、標準関数、etc. ● コードゴルフ楽しいよ! ○ 『PHPでやってみよう!』
補足・おまけ
文と式 ● 式の来るべきところに文は書けない ● 逆はOK (!) ○ if ($cond) { doSomething(); } ● 式に ; をつけると文になる ○ 式文
参考文献 ● ● ● PHP: 式 - Manual PHPの文と式 - Qiita お前はPHPの標準関数の数を知っているか #phperteanight