SlideShare a Scribd company logo
あらためてPHP5.3

  2011/11/24 kphpug
      @shin1x1
• 新原 雅司(しんばら まさし)
 @shin1x1

• 1 1株式会社
• Shin x bloghttp://www.1x1.jp/blog/



• PHP / 勉強会 / MotoGP / PCX
Agenda

1. PHP5.3について

2. PHP5.3の新機能

- namespace
- クロージャ
- LSB
3. まとめ
PHP5.3について
PHP5.3

• 2009/06リリース

• PHP5.2から大きな機能追加
 (PHP6からのバックポート)

• RHEL6 / CentOS6 標準RPM

• 5.3フレームワーク充実
PHP5.3未満のソース
<?php
require_once 'OneByOnelibLog.php';
require_once 'OneByOnelibBasicController.php';

define('T_USER', 't_user');

class UserController extends BasicController {
  public function UserController() {
    $values = range(1, 50);

        array_filter($values, array('UserController', 'match'));
    }

    public static function match($value) {
      return ($value % 5 == 0);
    }
}
PHP5.3のソース

<?php
namespace appcontroller;

use OneByOnelibLog;

const T_USER = 't_user';

class UserController extends OneByOnelibBasicController {
  public function __construct() {
    $values = range(1, 50);

        array_filter($values, function($value) {
          return ($value % 5 == 0);
        });
    }
}
PHP5.3のソース

<?php
namespace appcontroller;               namespace
use OneByOnelibLog;

const T_USER = 't_user';

class UserController extends OneByOnelibBasicController {
  public function __construct() {
    $values = range(1, 50);

        array_filter($values, function($value) {
          return ($value % 5 == 0);
        });
    }
}
PHP5.3のソース

<?php
namespace appcontroller;               namespace
use OneByOnelibLog;

const T_USER = 't_user';             定数
class UserController extends OneByOnelibBasicController {
  public function __construct() {
    $values = range(1, 50);

        array_filter($values, function($value) {
          return ($value % 5 == 0);
        });
    }
}
PHP5.3のソース

<?php
namespace appcontroller;               namespace
use OneByOnelibLog;

const T_USER = 't_user';             定数
class UserController extends OneByOnelibBasicController {
  public function __construct() {
    $values = range(1, 50);

        array_filter($values, function($value) {
          return ($value % 5 == 0);                クロージャ
        });
    }
}
PHP5.3の新機能
namespace


• 名前空間

• クラス名や関数名をパッケージ化

• 名前の衝突を防ぐ
PHP5.3未満
namespace

• グローバル空間のみ



     Log              Log



            グローバル空間
PHP5.3未満
namespace

• グローバル空間のみ

            名前が競合

     Log              Log



            グローバル空間
5.3以降
namespace

• グローバル空間+namespace



      Log
      Log              Log

    名前空間A             名前空間B
            グローバル空間
5.3以降
namespace

• グローバル空間+namespace
            同じ名前を共存

      Log
      Log              Log

    名前空間A             名前空間B
            グローバル空間
namespaceの定義
namespace



• namespace文で定義

• バックスラッシュで階層化

• namespaceは定義したファイル(だけ)に影響

• クラス、インターフェイス、関数、定数(const)
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;

interface IBar {
}

class Foo {
}

function func() {
}

const VALUE = 1;
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;   namespace宣言
interface IBar {
}

class Foo {
}

function func() {
}

const VALUE = 1;
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;   namespace宣言
interface IBar {
}
                          OneByOnelibIBar
class Foo {
}

function func() {
}

const VALUE = 1;
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;   namespace宣言
interface IBar {
}
                          OneByOnelibIBar
class Foo {               OneByOnelibFoo
}

function func() {
}

const VALUE = 1;
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;    namespace宣言
interface IBar {
}
                          OneByOnelibIBar
class Foo {                OneByOnelibFoo
}

function func() {         OneByOnelibfunc()
}

const VALUE = 1;
namespaceの定義
 namespace

• lib.php
<?php
namespace OneByOnelib;    namespace宣言
interface IBar {
}
                           OneByOnelibIBar
class Foo {                OneByOnelibFoo
}

