遊びながら強くなる!コードゴルフで学ぶPHPの言語仕様

1.4K Views

July 19, 25

スライド概要

PHPカンファレンス関西2025 (2025/7/19) の資料です

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

遊びながら強くなる! コードゴルフで学ぶPHPの言語仕様 PHPカンファレンス関西2025 荒巻拓哉 (@takaram71)

2.

おことわり ● 資料は公開済みです ● 右下のQRコードが資料のURLです ○ 次の次のスライドまで出しときます ● X, fortee からも辿れます

3.

今日のテーマ コードゴルフ

4.

今日の目標 ● コードゴルフ面白そうと思ってもらう ● PHPに少し詳しくなる

5.

荒巻拓哉 @takaram71 ● 株式会社ラクス ○ メールマーケティングサービス 「配配メール」開発 ● 大阪出身 大阪在住

6.

コードゴルフ ● お題の仕様に沿うコードを書く ● ただしできるだけ短く ● コードのバイト数=スコア ○ スコアが小さいほどよい ○ ゴルフと同じ

7.

コードゴルフ ● PHPerKaigi 2025 ○ 「PHPerコードバトル」 ○ PHPのコードゴルフで競う ■ 事前に予選 ■ Day0に決勝トーナメント

8.

コードゴルフ ● 優勝しました🏆 ○ 後日いただいた記念品 → ● 感想 ○ 楽しかった ■ パズル感覚 ○ PHPの勉強にもなった

9.

コードゴルフの問題って どんな感じ?

10.

コードゴルフ:例題 標準入力で与えられた整数Nに対して、以下のルールに従い 1からNまでを標準出力に出力してください。 ● ● ● ● 3の倍数のとき "Fizz" 5の倍数のとき "Buzz" 両方の倍数のとき "FizzBuzz" それ以外のときは数字そのもの 各出力は改行で区切ってください。

11.

普通のFizzBuzz

12.

コードゴルフのFizzBuzz 230 byte → 74 byte

13.

コードゴルフのFizzBuzz ● 空白、改行はできるだけ消す

14.

コードゴルフのFizzBuzz ● forの中身が一文なら {} 不要

15.

コードゴルフのFizzBuzz ● forの中で代入 ● (int) キャストしない

16.

コードゴルフのFizzBuzz ● インクリメント ($i++) と比較を同時に ○ $i = 0 のとき ■ echo $i++; // 0 ■ echo ++$i; // 1

17.

コードゴルフのFizzBuzz ● 配列の活用 ○ 要素数1の配列 ['Fizz'] ○ $i が3の倍数 → 'Fizz' ○ それ以外 → null → . 演算子で空文字列に

18.

コードゴルフのFizzBuzz ● Warning上等 ○ Undefined variable, Undefined array key ○ エラー制御演算子 @ で握りつぶす

19.

コードゴルフのFizzBuzz ● 改行は \n を使わない ○ PHPの文字列は普通に複数行書ける

20.

このへんはコードゴルフ的 テクニック 普段のコーディングではあんまり……

21.

コードゴルフで (きっと普段も) 役立つPHPの知識

22.

コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数

23.

コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数

24.

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

25.

PHPの言語仕様:文と式 ざっくり言うと: ● 式: $a = ここ ; return ここ ; var_dump( ここ ); ● 文: それ以外 に書けるもの

26.

PHPの言語仕様:文と式 文 式 制御構文 演算子式 if while switch foreach … + * . == ! && ?? … class Foo {...} match function foo() {...} function() {...} const FOO = 1; $foo = 1 return throw echo print

27.

PHPの言語仕様:文と式 ● 書ける場所が決まっている ○ ○ ○ ○ ○ $a = 式 myFunc(式, 式) function foo() { 文... } if (式) 文 elseif (式) 文 else 文 for (式; 式; 式) 文 ● 式の来るべきところに文は書けない

28.

PHPの言語仕様:文と式 ● echo → print に変えると式として扱える

29.

PHPの言語仕様 ● コールバック ○ callable 型 ○ array_map や usort の引数に渡すやつ ○ $callback() で呼び出せる ● 大きく分けると3種類

30.
[beta]
PHPの言語仕様:コールバック
1. 無名関数
○ function() {...}
○ fn() => ...

2. 関数/メソッド名の文字列、配列
○
○
○
○

'strlen'
'DateTime::createFromFormat'
['DateTime', 'createFromFormat']
[$date, 'format']

3. __invoke() メソッドがあるオブジェクト

31.

PHPの言語仕様:コールバック 70byte 53byte

32.

PHPの言語仕様:コールバック ● 代入は式=値を返すので、以下のようにも書ける

33.

コードゴルフで役立つPHPの知識 ● 文法、言語仕様 ○ 文と式 ○ コールバック ● 関数

34.

PHPの標準関数 ● PHPは標準関数がかなり豊富 ● 約800個とも約2000個とも ○ インストールされた拡張モジュール次第 ● 標準関数を知る → 車輪の再発明を回避

35.

PHPの標準関数 ● 全関数の暗記は無理 ○ 「こんな関数あった気がする」で調べればいい ● 必要なのは大体このへん ○ ○ ○ ○ PHP: String 関数 - Manual PHP: マルチバイト文字列 関数 - Manual PHP: PCRE 関数 - Manual PHP: 配列 関数 - Manual

36.

コードゴルフに便利な関数 ● file ○ 入力を配列で読み込む ● printf / sprintf ○ 0埋めや固定幅での出力 ● strtr ○ 文字列置換 ○ 使い方が2種類 ■ strtr('bar', 'ab', 'AB') // BAr ■ strtr('bar', ['a' => 'A', 'b' => 'B']) // BAr

37.

おわりに

38.

PHPerKaigi 2025 PHPerコードバトル ● 問題と参加者の提出コードが公開中 ○ https://t.nil.ninja/phperkaigi/2025/code-battle/ ○ ぜひ挑戦してみてください! ● 解説ブログ ○ PHPer コードバトル最終コード鑑賞・解説 – PHPerKaigi スタッフブログ ○ PHPerコードバトルで書いたコードを紹介してみる

39.

まとめ ● コードゴルフで役立つ知識 ○ 特有のテクニック ○ PHPの深い知識 ■ 文法、標準関数、etc. ● コードゴルフ楽しいよ! ○ 『PHPでやってみよう!』

40.

補足・おまけ

41.

文と式 ● 式の来るべきところに文は書けない ● 逆はOK (!) ○ if ($cond) { doSomething(); } ● 式に ; をつけると文になる ○ 式文

42.

参考文献 ● ● ● PHP: 式 - Manual PHPの文と式 - Qiita お前はPHPの標準関数の数を知っているか #phperteanight