Contenu connexe Similaire à Modern PHP Programming @ PFI Seminar (20) Plus de Sotaro Karasawa (20) Modern PHP Programming @ PFI Seminar6. PHPの特徴 (2)
math
JSON
XML
HTTP
なんでも入り
なんでも関数 MySQL
なんでもバンドル ...
./configure –help
362 行
--enable-hoge でだいたい入る
最近のLinux パッケージだと php5 でコア,
php5-mbstring で mbstring 拡張,など機能単体
でパッケージになっている
7. PHPの特徴 (3)
神がかったドキュメント
更新速すぎ
開発中機能とかもドキュメントがあったりする
サンプルコードつき
コメントつけられる
日本語訳速すぎ
TIPS php.net/fopen
fopen があればマニュアルにリダイレクト
なければ検索結果
9. PHPの特徴 (5)
TIPS PHP を dis るとホッテントリ入りする
PHPer は必ず釣れる
なぜか Perl の人も釣れる
なぜかほかの言語の人が大量に釣れる
ここぞ!とばかりに「これだから PHP は ...」と
のたまう (←おまえPHP何もわかってないだろ
11. PHP のインストール
Linux
% aptitude install php5 php5-mbstring ...
% yum install php php-mbstring ...
Mac OS
% port install php5 +mbstring ...
Windows
茨の道へようこそ
でも最近MSさんがんばってるみたい!
http://www.microsoft.com/japan/php
ソースから
(略
cf. ) http://trac.nequal.jp/browser/public/dotfiles/sotarok/misc/php53.sh
17. 変数
ちなみに
常にドル 閉じタグ ?> は省略可能
<?php
というかむしろ
「PHPのみが記述されたファイル」
のみが記述されたファイル」
のみが記述されたファイル
$_hogefuga = 1;
では書かないことが推奨 推奨される
では書かないことが推奨される
(不要な改行が出力されてしまう危
不要な改行が出力されてしまう危
されてしまう
険性があるため
があるため)
険性があるため)
文
セミコロンで終わる
<?php
$hoge = 1;
19. PHPの型
初期化方法,変換関数などにより動的に
変わる
<?php
$hoge = 1; //
$hoge = 1.0; //
整数
$hoge = "1"; //
浮動小数点
$hoge = null; // null
文字列
$hoge = true; // bool
$hoge = array(1,2,3,); //
$hoge = new DateTime(); // Object
配列
21. 変数を見たい!
var_dump 関数
オブジェクトの中身も全部見れる
<?php
$hoge = 1;
var_dump($hoge);
$hoge = "hoge";
var_dump($hoge);
int(1)
string(4) "hoge"
25. 文字列
PHP
PHPは基本的になんでも文字列
ストリームも
コールバックも
5.3以前は無名関数定義すらも!
create_function !!!! 誰も使わねえよ
<?php
$html = file_get_contents(
"http://www.preferred.jp/"
);
$int_a = array_map('intval',array("1", "2",
"3",));
26. 配列
順序付きハッシュテーブル
添え字配列/連想配列 → いっしょくた
なんでも配列にする文化
<?php
$array = array(
1, 2, 3,
'hoge' => 1,
4 => 4,
'array' => array(1, 2, 3, 4,),
);
28. クラス定義についてもうちょっと
<?php
class Hello extends Fuga { // extends で継承
// プロパティ
protected $name = "sotarok";
// コンストラクタ
public __construct() { ... }
// メソッド
public function greeting($name) {
echo 'Hello ', $name, PHP_EOL;
// プロパティには $this-> でアクセス
echo 'My name is', $this->name, PHP_EOL;
}
}
33. HTMLとロジックは分離
Logic.php
index.php Library.php
(エントリーポイント)
View.html
34. ライブラリ
1
1ファイル1クラスが基本
1
require_once / autoload などで必要なファ
イルを読み込んで利用
class
|-- Action
| |-- Info.php
| `-- UnitTest.php Ethna_Action_UnitTest
|-- ActionForm.php
|-- Backend.php
|-- CLI
| `-- ActionClass.php
|-- Controller.php Ethna_ActionForm
|-- DB
| |-- ADOdb.php
35. オブジェクト指向
メソッドチェイン
アクセス修飾子
インターフェース (interface)
抽象クラス (abstract)
<?php
$time = new DateTime();
echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo'))
->add(DateInterval::createFromDateString('1 month'))
->format('Y-m-d H:i:s'), PHP_EOL;
2009-12-26 15:41:45
36. メソッドチェイン
(をするとモダンだよ,という意味ではなく,
できるよ,というだけの話)
<?php
class Hoge
{
...
function fuga() { ... return $this; }
function piyo() { ... return $this; }
function poyo() { return $some_value; }
}
$hoge = new Hoge();
$value = $hoge->fuga()->piyo()->poyo();
37. インターフェース
class Members implements Iterator
{
private $m = array(
'早乙女アルト' => array(16, '中村悠一',),
'ランカ・リー' => array(15, '中島愛',),
'シェリル・ノーム' => array(17, '遠藤綾',),
);
public function key() { return key($this->m);}
public function current() {return current($this->m); }
public function next() { next($this->m); }
public function rewind() {reset($this->m);}
public function valid() {return $this->current() !==
false; }
}
foreach (new Members as $k => $v) {
echo $k, ": ", $v[0], "歳, CV:", $v[1], PHP_EOL;
}
38. インターフェース
class Members implements Iterator
{
private $m = array(
'早乙女アルト' => array(16, '中村悠一',),
'ランカ・リー' => array(15, '中島愛',),
'シェリル・ノーム' => array(17, '遠藤綾',),
);
早乙女アルト: 16歳,{ CV:中村悠一
public function key() return key($this->m);}
ランカ・リー: 15歳, {CV:中島愛 }
public function current() {return current($this->m); }
public function next() next($this->m);
シェリル・ノーム: 17歳, CV:遠藤綾
public function rewind() {reset($this->m);}
public function valid() {return $this->current() !==
false; }
}
foreach (new Members as $k => $v) {
echo $k, ": ", $v[0], "歳, CV:", $v[1], PHP_EOL;
}
42. __get
class Hoge
{ 存在しないプロパティにアクセスされた
public function __get($name) {
echo "really want to get ", $name, " ?",
ときに呼ばれる
PHP_EOL;
return $name;
}
}
$h = new Hoge();
echo $h->piyo;
// piyo ってプロパティは存在しない!
// __get が呼ばれる → なにかしらの値が返ってくる
43. __set
class Hoge
{ 存在しないプロパティにアクセスされた
private $prop = array();
public function __set($name, $value) {
ときに呼ばれる
echo "set ", $name, " !", PHP_EOL;
$this->prop[$name] = $value;
}
}
$h = new Hoge();
$h->piyo = 'fuga';
// piyo ってプロパティは存在しない!
// __set が呼ばれる → fugaがどこかにセットされる
44. __call
class Hoge
{ 存在しないプロパティにアクセスされた
public function __call($name, $args) {
ときに呼ばれる $name, " called!", PHP_EOL;
echo "method ",
return call_user_func__array(
array($this->some_object, $name),
$args)
);
}
}
$h = new Hoge();
$h->piyo('piyo piyo');
// piyo ってメソッドは存在しない!
// __call が呼ばれる
45. __callStatic 5.3
class Hoge
{ 存在しないプロパティにアクセスされた
public function __callStatic($name, $args) {
ときに呼ばれる $name, " called!", PHP_EOL;
echo "method ",
return call_user_func__array(
array($this->some_object, $name),
$args)
);
}
}
Hoge::piyo('piyo piyo');
// Hogeクラスのpiyoってstaticメソッドは存在しな
// __callStatic が呼ばれる
い!
46. オーバーロードの使いどころ
とにかくライブラリ作る人向けの機能
でも使う人にも当然恩恵がある
必要なリソースの必要なときに確保する
class Hoge
{
public function __call($name, $args) {
... $name をパースして呼びだすメソッドを動的に
}
変更
}
47. __call を使ったモデルクラス(例)
public function __call($method, $args)
{
if (preg_match("|^findBy|", $method)) {
$column = strtolower(str_replace('findBy', '',
$method));
$q = array_shift($args);
if (!array_key_exists($column, $this->prop)) {
return false;
}
return $this->find(D::D_FIRST,
array($column => $q,));
}
}
48. __call を使ったモデルクラス(例)
public function __call($method, $args)
{
if (preg_match("|^findBy|", $method)) {
$column = strtolower(str_replace('findBy', '',
$method));
$q = array_shift($args);
if (!array_key_exists($column, $this->prop)) {
return false;
}
findByName() などでメソッドが呼ばれ,「name
フィールドが DB に存在したら,それに一致するレ
return $this->find(D::D_FIRST,
array($column => $q,));
}
コードを取り出す」というメソッドを呼び出す
} メソッドを自分で定義する必要がなく,レコード定
義さえわかれば,あたかもメソッドとして使える
49. 例外
try { ... } catch (Exception $e) { ... }
できるようになった!
例外を発生させる
throw new Exception("message");
新しいライブラリ・フレームワークでは
すでに導入されている
しかし ...
PHP本体が例外をはいてくれないので生煮え
-> ErrorException で対応
50. 例外使う
<?php
class MyException extends Exception {}
try {
if (!file_exists('./hoge')) {
throw new MyException("ふぁいるないよ");
}
... 処理を続行
} catch (MyException $e) { // キャッチ
// メッセージを表示して終了
echo $e->getMessage(), PHP_EOL;
exit(1);
}
53. Autoload
(require/include) するための機構
クラスがなかったときに自動的に読み込む
といっても読み込むための処理は自分で記述
する
クラス名とファイル名の規則はアプリによって違うため
<?php
// これまでは使うやつ全部 require_once してた
// 使うクラスも使わないクラスもとりあえず
require_once 'class/ActionForm.php';
require_once 'class/Error.php';
require_once 'class/Util.php';
54. Autoload
<?php
function __autoload ($name) {
require_once $name . '.php';
}
$m = new PFIMembers();
// このクラスが定義されていない!
// __autoload 関数が定義されている → 呼びだし
// $name には PFIMembers (使おうとしたクラス)
// がわたされる
// 結果, PFIMembers.php が読み込まれる
// PFIMembers クラスが定義される
// インスタンスが生成される
55. SPL
Standard PHP Library
いろいろなデータ構造のためのクラスや
インターフェースを提供
日の目を見ない
だれかつかってんの?
ZFとかで地味に使われてたり
spl_autoload* くらい
56. SPL (spl_autoload_register)
autoload をもっと使いやすくする
autoloadスタック
複数のautoload関数を登録できる
1つ目でクラスが読み込めなかったら次の関数
を...
メソッドもOK
MyAutoload::load とか
array($my_autoload_instance, 'load') とか
57. SPL (spl_autoload_register)
class Al {
public static function load($name) {
$fn = $name . ".php";
if (file_exists($fn))
require_once $fn;
}
public static function loadClass($name) {
$fn = $name . ".class.php";
if (file_exists($fn))
require_once $fn;
}
}
spl_autoload_register('Al::load');
spl_autoload_register('Al::loadClass');
58. SPL (spl_autoload_register)
class Al {
public static function load($name) {
$fn = $name . ".php";
if (file_exists($fn))
require_once $fn;
}
public static function loadClass($name) {
$fn = $name . ".class.php";
if (file_exists($fn))
require_once $fn;
}
}
spl_autoload_register('Al::load');
spl_autoload_register('Al::loadClass');
59. SPL
SplPriorityQueue とか
5.3 SplMinHeap とか
RecursiveDirectoryIterator とか
OutOfRangeException とか .....
まああんま使われてないですけどね
FYI:こんど勉強会でこのネタやる (12/15)
61. SimpleXML
<?php
$url =
'http://twitter.com/statuses/public_timeli
ne.rss';
$s = simplexml_load_file($url);
foreach ($s->xpath('//item/title') as $t) {
echo $t, PHP_EOL;
}
PurpleTyger9: just started playing Halo 3. http://raptr.com/marioa9
Kell_Christie: I REMEMBER WHEN WE BOOKED @nickiminaj BACK AT LA RUMBA IN THE
SUMMER!!!ZzzzZZoooOOOOooo SHE'S A REAL SHOWSTOPPER :-)
GemCrowley: @Princess_Zo You should come. $4 drinks
02PERSONS: @justinbieber so tomorrow at 7? ;D
RuoXO: @hushiana セイクリッド2ってタイトルは聞いたことあるけど、面白いのか。
...
ちょっと調べてみよう(`・ω・´)
63. DateTime
$dt = new DateTime();
$dt->format('Y-m-d H:i:s');
デフォルトで今
$dt->setTimeZone(new
フォーマット
DateTimeZone('America/New_York');
$dt-
タイムゾーン変更したり(時差計算いらず!)
>add(DateInterval::createFromDateStering('3
year 4 month 5 day 20 hour 40 min'));
3年4カ月5日20時間40分後に移動したり
64. DateTime
$time = new DateTime();
echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo'))
->add(DateInterval::createFromDateString('1 month'))
->format('Y-m-d H:i:s'), PHP_EOL;
echo $time->setTimeZone(new
DateTimeZone('America/New_York'))
->format('Y-m-d H:i:s'), PHP_EOL;
echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo'))
->add(DateInterval::createFromDateString('9999 year 1
month 5 days'))
->format('Y-m-d H:i:s'), PHP_EOL;
2009-12-26 16:48:06
2009-12-26 02:48:06
12009-01-31 16:49:23
65. 名前空間 5.3
名前空間の定義
namespace hoge;
名前空間を指定してクラス(など)を呼び出
す
$h = new hoge¥piyo();
¥
66. 名前空間 5.3
名前空間の定義
namespace hoge;
れたPHPer
優れた
名前空間を指定してクラス(など)を呼び出
す
$h = new hoge¥piyo();
2008/12
えええっ,
「えええっ,エンマー
クになったの!?
クになったの!?
PHPオワタ ...」
オワタ 」
¥ 2009/11
かわいいよエン.
「円かわいいよエン.
バクスラもかわいい
よ」
70. おまけ:5.3から使える機能もう一つ
5.3 みんな大好き三項演算が,さらに簡単に
なりました
function get_value()
{
// なんかのリソースからデータもってくる
return array(1,2,3);
}
$hoge = get_value()?:null;
var_dump($hoge);
71. フレームワーク (独断と偏見による)
CakePHP
Model が使いやすい.それ以外は嫌いだけど.
世界でも日本でも大流行り.当然日本語での情報量も多い.
Cake3 が別フレームワークにfork
Zend Framework
世界的にシェアNo1?
書く量の減らないドMフレームワーク
symfony
というかいわゆるライブラリ郡
これも利用者多い
Ethna
大規模向け.かっちりしてる.
僕メンテナー
rhaco2
グリーはこれで動いてる!(古いバージョンだけど)
大本命の超変態フレームワーク
すごい
その他もろもろ
PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
72. フレームワーク (独断と偏見による)
CakePHP
Model が使いやすい.それ以外は嫌いだけど.
世界でも日本でも大流行り.当然日本語での情報量も多い.
ちょろっと
Cake3 が別フレームワークにfork つかいたい
Zend Framework
世界的にシェアNo1? 俺は
書く量の減らないドMフレームワーク つかわない
symfony
というかいわゆるライブラリ郡
これも利用者多い
かっちり
Ethna
大規模向け.かっちりしてる.
つくりたい
僕メンテナー
どんどん
rhaco2
グリーはこれで動いてる!(古いバージョンだけど)
使えば良い
大本命の超変態フレームワーク
すごい つかいたい
その他もろもろ
PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
75. PEAR / Openpear / pecl
PEAR / Openpear
Openpear は PEAR をもっと使いやすくするために
nequal が作った (主に @riaf)
CodeRepos みたいなもん.
% pear install –a services_twitter-beta
http//openpear.org/ http://pear.php.net/
pecl はそれの拡張機能版
とりあえず APC いれとく
開発環境なら xdebug も入れる
% pecl install apc
http://pecl.php.net/
76. phpman
PHP
コマンドラインで使えるPHPリファレンス
http://openpear.org/package/phpman
拙作
% pear install openpear/phpman
% pera run-scripts openpear/phpman
% phpman fopen
77. phpall
全バージョンの PHP の挙動を一気にため
す
http://d.hatena.ne.jp/hnw/20090110
% phpall '"0x1 == "1e0"'
php-5.0.0: bool(true)
php-5.0.1: bool(true)
php-5.0.2: bool(true)
php-5.0.3: bool(false)
php-5.0.4: bool(false)
...
80. コミュニティ
PHP
PHPユーザ会
毎月のPHP勉強会 http://events.php.gr.jp/
年一度 PHP 勉強会
その他各フレームワーク・CMSでコミュ
ニティが乱立
最近は CakePHP がデカい (勉強会/カンファレ
ンスなど)
cf. http://twitter.com/sotarok/phper