諸君とPHPと一般市民

公開日:

Download PDF

スライドテキスト

Page 1

諸君PHP一級市民

First-class citizen in PHP with you

#phpstudy

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

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');

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

$o =

クラスを実体化したもの
キャストすると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

市民権を
拡張しよう