function func() {         OneByOnelibfunc()
}

const VALUE = 1;          OneByOnelibVALUE
namespaceの利用
namespace


• 同じ名前空間ならクラス名のみ
 => Foo

• 別の名前空間なら名前空間を指定
 => OneByOnelibFoo

• use 文で名前空間のインポート、エイリアス
namespaceの利用
 namespace

<?php
namespace OneByOnemain;

require 'lib.php';

use OneByOnelibFoo;              useでインポート、エイリアス
use OneByOnelibFoo as libFoo;

class Bar {
}

$bar = new Bar();
$foo1 = new OneByOnelibFoo();
$foo2 = new Foo();
$foo3 = new libFoo();
namespaceの利用
 namespace

<?php
namespace OneByOnemain;

require 'lib.php';

use OneByOnelibFoo;              useでインポート、エイリアス
use OneByOnelibFoo as libFoo;

class Bar {
}
                                    OneByOnemainBar
$bar = new Bar();
$foo1 = new OneByOnelibFoo();
$foo2 = new Foo();
$foo3 = new libFoo();
namespaceの利用
 namespace

<?php
namespace OneByOnemain;

require 'lib.php';

use OneByOnelibFoo;              useでインポート、エイリアス
use OneByOnelibFoo as libFoo;

class Bar {
}
                                    OneByOnemainBar
$bar = new Bar();
$foo1 = new OneByOnelibFoo();
$foo2 = new Foo();
                                     OneByOnelibFoo
$foo3 = new libFoo();
教えて!namespace1
namespace




            組み込みクラス

       呼び出しでエラー
組み込みクラス
namespace


<?php
namespace OneByOnelib;

$obj = new stdclass();
組み込みクラス
namespace


<?php
namespace OneByOnelib;

$obj = new stdclass();




 Class 'OneByOnelibstdclass' not found
組み込みクラス
namespace


<?php
namespace OneByOnelib;

$obj = new stdclass();
組み込みクラス
namespace


<?php
namespace OneByOnelib;

$obj = new stdclass();




 組み込みクラスは先頭にバックスラッシュを
教えて!namespace1
namespace




    組み込み関数や定数は

            動くよ!
組み込み関数,定数
namespace


<?php
namespace OneByOnelib;

echo strlen("abc");
error_reporting(E_ALL);



 バックスラッシュ無しでエラーにならない!
名前解決 - 先頭にが無い時
namespace



• クラス名、インターフェイス名
 1. 指定された名前空間で探す

• 関数、定数
 1. 指定された名前空間で探す

 2. 無ければグローバル空間で探す
教えて!namespace2
namespace




   名前空間を指定した時、

  先頭にバックスラッシュを

      付ける?付けない?
先頭のバックスラッシュ
 namespace
<?php
namespace OneByOnemain;
                                   付けてない
use OneByOnelibFoo;
use OneByOnelibFoo as libFoo;

require 'namespace.php';

class Bar {
}

$bar = new Bar();
$foo1 = new OneByOnelibFoo();   付けてる
$foo2 = new Foo();
$foo3 = new libFoo();

$class = 'OneByOnelibFoo';       付けてない
$foo4 = new $class();
先頭のバックスラッシュ
 namespace
<?php
namespace OneByOnemain;               付けない

use OneByOnelibFoo;
use OneByOnelibFoo as libFoo;    どちらでも良いが、付けない

require 'namespace.php';

class Bar {
}

$bar = new Bar();
$foo1 = new OneByOnelibFoo();        付ける
$foo2 = new Foo();
$foo3 = new libFoo();

$class = 'OneByOnelibFoo';       どちらでも良いが、付けない
$foo4 = new $class();
教えて!namespace3
namespace




       クラス名と同名の

  コンストラクタが動かない
旧コンストラクタ
namespace

<?php
namespace OneByOnelib;

class Foo {
  public function Foo() {
    var_dump(__METHOD__);
  }
}

$foo = new Foo();           コンストラクタが呼ばれない
コンストラクタ
namespace

<?php
namespace OneByOnelib;

class Foo {
  public function __construct() {
    var_dump(__METHOD__);
  }
}

