Your SlideShare is downloading. ×
0
Modern
PHP
Programming
~コピパーからの脱出~

              @ PFI 社内セミナー
                     by id:sotarok
PHP

 もっとも誤解されたプログラミング言語
 最強のウェブ開発言語
  簡単
  速い
  かわいい
本日のお話の構成

PHP
PHPの特徴
PHPのソコソコ入門
独断と偏見によるモダンPHP入門
最近のPHPを取り巻く環境

※本文中の記号
 5.3 のみ   5.3
 お得情報     TIPS
PHP の特徴 5 つ
これだけ抑えれば PHP の8割はOK!
PHPの特徴 (1)

 ウェブ特化型プログラミング言語
 HTMLの中にプログラムロジックをかける
  でも書かないでね (ぉ
PHPの特徴 (2)
                           math
                          JSON
                           XML
                 ...
PHPの特徴 (3)

       神がかったドキュメント
        更新速すぎ
          開発中機能とかもドキュメントがあったりする
        サンプルコードつき
        コメントつけられる
        日...
PHPの特徴 (4)

 PHPer -> 「ぺちぱー」と読む
 PHP -> 「ぺちぺ」と読む
 phpize (コマンド) -> 「ぺちぱいず」と読む
PHPの特徴 (5)

TIPS   PHP を dis るとホッテントリ入りする
        PHPer は必ず釣れる
        なぜか Perl の人も釣れる
        なぜかほかの言語の人が大量に釣れる
         ...
PHP ソコソコ入門
とりあえず使ってみる
PHP のインストール
Linux
  % aptitude install php5 php5-mbstring ...
  % yum install php php-mbstring ...
Mac OS
  % port install...
動かす

% echo "<?php phpinfo(); " > /path/to/www/info.php
とりあえず書いてみる
<html>
<head><title>PHP test</title></head>
<body>
<ul>
<?php
  foreach (range(1, 10) as $v) {
    echo '<li>',...
とりあえず書いてみる
<html>
<head><title>PHP test</title></head>
<body>
<ul>
<?php
  foreach (range(1, 10) as $v) {
    echo '<li>',...
余談

思わずかつての PHP っぽさを出すために
HTMLの中にPHPコードと書いちゃったけ
ど本当言うとこういうのはサンプルでも
出すべきじゃないとは思うんですよね,
「そういうのがPHPなんだ」という第一印
象が根強くついてしまうからです...
変数
 常にドル
<?php
$_hogefuga = 1;



文
  セミコロンで終わる
<?php
$hoge = 1;
変数
                  ちなみに
 常にドル             閉じタグ ?> は省略可能

<?php
                  というかむしろ
                  「PHPのみが記述されたフ...
自動定義変数/スーパーグローバル変数
http://jp.php.net/manual/ja/reserved.variables.php


    自動的に定義される
<?php
var_dump($argc);


    あらゆるスコー...
PHPの型

 初期化方法,変換関数などにより動的に
 変わる
<?php
$hoge   =   1;                //
$hoge   =   1.0;              //
                  ...
PHPの型

 初期化方法,変換関数などにより動的に
 変わる
<?php
$hoge = intval(1);
$hoge = floatval($hoge);
$hoge = strval($hoge);
...
変数を見たい!

 var_dump 関数
   オブジェクトの中身も全部見れる
<?php
$hoge = 1;
var_dump($hoge);
$hoge = "hoge";
var_dump($hoge);

int(1)
string...
演算子 (特徴的なもののみ)

比較演算子 == / != / === / !==
エラー制御演算子 @
文字列結合 .
型演算子 instanceof
比較演算子

 http://www.php.net/manual/ja/types.comparisons.php
 http://d.hatena.ne.jp/hnw/20080606
 ==/!= での比較は,キャストが発生します
 ==...
関数

 関数
<?php

function add ($v1, $v2) {
  return $v1 + $v2;
}

echo add(1, 2), PHP_EOL;    // 3
文字列

  PHP
  PHPは基本的になんでも文字列
    ストリームも
    コールバックも
    5.3以前は無名関数定義すらも!
      create_function !!!! 誰も使わねえよ
<?php
$html = ...
配列

 順序付きハッシュテーブル
 添え字配列/連想配列 → いっしょくた
 なんでも配列にする文化
<?php
$array = array(
   1, 2, 3,
   'hoge' => 1,
   4 => 4,
   'array...
クラス

 普通にクラスが定義できます
<?php
class Hello
{
  public function greeting($name) {
      echo 'Hello ', $name, PHP_EOL;
  }
}

$h...
クラス定義についてもうちょっと
<?php
class Hello extends Fuga { // extends で継承
  // プロパティ
  protected $name = "sotarok";
  // コンストラクタ
  p...
クラス定義についてもうちょっと2

クラス定数
 const
プロパティの修飾
 public/private/protected
 static
メソッドの修飾
 public/private/protected
 static
クラス
 a...
クラス定義についてもうちょっと3

$this キーワード
 $this->prop
 $this->method();
クラス定数
 Hoge::PIYO;
メソッドのstatic呼びだし
 Hoge::piyo();
static 変数への...
定義済みのなにか

PHPには定義済みのなにかがいーーっぱい
 拡張機能を入れると関数・クラス・定数はグロー
 バルに定義されるから.↓の数は環境により違う

定義済み関数: 1725
 % php -r
 'var_dump(count(ar...
独断と偏見によるモダンPHP入門
えーまだそんな書き方してるの?
 古代の人?   といわれないために.




HTMLとロジックの分離
主な内容:

オブジェクト指向
インターフェース
オーバーロード

Autoload
例外・エラーハンド...
HTMLとロジックは分離


                            Logic.php
 index.php    Library.php
(エントリーポイント)

                            Vi...
ライブラリ

  1
  1ファイル1クラスが基本
            1
  require_once / autoload などで必要なファ
  イルを読み込んで利用
class
|-- Action
|   |-- Info.php
...
オブジェクト指向

  メソッドチェイン
  アクセス修飾子
  インターフェース (interface)
  抽象クラス (abstract)
<?php
$time = new DateTime();
echo $time->setTime...
メソッドチェイン
  (をするとモダンだよ,という意味ではなく,
  できるよ,というだけの話)
<?php
class Hoge
{
  ...
  function fuga() { ... return $this; }
  functi...
インターフェース
class Members implements Iterator
{
    private $m = array(
        '早乙女アルト' => array(16, '中村悠一',),
        'ランカ・...
インターフェース
class Members implements Iterator
{
    private $m = array(
        '早乙女アルト' => array(16, '中村悠一',),
        'ランカ・...
インターフェース

いくつかの定義済みインターフェース
 Iterator
  イテレート可能になる (foreach にわたせる)
 ArrayAccess
  配列的なアクセスが可能になる
SPL インターフェース (後述)
オーバーロード

C++とかのオーバーロードとは違います
のまえに,マジックメソッドについて

__ で始まるメソッド
 なにかの条件のときに自動的に呼ばれるメ
 ソッド
 例: __toString()
  これが定義されていると,オブジェク...
マジックメソッド

__construct / __destruct
__isset
__unset
__sleep / __awake
__clone
__invoke
__get / __set / __call / __callStatic
__get
class Hoge
{ 存在しないプロパティにアクセスされた
  public function __get($name) {
     echo "really want to get ", $name, " ?",
   とき...
__set
class Hoge
{ 存在しないプロパティにアクセスされた
  private $prop = array();
  public function __set($name, $value) {
   ときに呼ばれる
     ...
__call
class Hoge
{ 存在しないプロパティにアクセスされた
  public function __call($name, $args) {
   ときに呼ばれる $name, " called!", PHP_EOL;
   ...
__callStatic          5.3


class Hoge
{ 存在しないプロパティにアクセスされた
  public function __callStatic($name, $args) {
   ときに呼ばれる $nam...
オーバーロードの使いどころ

  とにかくライブラリ作る人向けの機能
    でも使う人にも当然恩恵がある
  必要なリソースの必要なときに確保する
class Hoge
{
  public function __call($name, $a...
__call を使ったモデルクラス(例)
public function __call($method, $args)
  {
    if (preg_match("|^findBy|", $method)) {
      $column ...
__call を使ったモデルクラス(例)
public function __call($method, $args)
  {
    if (preg_match("|^findBy|", $method)) {
      $column ...
例外
try { ... } catch (Exception $e) { ... }
  できるようになった!
例外を発生させる
  throw new Exception("message");
新しいライブラリ・フレームワークでは
すでに...
例外使う
<?php
class MyException extends Exception {}

try {
  if (!file_exists('./hoge')) {
      throw new MyException("ふぁいる...
PHPのエラーハンドリング
エラーハンドラを自分で定義して登録
 挙動を変えられる
set_error_handler('関数名');
 エラーが発生すると,エラーコードとともに
 この関数が呼ばれる
 フレームワークはだいたいこれでエラー制御...
ErrorException
  http://jp.php.net/manual/ja/class.errorexcepti
  on.php
  すべてのエラーを例外にする方法
<?php
function exception_error_...
Autoload


  (require/include) するための機構
  クラスがなかったときに自動的に読み込む

  といっても読み込むための処理は自分で記述
  する
   クラス名とファイル名の規則はアプリによって違うため

<?...
Autoload
<?php

function __autoload ($name) {
  require_once $name . '.php';
}

$m = new PFIMembers();
 // このクラスが定義されていない!...
SPL

 Standard PHP Library
 いろいろなデータ構造のためのクラスや
 インターフェースを提供
 日の目を見ない
  だれかつかってんの?
  ZFとかで地味に使われてたり
 spl_autoload* くらい
SPL (spl_autoload_register)

 autoload をもっと使いやすくする
 autoloadスタック
  複数のautoload関数を登録できる
  1つ目でクラスが読み込めなかったら次の関数
  を...
 メソッ...
SPL (spl_autoload_register)
class Al {
    public static function load($name) {
        $fn = $name . ".php";
        if (...
SPL (spl_autoload_register)
class Al {
    public static function load($name) {
        $fn = $name . ".php";
        if (...
SPL

      SplPriorityQueue とか
5.3   SplMinHeap とか
      RecursiveDirectoryIterator とか
      OutOfRangeException とか .....
...
SimpleXML

 PHPでXML扱うならコレ
 libxml2 のラッパー
 とにかくとりあえず便利
 要素にプロパティとしてアクセス可能
 xpathが使える
 htmlにも使える (DOMとして読み込ませて
 SimpleXMLに変換...
SimpleXML
<?php
$url =
  'http://twitter.com/statuses/public_timeli
  ne.rss';
$s = simplexml_load_file($url);
foreach ($s...
DateTime

 どの言語でも悩ましい日付の扱い
 日付を扱うクラス
 5系から導入され,徐々に機能拡張
  タイムゾーン
  日付差分 (DateInterval)   5.3



 対比: date 関数群
  関数いろいろ
  20...
DateTime

 $dt = new DateTime();

 $dt->format('Y-m-d H:i:s');
   デフォルトで今


 $dt->setTimeZone(new
   フォーマット

 DateTimeZone...
DateTime
$time = new DateTime();
echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo'))
    ->add(DateInterval::createFro...
名前空間         5.3




名前空間の定義
 namespace hoge;
名前空間を指定してクラス(など)を呼び出
す
 $h = new hoge¥piyo();



                   ¥
名前空間           5.3




 名前空間の定義
   namespace hoge;
           れたPHPer
          優れた
 名前空間を指定してクラス(など)を呼び出
 す
   $h = new h...
名前空間を使う
<?php
// hoge.php
namespace hoge;
class foo {
    function __construct(){
        echo __CLASS__, PHP_EOL;
    }
}...
複数の名前空間を1ファイルに定義
<?php
// hoge.php
namespace hoge {
class foo {
    function __construct(){
        echo __CLASS__, PHP_EO...
名前空間は使うべきか?

メジャーなフレームワークの次期次期
バージョンくらいでは,すでに名前空間
付きで開発が始まっている
ゆるやかに移行していくでしょう
まあでもしばらく5.2環境のところも多い
でしょう
おまけ:5.3から使える機能もう一つ
5.3   みんな大好き三項演算が,さらに簡単に
      なりました
function get_value()
{
    // なんかのリソースからデータもってくる
    return array(...
フレームワーク (独断と偏見による)
CakePHP

  Model が使いやすい.それ以外は嫌いだけど.
  世界でも日本でも大流行り.当然日本語での情報量も多い.

  Cake3 が別フレームワークにfork
Zend Framewor...
フレームワーク (独断と偏見による)
CakePHP

  Model が使いやすい.それ以外は嫌いだけど.
  世界でも日本でも大流行り.当然日本語での情報量も多い.
                              ちょろっと
 ...
まだモダンには程遠いんですけど

たぶん時間がないので割愛させていただ
く内容:
 無名関数
  $h = function() { ... };
 Phar
 その他
PHPをとりまく環境
しっといて損はない
PEAR / Openpear / pecl

 PEAR / Openpear
  Openpear は PEAR をもっと使いやすくするために
  nequal が作った (主に @riaf)
    CodeRepos みたいなもん.
 ...
phpman

            PHP
 コマンドラインで使えるPHPリファレンス
  http://openpear.org/package/phpman
  拙作


 % pear install openpear/phpman
...
phpall

 全バージョンの PHP の挙動を一気にため
 す
   http://d.hatena.ne.jp/hnw/20090110


 % phpall '"0x1 == "1e0"'
php-5.0.0:   bool(true...
数々の変態パッチ
moriyoshi 氏による
 http://d.hatena.ne.jp/moriyoshi/20090905/125217
 7259
  echo new DateTime()->format();
 Boost.PHP...
PHP界に降臨する3人の神(多神教)

masaki fujimoto

  mbstring
  元祖神


moriyoshi koizumi
  グリーとEthna の親

  変態神(PHPに限らず)
  なんでもできる人

masah...
コミュニティ

PHP
PHPユーザ会
  毎月のPHP勉強会 http://events.php.gr.jp/
  年一度 PHP 勉強会
その他各フレームワーク・CMSでコミュ
ニティが乱立
  最近は CakePHP がデカい (勉強会/...
TIPS

優れたPHPerになるための三大条件

 受け入れる
       名前空間区切りが ¥
       → いつのまにか可愛く見えてきた
 求めない
       「なんで三項演算の結合が ...」
       → きっとだれかが...
ご静聴ありがとうございました
Upcoming SlideShare
Loading in...5
×

Modern PHP Programming @ PFI Seminar

15,408

Published on

Published in: Technology
4 Comments
30 Likes
Statistics
Notes
No Downloads
Views
Total Views
15,408
On Slideshare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
138
Comments
4
Likes
30
Embeds 0
No embeds

No notes for slide

Transcript of "Modern PHP Programming @ PFI Seminar"

  1. 1. Modern PHP Programming ~コピパーからの脱出~ @ PFI 社内セミナー by id:sotarok
  2. 2. PHP もっとも誤解されたプログラミング言語 最強のウェブ開発言語 簡単 速い かわいい
  3. 3. 本日のお話の構成 PHP PHPの特徴 PHPのソコソコ入門 独断と偏見によるモダンPHP入門 最近のPHPを取り巻く環境 ※本文中の記号 5.3 のみ 5.3 お得情報 TIPS
  4. 4. PHP の特徴 5 つ これだけ抑えれば PHP の8割はOK!
  5. 5. PHPの特徴 (1) ウェブ特化型プログラミング言語 HTMLの中にプログラムロジックをかける でも書かないでね (ぉ
  6. 6. PHPの特徴 (2) math JSON XML HTTP なんでも入り なんでも関数 MySQL なんでもバンドル ... ./configure –help 362 行 --enable-hoge でだいたい入る 最近のLinux パッケージだと php5 でコア, php5-mbstring で mbstring 拡張,など機能単体 でパッケージになっている
  7. 7. PHPの特徴 (3) 神がかったドキュメント 更新速すぎ 開発中機能とかもドキュメントがあったりする サンプルコードつき コメントつけられる 日本語訳速すぎ TIPS php.net/fopen fopen があればマニュアルにリダイレクト なければ検索結果
  8. 8. PHPの特徴 (4) PHPer -> 「ぺちぱー」と読む PHP -> 「ぺちぺ」と読む phpize (コマンド) -> 「ぺちぱいず」と読む
  9. 9. PHPの特徴 (5) TIPS PHP を dis るとホッテントリ入りする PHPer は必ず釣れる なぜか Perl の人も釣れる なぜかほかの言語の人が大量に釣れる ここぞ!とばかりに「これだから PHP は ...」と のたまう (←おまえPHP何もわかってないだろ
  10. 10. PHP ソコソコ入門 とりあえず使ってみる
  11. 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
  12. 12. 動かす % echo "<?php phpinfo(); " > /path/to/www/info.php
  13. 13. とりあえず書いてみる <html> <head><title>PHP test</title></head> <body> <ul> <?php foreach (range(1, 10) as $v) { echo '<li>', $v, '</li>'; } ?> </ul> </body></html>
  14. 14. とりあえず書いてみる <html> <head><title>PHP test</title></head> <body> <ul> <?php foreach (range(1, 10) as $v) { echo '<li>', $v, '</li>'; } ?> <?php から ?>まで が PHP ブロック </ul> </body></html> プログラムとして実行. それ以外は出力される
  15. 15. 余談 思わずかつての PHP っぽさを出すために HTMLの中にPHPコードと書いちゃったけ ど本当言うとこういうのはサンプルでも 出すべきじゃないとは思うんですよね, 「そういうのがPHPなんだ」という第一印 象が根強くついてしまうからです.とい うわけで今後は全部CLIのサンプルコード がでてきます.プログラミングPHPについ ての発表ですので!ウェブアプリに関し ては興味があればまた聞いてください!
  16. 16. 変数 常にドル <?php $_hogefuga = 1; 文 セミコロンで終わる <?php $hoge = 1;
  17. 17. 変数 ちなみに 常にドル 閉じタグ ?> は省略可能 <?php というかむしろ 「PHPのみが記述されたファイル」 のみが記述されたファイル」 のみが記述されたファイル $_hogefuga = 1; では書かないことが推奨 推奨される では書かないことが推奨される (不要な改行が出力されてしまう危 不要な改行が出力されてしまう危 されてしまう 険性があるため があるため) 険性があるため) 文 セミコロンで終わる <?php $hoge = 1;
  18. 18. 自動定義変数/スーパーグローバル変数 http://jp.php.net/manual/ja/reserved.variables.php 自動的に定義される <?php var_dump($argc); あらゆるスコープからアクセス可能 ウェブサーバ経由でPHPが起動された場合 http://localhost/hoge.php?hoge=fuga <?php var_dump($_GET['hoge']); // fuga var_dump($_SERVER['REMOTE_ADDR']); //環境変数
  19. 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 配列
  20. 20. PHPの型 初期化方法,変換関数などにより動的に 変わる <?php $hoge = intval(1); $hoge = floatval($hoge); $hoge = strval($hoge); ...
  21. 21. 変数を見たい! var_dump 関数 オブジェクトの中身も全部見れる <?php $hoge = 1; var_dump($hoge); $hoge = "hoge"; var_dump($hoge); int(1) string(4) "hoge"
  22. 22. 演算子 (特徴的なもののみ) 比較演算子 == / != / === / !== エラー制御演算子 @ 文字列結合 . 型演算子 instanceof
  23. 23. 比較演算子 http://www.php.net/manual/ja/types.comparisons.php http://d.hatena.ne.jp/hnw/20080606 ==/!= での比較は,キャストが発生します ===/!== を使いましょう! 全部 true です <?php var_dump("1" == 1); var_dump("10匹のハエ" == 10); var_dump(null == false); var_dump(array() == false);
  24. 24. 関数 関数 <?php function add ($v1, $v2) { return $v1 + $v2; } echo add(1, 2), PHP_EOL; // 3
  25. 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. 26. 配列 順序付きハッシュテーブル 添え字配列/連想配列 → いっしょくた なんでも配列にする文化 <?php $array = array( 1, 2, 3, 'hoge' => 1, 4 => 4, 'array' => array(1, 2, 3, 4,), );
  27. 27. クラス 普通にクラスが定義できます <?php class Hello { public function greeting($name) { echo 'Hello ', $name, PHP_EOL; } } $h = new Hello(); $h->greeting('sotarok');
  28. 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; } }
  29. 29. クラス定義についてもうちょっと2 クラス定数 const プロパティの修飾 public/private/protected static メソッドの修飾 public/private/protected static クラス abstract インターフェース interface / implements スコープ定義演算子 ::
  30. 30. クラス定義についてもうちょっと3 $this キーワード $this->prop $this->method(); クラス定数 Hoge::PIYO; メソッドのstatic呼びだし Hoge::piyo(); static 変数へのアクセス Hoge::$static_prop = 5;
  31. 31. 定義済みのなにか PHPには定義済みのなにかがいーーっぱい 拡張機能を入れると関数・クラス・定数はグロー バルに定義されるから.↓の数は環境により違う 定義済み関数: 1725 % php -r 'var_dump(count(array_shift(get_defined_functions()) ));' 定義済み定数: 1696 % php -r 'var_dump(count(get_defined_constants()));' 定義済みクラス: 145 % php -r 'var_dump(count(get_declared_classes()));'
  32. 32. 独断と偏見によるモダンPHP入門 えーまだそんな書き方してるの? 古代の人? といわれないために. HTMLとロジックの分離 主な内容: オブジェクト指向 インターフェース オーバーロード Autoload 例外・エラーハンドリング SPL SimpleXML DateTime 名前空間 フレームワーク
  33. 33. HTMLとロジックは分離 Logic.php index.php Library.php (エントリーポイント) View.html
  34. 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. 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. 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. 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. 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; }
  39. 39. インターフェース いくつかの定義済みインターフェース Iterator イテレート可能になる (foreach にわたせる) ArrayAccess 配列的なアクセスが可能になる SPL インターフェース (後述)
  40. 40. オーバーロード C++とかのオーバーロードとは違います のまえに,マジックメソッドについて __ で始まるメソッド なにかの条件のときに自動的に呼ばれるメ ソッド 例: __toString() これが定義されていると,オブジェクトをstring として呼んだとき(echoしたりとか),このメ ソッドが呼ばれる
  41. 41. マジックメソッド __construct / __destruct __isset __unset __sleep / __awake __clone __invoke __get / __set / __call / __callStatic
  42. 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. 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. 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. 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. 46. オーバーロードの使いどころ とにかくライブラリ作る人向けの機能 でも使う人にも当然恩恵がある 必要なリソースの必要なときに確保する class Hoge { public function __call($name, $args) { ... $name をパースして呼びだすメソッドを動的に } 変更 }
  47. 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. 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. 49. 例外 try { ... } catch (Exception $e) { ... } できるようになった! 例外を発生させる throw new Exception("message"); 新しいライブラリ・フレームワークでは すでに導入されている しかし ... PHP本体が例外をはいてくれないので生煮え -> ErrorException で対応
  50. 50. 例外使う <?php class MyException extends Exception {} try { if (!file_exists('./hoge')) { throw new MyException("ふぁいるないよ"); } ... 処理を続行 } catch (MyException $e) { // キャッチ // メッセージを表示して終了 echo $e->getMessage(), PHP_EOL; exit(1); }
  51. 51. PHPのエラーハンドリング エラーハンドラを自分で定義して登録 挙動を変えられる set_error_handler('関数名'); エラーが発生すると,エラーコードとともに この関数が呼ばれる フレームワークはだいたいこれでエラー制御 ログに吐いたりアラーとメール飛ばしたり おす こともできる→ ErrorException で,すべてのエラーをexceptionに投げな
  52. 52. ErrorException http://jp.php.net/manual/ja/class.errorexcepti on.php すべてのエラーを例外にする方法 <?php function exception_error_handler ($errno, $errstr, $errfile, $errline) { throw new ErrorException ($errstr, 0, $errno, $errfile, $errline); } set_error_handler("exception_error_handler");
  53. 53. Autoload (require/include) するための機構 クラスがなかったときに自動的に読み込む といっても読み込むための処理は自分で記述 する クラス名とファイル名の規則はアプリによって違うため <?php // これまでは使うやつ全部 require_once してた // 使うクラスも使わないクラスもとりあえず require_once 'class/ActionForm.php'; require_once 'class/Error.php'; require_once 'class/Util.php';
  54. 54. Autoload <?php function __autoload ($name) { require_once $name . '.php'; } $m = new PFIMembers(); // このクラスが定義されていない! // __autoload 関数が定義されている → 呼びだし // $name には PFIMembers (使おうとしたクラス) // がわたされる // 結果, PFIMembers.php が読み込まれる // PFIMembers クラスが定義される // インスタンスが生成される
  55. 55. SPL Standard PHP Library いろいろなデータ構造のためのクラスや インターフェースを提供 日の目を見ない だれかつかってんの? ZFとかで地味に使われてたり spl_autoload* くらい
  56. 56. SPL (spl_autoload_register) autoload をもっと使いやすくする autoloadスタック 複数のautoload関数を登録できる 1つ目でクラスが読み込めなかったら次の関数 を... メソッドもOK MyAutoload::load とか array($my_autoload_instance, 'load') とか
  57. 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. 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. 59. SPL SplPriorityQueue とか 5.3 SplMinHeap とか RecursiveDirectoryIterator とか OutOfRangeException とか ..... まああんま使われてないですけどね FYI:こんど勉強会でこのネタやる (12/15)
  60. 60. SimpleXML PHPでXML扱うならコレ libxml2 のラッパー とにかくとりあえず便利 要素にプロパティとしてアクセス可能 xpathが使える htmlにも使える (DOMとして読み込ませて SimpleXMLに変換) ただし,xmlを一気に全部パースするため, 巨大なxmlにはむかない
  61. 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ってタイトルは聞いたことあるけど、面白いのか。 ... ちょっと調べてみよう(`・ω・´)
  62. 62. DateTime どの言語でも悩ましい日付の扱い 日付を扱うクラス 5系から導入され,徐々に機能拡張 タイムゾーン 日付差分 (DateInterval) 5.3 対比: date 関数群 関数いろいろ 2038年の越えられない壁 Unix Timestamp を基準
  63. 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. 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. 65. 名前空間 5.3 名前空間の定義 namespace hoge; 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); ¥
  66. 66. 名前空間 5.3 名前空間の定義 namespace hoge; れたPHPer 優れた 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); 2008/12 えええっ, 「えええっ,エンマー クになったの!? クになったの!? PHPオワタ ...」 オワタ 」 ¥ 2009/11 かわいいよエン. 「円かわいいよエン. バクスラもかわいい よ」
  67. 67. 名前空間を使う <?php // hoge.php namespace hoge; class foo { function __construct(){ echo __CLASS__, PHP_EOL; } } <?php require 'hoge.php'; $h = new hoge¥foo(); hoge¥foo
  68. 68. 複数の名前空間を1ファイルに定義 <?php // hoge.php namespace hoge { class foo { function __construct(){ echo __CLASS__, PHP_EOL; } } } // namespace hoge namespace fuga { ... } // namespace fuga
  69. 69. 名前空間は使うべきか? メジャーなフレームワークの次期次期 バージョンくらいでは,すでに名前空間 付きで開発が始まっている ゆるやかに移行していくでしょう まあでもしばらく5.2環境のところも多い でしょう
  70. 70. おまけ:5.3から使える機能もう一つ 5.3 みんな大好き三項演算が,さらに簡単に なりました function get_value() { // なんかのリソースからデータもってくる return array(1,2,3); } $hoge = get_value()?:null; var_dump($hoge);
  71. 71. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. Cake3 が別フレームワークにfork Zend Framework 世界的にシェアNo1? 書く量の減らないドMフレームワーク symfony というかいわゆるライブラリ郡 これも利用者多い Ethna 大規模向け.かっちりしてる. 僕メンテナー rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 大本命の超変態フレームワーク すごい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
  72. 72. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. ちょろっと Cake3 が別フレームワークにfork つかいたい Zend Framework 世界的にシェアNo1? 俺は 書く量の減らないドMフレームワーク つかわない symfony というかいわゆるライブラリ郡 これも利用者多い かっちり Ethna 大規模向け.かっちりしてる. つくりたい 僕メンテナー どんどん rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 使えば良い 大本命の超変態フレームワーク すごい つかいたい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
  73. 73. まだモダンには程遠いんですけど たぶん時間がないので割愛させていただ く内容: 無名関数 $h = function() { ... }; Phar その他
  74. 74. PHPをとりまく環境 しっといて損はない
  75. 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. 76. phpman PHP コマンドラインで使えるPHPリファレンス http://openpear.org/package/phpman 拙作 % pear install openpear/phpman % pera run-scripts openpear/phpman % phpman fopen
  77. 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) ...
  78. 78. 数々の変態パッチ moriyoshi 氏による http://d.hatena.ne.jp/moriyoshi/20090905/125217 7259 echo new DateTime()->format(); Boost.PHP http://d.hatena.ne.jp/moriyoshi/20080323/12062963 85 Goっぽい魔改造 http://d.hatena.ne.jp/moriyoshi/20091114/12582041 28 [$ch] <- $i++;
  79. 79. PHP界に降臨する3人の神(多神教) masaki fujimoto mbstring 元祖神 moriyoshi koizumi グリーとEthna の親 変態神(PHPに限らず) なんでもできる人 masahiro takagi もうなんなの ドキュメント神 PHP 以外にもいろいろ(表彰されたし) 超速翻訳
  80. 80. コミュニティ PHP PHPユーザ会 毎月のPHP勉強会 http://events.php.gr.jp/ 年一度 PHP 勉強会 その他各フレームワーク・CMSでコミュ ニティが乱立 最近は CakePHP がデカい (勉強会/カンファレ ンスなど) cf. http://twitter.com/sotarok/phper
  81. 81. TIPS 優れたPHPerになるための三大条件 受け入れる 名前空間区切りが ¥ → いつのまにか可愛く見えてきた 求めない 「なんで三項演算の結合が ...」 → きっとだれかがそうしたかったのさ 楽しむ 「またひげのおじさんがなにか言ってるよw」
  82. 82. ご静聴ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×