Skip to content

プログラミング環境としてのPHP

公開日:

東京都大田区日本工学院専門学校 蒲田キャンパスで開催された『Open Developers Conference 2017 Tokyo』で出張版 PHP勉強会@東京(15分)として発表しました。

Download PDF

スライドテキスト

Page 1

プログラミング環境としての

Introducing PHP as a Programming Environment

2017-08-19 NEEC Kamata #opendevcon Open Developers Conference 2017 Tokyo

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社でひたすらPHPやってる p(ixi)v
  • フレームワークなき道にフレームを作るおしごと
  • Qiitaに記事を書いたり変なコメントしてるよ
  • 最近やってること
  • 万難が排されつつあるのでPHP7 移行
  • えいやえいやとテスト書いたり直したりしてる

Page 3

最初に覚えてほしいこと

Page 4

現在の安定版は7.1系です

Page 5

質問です

Page 6

あなたの想像するPHPコードはどれ?

Page 7

A

<!DOCTYPE html><html><head><title>Hello, PHP!</title></head><p><?php if (date('H') < 19): ?>こんにちは<?php else: ?>こんばんは<?php endif; ?></p><p>今は<?= htmlspecialchars(date('H')) ?>時です</p>

Page 8

B

<?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 9

C

<?php namespace Hoge\Http\Controller;class BooksController extends BaseController {public function index() {$books = Books::getAll();

$this->render(compact("books"));}}

Page 10

いろいろある

Page 11

よくあるPHPのコード分類

A: HTMLの条件分岐と値の出力

B: DBの内容をHTMLとして出力

C: クラス定義だけ書かれたコード

Page 12

よくあるPHPのコード分類

A: HTMLの条件分岐と値の出力↑ SSI的PHP

B: DBの内容をHTMLとして出力↑ CGI的PHP

C: クラス定義だけ書かれたコード↑ フレームワーク的PHP

Page 13

割とどうとでも書けるのがPHP

Page 14

PHPの実行手順のイメージ

コードを書く (or 既製コードを準備)

レンタルサーバーを借ります

(S)FTPで.phpファイルを転送します

デプロイ完了 \(^o^)/

Page 15

PHPで書くとURLに.phpって付くのでは??

Page 16

そんなことはない

(そんなこともある)

Page 17

ディレクトリ配置のイメージ

これをな

php-project/├── inc│ └── bootstrap.php└── public (ドキュメントルート)├── index.php├── login.php├── logout.php└── terms.html

Page 18

ディレクトリ配置のイメージ

こうじゃ

php-project/├── inc│ ├── bootstrap.php│ └── routes.php└── public (ドキュメントルート)├── .htaccess (Apacheの場合)└── index.php

Page 19

このPHPを動かすにはどうすればいいの

Page 20

PHPの動作方法にはいろいろある

Server API (SAPI) と呼ばれる

コマンドライン (cli, cli-server)

Apache+mod_php (apache)

CGI (cgi-fcgi)

PHP-FPM (fpm-fcgi)

Page 21

どこでPHPを動かせばいいか

何も考えずにレンタルサーバ借りて、ファイルを適当に転送すれば動く

HerokuとかPaaSでも簡単に動く

オンプレとかVPSとかでアプリケーションサーバーを実行する方法もある

Page 22

テストするだけならPHPだけあればok

Page 23

php -S localhost:8989 index.php

Page 24

ビルトインサーバー(php -S) PHP5.4以降

開発用の簡易HTTP鯖

Page 25

よくある.htaccess (Apache HTTPd)

# ファイルがあったら、それを返す(.phpなら実行)# 存在しなかったら、index.phpを実行RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]

Page 26

愚直な routes.php

<?php$path = substr(explode('?', $_SERVER['REQUEST_URI'], 2)[0], 1);$is_post = $_SERVER['REQUEST_METHOD'] === 'POST';

if ($is_get && $path === '/') {show_index(); return;} elseif ($path === '/login') {$is_post ? post_login() : show_login(); return;}

http_response_code(404);echo "ないよー";

Page 27

これを毎回自分で書くのはちょっぴり大変なので、フレームワークを利用する

Page 28

PHP micro framework

Slim, Lumen など

Page 29

シンプルなルーティングがしたかった

https://qiita.zonu.me/simple-routing

Page 30

そろそろ言語の話

Page 31

PHPには「protected属性」も「仮想メソッド」もありますよ。情報学科の教官が「重要だ」っていうやつは何でもね。僕自身は、こんなものどうでもいいと思ってますけど。–Rasmus Lerdorf

伝説のPHP作者「Rasmus Lerdorf」名言集を聞くと嫌PHP厨がファビョる

https://anond.hatelabo.jp/20100427231539 の訳を抜萃

Page 32

実際ふつうの言語にある機能はだいたいある

Page 33

Linux, *BSD,macOS, Windows

Page 34

RubyやPythonで書けることは概ねできると思ってよい(異常に苦手なことはある)

Page 35

Cっぽさ、Perlっぽさ、そこはかとないJavaっぽさ(結果としてどれでもない雑然とした感じ)

Page 36

Cっぽいコード

<?php

$fp = fopen('input.txt', 'r');$i = 0;