$foo = new Foo();          コンストラクタが呼ばれる
旧コンストラクタ
namespace




• namespaceを定義するとクラス同名コンストラ
  クタは呼ばれない

• コンストラクタは__construct()にする
教えて!namespace4
namespace




       名前空間の名前を

            どう付ける?
PSR-0
namespace




               PSR-0

https://github.com/php-fig/fig-standards/blob/master/
                 accepted/PSR-0.md
PSR-0
namespace



• 名前空間、PHPファイル名のルール

• 著名なフレームワーク開発者などが制定

• 著名なフレームワークが対応

• これから名前空間を付けるなら PSR-0 で
PSR-0
namespace


• Vendor_NamePathClass.php

• トップレベルはベンダー名

• セカンドレベル以降は、PHPファイルへのディレク
  トリ

• ファイル名は「クラス名.php」
PSR-0
namespace



• DoctrineCommonIsolatedClassLoader
  => /path/to/project/lib/vendor/Doctrine/Common/
  IsolatedClassLoader.php

• SymfonyCoreRequest
  => /path/to/project/lib/vendor/Symfony/Core/
  Request.php
namespaceの特徴
namespace




• 名前の衝突を防ぐ

• 5.3フレームワークでは必須なので、
   最低限使い方は押さえておく

• autoload
クロージャ


• 無名関数、ラムダ関数

• オンザフライで関数定義

• create_functionを書きやすく
create_functionとの比較
 クロージャ

• create_function
<?php
$func = create_function('$a, $b', 'return $a + $b;');
var_dump($func(1, 2));




• Closure
<?php
$func = function($a, $b) {
   return $a + $b;
};                                             付ける
var_dump($func(1, 2));
useで値をカプセル化
 クロージャ

• use で値をカプセル化
<?php
class Foo {
  public static function createMulti($v) {
    return function($a) use ($v) {
       return $a * $v;
    };
  }
}

$func1 = Foo::createMulti(1);
$func2 = Foo::createMulti(2);        createMultiの引数で掛け算

var_dump($func1(10));
var_dump($func2(10));
__invoke()
 クロージャ



<?php
class Foo {
  public function __invoke() {
    echo 'Hello, Foo'.PHP_EOL;
  }
}

$foo = new Foo();
$foo();
__invoke()
 クロージャ



<?php
class Foo {
  public function __invoke() {
    echo 'Hello, Foo'.PHP_EOL;
  }
}

$foo = new Foo();
$foo();              Foo#__invoke()が実行される
メソッド内でコード共有
    クロージャ


<?php
class Foo {
  public function something() {
    /*
      似たような処理
        */

        /*
         似たような処理                  似たような処理をまとめる
        */
    }
}
メソッド内でコード共有
    クロージャ


<?php
class Foo {
  public function something() {
    $this->共通処理();

        $this->共通処理();
    }

    protected function 共通処理() {
                                  別メソッドに切り出す
        /*
         似たような処理
        */
    }
}
メソッド内でコード共有
    クロージャ


<?php
class Foo {
  public function something() {
    $func = function() {
      /*
       似たような処理
             */
        };
                                  クロージャにまとめる
        $func();

        $func();
    }
}
クロージャの特徴
クロージャ




• array_filter()等のコールバック関数を
  簡潔に書ける

• useでクロージャ内に値をカプセル化

• 手軽にメソッド内でコード共有
LSB


• Late Static Bindings

• 遅延静的束縛

• 参照するクラス定数、クラスメソッドを
  実行時に決定
継承クラスのクラス定数
    LSB


<?php
class Foo {
  const TABLE_NAME = 'Foo';

    public static function something() {
      return self::TABLE_NAME;
    }
}

class Bar extends Foo {
  const TABLE_NAME = 'Bar';
}

var_dump(Bar::something());
継承クラスのクラス定数
    LSB


<?php
class Foo {
  const TABLE_NAME = 'Foo';

    public static function something() {
      return self::TABLE_NAME;
    }
}

class Bar extends Foo {
  const TABLE_NAME = 'Bar';
}
                                           "Bar" ではなく"Foo"
var_dump(Bar::something());
継承クラスのクラス定数
    LSB


