PHP Taught Me Good and Bad Things 
いいことも悪いこともぜんぶ 
PHPが教えてくれた 
小泉 守義 <moriyoshi@php.net> 
@moriyoshit
自己紹介 
PHPの開発に携わって10余年 
PHPのビルトインWebサーバを実装しました 
現在Python、Ruby、Go、C#、C、C++を書いて生 
計を立てています 
今回は自分の思いをまとめて共有したいという願い 
でLT
PHPの生い立ち 
1994 Personal Home Page Tools 
1996 PHP/FI 
1998 PHP3 
2000 PHP4 
2004 PHP5
PHPの生い立ち 
1994 Personal Home Page Tools 
1996 PHP/FI 
1998 PHP3 
2000 PHP4 
2004 PHP5 
この辺から使い始めた
PHPの生い立ち 
1994 Personal Home Page Tools 
1996 PHP/FI 
1998 PHP3 
2000 PHP4 
2004 PHP5 
Celebrate the 20th aniversary!
PHPの教えてくれたこと 
PHPはWebアプリの落とし穴を教えてくれた 
PHPは文字コードの問題を教えてくれた 
PHPは一貫性が大事なことを教えてくれた 
PHPは哲学がないという哲学を教えてくれた
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form>
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form>
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form>
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form> 
CSRF!!
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form> 
CSRF!!
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form> 
CSRF!! 
SQLInjection!!
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form> 
CSRF!! 
SQLInjection!!
PHPはWebアプリの 
落とし穴を教えてくれた 
<?php 
$name = $_REQUEST['name']; 
$sql = "INSERT INTO User (name) VALUES ('$name');"; 
mysql_query($sql, $dbconn); 
?> 
... 
<form method="post"> 
<input type="text" name="name" 
value="<?=$name ?>" /> 
</form> 
CSRF!! 
SQLInjection!! 
XSS!!
PHPはWebアプリの 
落とし穴を教えてくれた 
今は認知されているが、2000年前後には常識ではな 
かった 
多くの入門書で脆弱なサンプルが 
より高度な解説書を読むにつれて自己否定されるつ 
らみ
PHPは文字コードの問題を 
教えてくれた 
<?php 
// That backslash does the trick 
$name = “日本語能力検定”; 
// One japanese character occupies 
// two ordinary characters?? 
$c = substr($name, $i * 2, 2); 
?> 
...
PHPは文字コードの問題を 
教えてくれた 
<?php 
Shift_JIS... 
// That backslash does the trick 
$name = “日本語能力検定”; 
// One japanese character occupies 
// two ordinary characters?? 
$c = substr($name, $i * 2, 2); 
?> 
mb_substr... 
...
PHPは文字コードの問題を 
教えてくれた 
<?php 
Shift_JIS... 
// That backslash does the trick 
$name = “日本語能力検定”; 
// One japanese character occupies 
// two ordinary characters?? 
$c = substr($name, $i * 2, 2); 
?> 
mb_substr... 
...
PHPは文字コードの問題を 
教えてくれた 
<?php 
Shift_JIS... 
// That backslash does the trick 
$name = “日本語能力検定”; 
// One japanese character occupies 
// two ordinary characters?? 
$c = substr($name, $i * 2, 2); 
?> 
mb_substr... 
...
PHPは文字コードの問題を 
教えてくれた 
主に東アジア圏外の開発者の体験と思われる 
PHPの開発者には当初全く文字コードの意識がなか 
った 
多くの入門書では、なぜmb_XXXを使わないといけ 
ないのか、ごまかしているものが多い
PHPは一貫性が大事なこと 
を教えてくれた 
<?php 
$index = array_search('c', ['a', 'b', 'c']); 
var_dump($index); // int(2) 
$index = strpos('abc', 'c') 
var_dump($index); // int(2)
PHPは一貫性が大事なこと 
を教えてくれた 
<?php 
$index = array_search('c', ['a', 'b', 'c']); 
var_dump($index); // int(2) 
$index = strpos('abc', 'c') 
var_dump($index); // int(2)
PHPは一貫性が大事なこと 
を教えてくれた 
<?php 
$index = array_search('c', ['a', 'b', 'c']); 
var_dump($index); // int(2) 
$index = strpos('abc', 'c') 
var_dump($index); // int(2)
PHPは一貫性が大事なこと 
を教えてくれた 
<?php 
$index = array_search('c', ['a', 'b', 'c']); 
var_dump($index); // int(2) 
$index = strpos('abc', 'c') 
var_dump($index); // int(2) 引数が逆
PHPは一貫性が大事なこと 
を教えてくれた 
array_searchの名誉のために言うと、in_arrayと引 
数の順序を一致させたのがこの問題の由来 
(◯◯ in △△...) 
一貫していないのは、黎明期にPHP「を」開発して 
いるコミッタが少なかったから
PHPは哲学がないという 
哲学を教えてくれた 
<?php 
$di = DIContainer::getInstance(); 
$orm = $di->get('ORM'); 
$ormSession = $orm->getOrCreateSession(); 
$damnHotEmployees = $ormSession->find('Employee') 
>where('age >= 50’)->all(); 
... 
tr> 
td><?=htmlspecialchars($damnHotEmployee->name) ?></td><?=htmlspecialchars($damnHotEmployee->age) ?></td><?=htmlspecialchars($damnHotEmployee->gender)
PHPは哲学がないという 
哲学を教えてくれた 
<?php 
$di = DIContainer::getInstance(); 
$orm = $di->get('ORM'); 
$ormSession = $orm->getOrCreateSession(); 
$damnHotEmployees = $ormSession->find('Employee') 
>where('age >= 50’)->all(); 
... 
tr> 
標準関数なのかフレームワークのコードかすぐわかる 
td><?=htmlspecialchars($damnHotEmployee->name) ?></td><?=htmlspecialchars($damnHotEmployee->age) ?></td><?=htmlspecialchars($damnHotEmployee->gender)
PHPは哲学がないという 
哲学を教えてくれた 
PHPそのものに哲学はない 
プログラマに哲学を与えるのはライブラリやフレー 
ムワーク 
PHPはそのための部品に徹している
考察 
PHPが他の言語と違うのは剥き出しの生き様だから 
Webを取り巻く環境の変化とともにPHPもPHPプ 
ログラマも成長してきた 
PHPから卒業するのもPHPをより成長させるのもプ 
ログラマ次第ではないか

よいことも悪いこともぜんぶPHPが教えてくれた