while (($line = fgets($fp, 4096)) !== false) {printf("%d: %s", ++$i, $line);}

Page 37

Perlっぽいコード

<?php

$con = mysqli_connect() or die(1);# ただし、現在は例外を利用すべき# テストもしにくくなるので非推奨

Page 38

Javaっぽいコード

<?php abstract class Foo {abstract function sample($n);}final class Bar extends Foo implements Hoge {public function sample($n) {if (!is_numeric($n)) {throw new InvalidArgumentException("errorMsg");}}}

$bar = new Bar(); $bar->sampleCode(128);

Page 39

PHPの基本構文

Page 40

データ型・リテラル

<?php// 全ての変数は $ から始まる$string = 'string' . "value";$array = [1, 2, 3];$bool = true;$int = 56789;$float = 1.234;$obj1 = new stdClass;$obj2 = (object)["name" => "Miku", "age" => 16];

Page 41

関数定義

<?php namespace zonuexe;

function triangle_area(float $h, float $b) :float {return $h * $b / 2;}

function triangle_area($h, $b) {return $h * $b / 2;}

Page 42

関数・クラス定義の注意

RubyやPythonでは関数(メソッド)を再定義したり、定義済みクラスに定義を追加できる(オープンクラス、モンキーパッチング)

その代り特定のクラスが複数ファイルに分割されることがないのでわかりやすい

Page 43

クロージャ

<?php

$h = function($s) {return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');};

$array = array_map($h, getNames());

Page 44

PHPの良い言語機能

Page 45

array

<?php$old_num = array(1, 2, 3);$fruits = ["りんご", "ばなな", "みかん"];

$tadsan = ["name" => "めぐりねるか","age" => 28,"from" => "北海道",];

Page 46

foreach

<?php$fruits = ["りんご", "ばなな", "みかん"];

for ($i = 0; $i < count($fruits); $i++) {printf("%s\n", $fruits[$i]);}

foreach ($fruits as $fruit) {printf("%s\n", $fruit);}

Page 47

ジェネレータ

<?php function fizzbuzz ($to) {for ($i = 1; $i <= $to; $i++) {$s = "";if ($i % 3 == 0) { $s .= "Fizz"; }if ($i % 5 == 0) { $s .= "Buzz"; }yield ($s === "") ? $i : $s;}}

Page 48

ジェネレータ + foreach

// フィボナッチ数列を順に出力するforeach (fizzbuzz(100) as $f) {echo $f, PHP_EOL;}

// これを応用すれば、函数型プログラミングの// 遅延リスト(無限リスト)を簡単に実装できる!

Page 49

callable (文字列)

<?php

$func= "strlen";echo $func("abcde"); //=> 5

$ary = ["a", "bc", "desc", "hello"];$bry = array_map("strlen", $ary);//=> [1, 2, 3, 4, 5]

Page 50

callable (そのほか)

<?php

$dt = new DateTime;$method = [$dt, "getTimeStamp"];

echo $method();// 1503115455 echo $dt->getTimeStamp();// 1503115455

Page 51

Reflection

<?php

function sampleFnc($a, $b, $c = null){}

$ref = new ReflectionFunction("sampleFnc");echo $ref->getNumberOfParameters();//=> 3 echo $ref->getNumberOfRequiredParameters();//=> 2

Page 52

Webプログラミングに適した機能

Page 53

実はPHPのWebはCGIの世界観HTMLを print したりすると出力される

Page 54

テンプレート

<?php// HTTPヘッダはボディよりも先に出力するheader("Content-Type: text/plain;");echo "apple\n";?>orange banana<?= getMelon() ?><?php function getMelon(){ return "melon"; }

Page 55

実は ?>ほげ<?php はecho "ほげ"; と同じ

Page 56

テンプレート

<?php $n = trim(fgets(fopen('php://stdin', 'r')));for ($i = 1; $i <= $n; $i++) {if ($i % 3 === 0) { ?>Fizz<?php }if ($i % 5 === 0) { ?>Buzz<?php }elseif ($i % 3 !== 0) echo $i;?><?php }

Page 57

出力バッファリング

<?php

ob_start();var_dump(new DateTime);$str = ob_get_clean();

var_dump($str);

Page 58

$_SERVER

<?php// http://php.net/$_SERVER を読む

// ユーザーのリクエスト情報echo htmlspecialchars($_SERVER['REQUEST_METHOD']);echo htmlspecialchars($_SERVER['REQUEST_URI']);echo htmlspecialchars($_SERVER['HTTP_ACCEPT_LANGUAGE']);

Page 59

HTTPのための機能

<?php$img = base64_decode('R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');

http_response_code(404);header("Content-Type: image/gif");header("Content-Length:".strlen($img));

echo $img;

Page 60

セッション機能

<?php // logout.php session_start();

$ls_logged_in = isset($_SESSION['user_id']);

if ($is_logged_in) {$_SESSION = [];session_regenerate_id();}

Page 61

まとめ

Page 62

まとめ

PHPは7.1系(2017年現在安定版)にしよう

PHPは多様なスタイルがあるよ

レンタルサーバーとかに適当に置けばまあなんとなく動くよ

PHPはふつうの文法とWeb向きの機能があるプログラミング言語だよ