<?php
class Foo {
  const TABLE_NAME = 'Foo';

    public static function something() {
      return static::TABLE_NAME;
                                        「self」を「static」に
    }
}

class Bar extends Foo {
  const TABLE_NAME = 'Bar';
}

var_dump(Bar::something());
継承クラスのクラス定数
    LSB


<?php
class Foo {
  const TABLE_NAME = 'Foo';

    public static function something() {
      return static::TABLE_NAME;
                                        「self」を「static」に
    }
}

class Bar extends Foo {
  const TABLE_NAME = 'Bar';
}

var_dump(Bar::something());                  "Bar"
継承クラスのクラスメソッド
    LSB
<?php
class Foo {
  public static function something() {
    echo "Hello,".self::hello();
  }

    protected static function hello() {
      return "Foo!";
    }
}

class Bar extends Foo {
  protected static function hello() {
    return "Bar!";
  }
}

Bar::something();
継承クラスのクラスメソッド
    LSB
<?php
class Foo {
  public static function something() {
    echo "Hello,".self::hello();
  }

    protected static function hello() {
      return "Foo!";
    }
}

class Bar extends Foo {
  protected static function hello() {
    return "Bar!";
  }
}
                                          "Hello, Foo"
Bar::something();
継承クラスのクラスメソッド
    LSB
<?php
class Foo {
  public static function something() {
    echo "Hello,".static::hello();        「self」を「static」に
  }

    protected static function hello() {
      return "Foo!";
    }
}

class Bar extends Foo {
  protected static function hello() {
    return "Bar!";
  }
}

Bar::something();
継承クラスのクラスメソッド
    LSB
<?php
class Foo {
  public static function something() {
    echo "Hello,".static::hello();        「self」を「static」に
  }

    protected static function hello() {
      return "Foo!";
    }
}

class Bar extends Foo {
  protected static function hello() {
    return "Bar!";
  }
}
                                           "Hello, Bar"
Bar::something();
LSBの特徴
LSB




• static:: で、対象クラスのクラス定数、
      クラス変数、クラスメソッドを参照

• インスタンス化せずにクラスを利用する
      用途が広がる
その他
•   __DIR__ / __NAMESPACE__


•   ?:


•   Nowdoc


•   goto


•   Phar


•   Reflection(Method¦Property)::setAccessible()



    and more...
その他




 PHPマニュアル見なさい
まとめ
まとめ


• PHP5.3がいよいよ本番

• 新機能を活用しよう

• 5.3フレームワークを触って学ぶ
 => Silex
参照

• PHPマニュアル
  「PHP5.2.x から PHP5.3.x への移行」
  http://jp2.php.net/manual/ja/migration53.php


• PSR-0
  https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md


• IBM developerWorks
  http://www.ibm.com/developerworks/jp/opensource/library/os-php-5.3new3/

  http://www.ibm.com/developerworks/jp/opensource/library/os-php-lambda/
@shin1x1

More Related Content

PDF
omoon.org の裏側 〜FuelPHP の task 活用例〜
PDF
15分でCakePHPを始める方法(Nseg 2013-11-09 )
PDF
Fuel php osc tokyo2012
PDF
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
PDF
FuelPHPで3種のprofilerを使ってみた
PDF
10分でわかるFuelPHP @ 2011/12
KEY
フラットなPHPからフレームワークへ
PDF
はじめての FuelPHP
omoon.org の裏側 〜FuelPHP の task 活用例〜
15分でCakePHPを始める方法(Nseg 2013-11-09 )
Fuel php osc tokyo2012
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
FuelPHPで3種のprofilerを使ってみた
10分でわかるFuelPHP @ 2011/12
フラットなPHPからフレームワークへ
はじめての FuelPHP

What's hot (18)

