Skip to content

諸君とPHPと一般市民

公開日:

東京都渋谷区GMO Yoursで開催された『PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

諸君とPHPと一級市民

First-class citizen in PHP with you

2017-10-24 PHP勉強会@東京 #phpstudy

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社技術基盤チーム (pixiv.net)
  • Emacs Lisper, PHPer
  • 入社前は自宅警備をしながらRuby書いてた
  • Emacs PHP Modeのメンテナ引き継ぎました
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

はじめに

Page 4

プログラムは様々な要素の組み合せで構成される

Page 5

様々な要素?

Page 6

PHPにおいては(ざっくり)、構文(文法), 数字, 文字列, 真理値,配列, リソース, 型, クラス, 関数,オブジェクト, インターフェイス,トレイト, ファイル, 外部API,データベース, HTMLテンプレート…etc.

Page 7

われわれはいろんなものを組み合せて作る

Page 8

どうやって?

Page 9

いろんなものが現れる

<?php require 'bootstrap.php';$db = mysqli_connect();$stmt = mysqli_prepare($db, 'SELECT * FROM books');mysqli_stmt_execute($stmt);print '<h1>本の一覧</h1>';print '<ul>';foreach ($stmt as $s){print '<li>'; print $s->name; print ‘</li>';}print '</ul>';

Page 10

お気付きか

Page 11

階級制度

Page 12

いろんなものがある

Page 13

Page 14

“第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。”–第一級オブジェクト (最終更新 2017-04-23 19:00:11)

https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88

Page 15

PHPはどうかな?

Page 16

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 17

PHPはどうかな?

Page 18

明らかに一級市民ではないもの

Page 19

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

ココ→

Page 20

構文

Page 21

ifをforに変換する…といったことはできない

Page 22

🤔

Page 23

Page 24

階層できること

神配列のキーになれる

ココ→

貴族簡単に画面に出力できる

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 25

string

int

Page 26

string (文字列)

$s = "string";

echoとかで簡単に画面に出力できる

$a['str'] みたいな感じでキーになれる

あらゆるバイナリ列を格納できる

例: 画像ファイルの中身

Page 27

int (整数)

$i = 12345;

echoとかで簡単に画面に出力できる

$a[0] みたいな感じでキーになれる

PHP_INT_MINからPHP_INT_MAXの範囲のみ扱える (CPUのアーキテクチャ32bit, 64bitに依存)

Page 28

上級市民

Page 29

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

ココ→

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 30

float (浮動小数点数)

$f =1.1; $l = PHP_INT_MAX + 1;

echoとかで簡単に画面に出力できる

絶対に配列のキーにしてはいけない

エラーにもならずintに化ける

基本的に等値比較(==, ===)してはいけない

Page 31

bool (真理値)

$t = true; $f = (1 == 2);

そのままechoなどで出力できない

trueは1に化ける

falseは何も出力されない

配列キーにすると

Page 32

結果を一時変数に保存する

<?php

if ($i == 1) echo '$iは1です';

$is_success = do_something();if ($is_success) {echo "成功";} else {echo "しっぱい。。。";}

Page 33

結果を返す関数

<?php

function is_valid_keyword($key){return in_array($key, ['public', 'private']);}

Page 34

シリアライズできる

Page 35

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

上級市民シリアライズできる

ココ→

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 36

array (配列)

$a = array('a', 'b', 'c');$b = range(1, 10);$c = ['name' => $n , 'age' => $y];

ほかの言語の配列や辞書(ハッシュ, 連想配列)とか呼ばれるもの

内容にほかの型の値を含められる

Page 37

object (オブジェクト)

$dt = new DateTime('2112-09-03');

$o = (object)['name' => $n , 'age' => $y];

クラスを実体化したものキャストするとstdClassになる

内容にほかの型の値を含められる

Page 38

シリアライズ

<?php$s = serialize('string');// "s:6:"string";"$a = serialize(['apple', 'orange']);//=> "a:2:{i:0;s:5:"apple";i:1;s:6:"orange";}"

$obj = new stdClass;$obj->name = 'ミク'; $obj->age = 16;

//=> "O:8:"stdClass":2:{s:4:"name";s:6:"ミク";s:3:"age";i:16;}"

Page 39

変数に代入できる

Page 40

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

ココ→

関数や構文を経由して一級市民になれる

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 41

Closure (無名関数)

$x2 = function ($n){return $n*2};

ローカル変数として関数を作ることができる

グローバル関数は一度定義すると(同名で)作り直すことはできないが、これは何回でも作って捨てられる!

Page 42

リソース(何者である何か)

$c = curl_init(); $g = gmp_init();

リソースって一括りにされてるけど互換性はない

http://php.net/resource

resourceは型宣言に書けない

Page 43

リソースは型宣言できない

<?php

$f = function ($r) { var_dump($r); };$g = function (resource $r) { var_dump($r); };

$x = fopen('php://temp', 'r');

$f($x);$g($x);

Page 44

関数や構文を経由して一級市民になれる

Page 45

階層できること

神配列のキーになれる

貴族簡単に画面に出力できる

上級市民シリアライズできる

一級市民変数に代入できる・引数にできる

関数や構文を経由して一級市民になれる

ココ→

謎の関数によってアクセスできる

相当がんばらないと操作できない

Page 46

callable (関数っぽくできる何か)

タイプヒントにcallableって書ける

単なる文字列・配列を紛れやすい

最近は引数で受け渡すときはcallableよりも\Closureがオススメ

PHP 7.1〜 \Closure::fromCallable()これでcallableをClosureに変換できる

Page 47

callable (関数・メソッド)

<?php

$p = 'printf';$p('%s %s!', 'Hello', $p);

$c = \DateTimeImmutable::class;$dt = new $c;

$m = [$dt, 'format'];echo $m('Y-m-d H:i:s');

Page 48

ファイル

<?php

if (is_development()) {$fp = fopen('php://stderr');} else$fp = fopen('/path/to/log.txt');}

$logger = new MyLogger($fp);$logger->write($data);

Page 49

ここから下は一級市民と呼び難い

Page 50

😢

Page 51

謎の関数によってアクセスできる

Page 52

ローカル変数

compact(), extract()

プロパティ

ReflectionProperty

定数

constant()

Page 53

もう時間がない

Page 54

Symfony\VarDumper

Page 55

PsySH

Page 56

whoops!

Page 57

いい感じに表示できる

Page 58

市民権を拡張しよう