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

公開日:

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

Download PDF

スライドテキスト

Page 1

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

Introducing PHP as a Programming Environment

#opendevcon

2017-08-19 NEEC Kamata
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

Apache+mod_php ( )

cgi-fcgi
CGI ( )

fpm-fcgi

PHP-FPM ( )

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の世界観

print
HTMLを したりすると
出力される

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向きの
機能があるプログラミング言語だよ