KEY
Mojoliciousをウェブ制作現場で使ってみてる
PDF
CodeIgniter入門
PPTX
実用裏方 Perl 入門
PPTX
CMSとPerlで遊ぼう
PDF
Everyday Life with clojure.spec
PDF
実"戦"CakePHP Plugin
PDF
PDF
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス)
PDF
PHPの今とこれから2021
PPT
CPANの依存モジュールをもう少し正しく検出したい
PPTX
Php5 4勉強会
PDF
PHP勉強会 #51
PDF
Using Dancer
PDF
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
PDF
Modern PHP Programming @ PFI Seminar
KEY
Perlで伝統芸能
PDF
WebAPIではじめるphp入門
Mojoliciousをウェブ制作現場で使ってみてる
CodeIgniter入門
実用裏方 Perl 入門
CMSとPerlで遊ぼう
Everyday Life with clojure.spec
実"戦"CakePHP Plugin
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
最新PHP事情 (2000年7月22日,PHPカンファレンス)
PHPの今とこれから2021
CPANの依存モジュールをもう少し正しく検出したい
Php5 4勉強会
PHP勉強会 #51
Using Dancer
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
Modern PHP Programming @ PFI Seminar
Perlで伝統芸能
WebAPIではじめるphp入門
Ad

Similar to あらためてPHP5.3 (20)

PDF
名前空間.php @Nagoya.php 2013.01.19
PPTX
PHPのnamespace・useについて
PDF
5分で分かる名前空間とオートロード
PPTX
PHP基礎勉強会
PPTX
php-src の歩き方
PDF
PHPの今とこれから2023
PDF
PHPの今とこれから 2013
PDF
PHPの今とこれから2019
PDF
PHPの今とこれから2014
PPTX
PSR-1 と PSR-2 を 5分でざっくり理解する
PDF
新標準PSRに学ぶきれいなPHP
PPTX
Php in ruby
PDF
徹底攻略!PHP5.4
PDF
SPL fukuokaphp_1
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024
PDF
いまどきのPHP
PDF
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PPTX
PHP AST 徹底解説
PDF
Best practice laravel
名前空間.php @Nagoya.php 2013.01.19
PHPのnamespace・useについて
5分で分かる名前空間とオートロード
PHP基礎勉強会
php-src の歩き方
PHPの今とこれから2023
PHPの今とこれから 2013
PHPの今とこれから2019
PHPの今とこれから2014
PSR-1 と PSR-2 を 5分でざっくり理解する
新標準PSRに学ぶきれいなPHP
Php in ruby
徹底攻略!PHP5.4
SPL fukuokaphp_1
PHPの今とこれから2024 at PHP Conference Japan 2024
いまどきのPHP
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP AST 徹底解説
Best practice laravel
Ad

More from Masashi Shinbara (20)

PDF
日本語消えたスライド
PDF
Twilio入門 -Web アプリ編-
PDF
いまどきのPHP開発現場 -2015年秋-
PDF
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
PDF
先取り!PHP 7 と WordPress
PDF
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
PDF
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
PDF
How to learn Laravel5 application from Authentication
PDF
認証機能で学ぶ Laravel 5 アプリケーション
PDF
Azure Websites で作るスケーラブルな PHP アプリケーション
PDF
わかってるフレームワーク Laravel
PDF
ビルドサーバで使うDocker
PDF
Ansible ではじめるサーバ作業の自動化
PDF
開発現場で活用するVagrant
PDF
PHPコードではなく PHPコードの「書き方」を知る
PDF
Heroku で作る
スケーラブルな 
PHP アプリケーション
PDF
Vagrant体験入門
PDF
VagrantユーザのためのDocker入門
PDF
Laravel ユーザなら知っておくべきAuthオートログイン
PDF
キャラ立ちしたエンジニアになる!
日本語消えたスライド
Twilio入門 -Web アプリ編-
いまどきのPHP開発現場 -2015年秋-
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
先取り!PHP 7 と WordPress
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
How to learn Laravel5 application from Authentication
認証機能で学ぶ Laravel 5 アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーション
わかってるフレームワーク Laravel
ビルドサーバで使うDocker
Ansible ではじめるサーバ作業の自動化
開発現場で活用するVagrant
PHPコードではなく PHPコードの「書き方」を知る
Heroku で作る
スケーラブルな 
PHP アプリケーション
Vagrant体験入門
VagrantユーザのためのDocker入門
Laravel ユーザなら知っておくべきAuthオートログイン
キャラ立ちしたエンジニアになる!

あらためてPHP5.3

Editor's Notes