あらためてPHP5.3

12,079 views

Published on

第2回関西PHP勉強会

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total views
12,079
On SlideShare
0
From Embeds
0
Number of Embeds
6,852
Actions
Shares
0
Downloads
0
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • あらためてPHP5.3

    1. 1. あらためてPHP5.3 2011/11/24 kphpug @shin1x1
    2. 2. • 新原 雅司(しんばら まさし) @shin1x1• 1 1株式会社• Shin x bloghttp://www.1x1.jp/blog/• PHP / 勉強会 / MotoGP / PCX
    3. 3. Agenda1. PHP5.3について2. PHP5.3の新機能- namespace- クロージャ- LSB3. まとめ
    4. 4. PHP5.3について
    5. 5. PHP5.3• 2009/06リリース• PHP5.2から大きな機能追加 (PHP6からのバックポート)• RHEL6 / CentOS6 標準RPM• 5.3フレームワーク充実
    6. 6. PHP5.3未満のソース<?phprequire_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); }}
    7. 7. PHP5.3のソース<?phpnamespace 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); }); }}
    8. 8. PHP5.3のソース<?phpnamespace appcontroller; namespaceuse 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); }); }}
    9. 9. PHP5.3のソース<?phpnamespace appcontroller; namespaceuse 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); }); }}
    10. 10. PHP5.3のソース<?phpnamespace appcontroller; namespaceuse 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); クロージャ }); }}
    11. 11. PHP5.3の新機能
    12. 12. namespace• 名前空間• クラス名や関数名をパッケージ化• 名前の衝突を防ぐ
    13. 13. PHP5.3未満namespace• グローバル空間のみ Log Log グローバル空間
    14. 14. PHP5.3未満namespace• グローバル空間のみ 名前が競合 Log Log グローバル空間
    15. 15. 5.3以降namespace• グローバル空間+namespace Log Log Log 名前空間A 名前空間B グローバル空間
    16. 16. 5.3以降namespace• グローバル空間+namespace 同じ名前を共存 Log Log Log 名前空間A 名前空間B グローバル空間
    17. 17. namespaceの定義namespace• namespace文で定義• バックスラッシュで階層化• namespaceは定義したファイル(だけ)に影響• クラス、インターフェイス、関数、定数(const)
    18. 18. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib;interface IBar {}class Foo {}function func() {}const VALUE = 1;
    19. 19. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib; namespace宣言interface IBar {}class Foo {}function func() {}const VALUE = 1;
    20. 20. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib; namespace宣言interface IBar {} OneByOnelibIBarclass Foo {}function func() {}const VALUE = 1;
    21. 21. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib; namespace宣言interface IBar {} OneByOnelibIBarclass Foo { OneByOnelibFoo}function func() {}const VALUE = 1;
    22. 22. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib; namespace宣言interface IBar {} OneByOnelibIBarclass Foo { OneByOnelibFoo}function func() { OneByOnelibfunc()}const VALUE = 1;
    23. 23. namespaceの定義 namespace• lib.php<?phpnamespace OneByOnelib; namespace宣言interface IBar {} OneByOnelibIBarclass Foo { OneByOnelibFoo}function func() { OneByOnelibfunc()}const VALUE = 1; OneByOnelibVALUE
    24. 24. namespaceの利用namespace• 同じ名前空間ならクラス名のみ => Foo• 別の名前空間なら名前空間を指定 => OneByOnelibFoo• use 文で名前空間のインポート、エイリアス
    25. 25. namespaceの利用 namespace<?phpnamespace 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();
    26. 26. namespaceの利用 namespace<?phpnamespace 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();
    27. 27. namespaceの利用 namespace<?phpnamespace 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();
    28. 28. 教えて!namespace1namespace 組み込みクラス 呼び出しでエラー
    29. 29. 組み込みクラスnamespace<?phpnamespace OneByOnelib;$obj = new stdclass();
    30. 30. 組み込みクラスnamespace<?phpnamespace OneByOnelib;$obj = new stdclass(); Class OneByOnelibstdclass not found
    31. 31. 組み込みクラスnamespace<?phpnamespace OneByOnelib;$obj = new stdclass();
    32. 32. 組み込みクラスnamespace<?phpnamespace OneByOnelib;$obj = new stdclass(); 組み込みクラスは先頭にバックスラッシュを
    33. 33. 教えて!namespace1namespace 組み込み関数や定数は 動くよ!
    34. 34. 組み込み関数,定数namespace<?phpnamespace OneByOnelib;echo strlen("abc");error_reporting(E_ALL); バックスラッシュ無しでエラーにならない!
    35. 35. 名前解決 - 先頭にが無い時namespace• クラス名、インターフェイス名 1. 指定された名前空間で探す• 関数、定数 1. 指定された名前空間で探す 2. 無ければグローバル空間で探す
    36. 36. 教えて!namespace2namespace 名前空間を指定した時、 先頭にバックスラッシュを 付ける?付けない?
    37. 37. 先頭のバックスラッシュ namespace<?phpnamespace 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();
    38. 38. 先頭のバックスラッシュ namespace<?phpnamespace 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();
    39. 39. 教えて!namespace3namespace クラス名と同名の コンストラクタが動かない
    40. 40. 旧コンストラクタnamespace<?phpnamespace OneByOnelib;class Foo { public function Foo() { var_dump(__METHOD__); }}$foo = new Foo(); コンストラクタが呼ばれない
    41. 41. コンストラクタnamespace<?phpnamespace OneByOnelib;class Foo { public function __construct() { var_dump(__METHOD__); }}$foo = new Foo(); コンストラクタが呼ばれる
    42. 42. 旧コンストラクタnamespace• namespaceを定義するとクラス同名コンストラ クタは呼ばれない• コンストラクタは__construct()にする
    43. 43. 教えて!namespace4namespace 名前空間の名前を どう付ける?
    44. 44. PSR-0namespace PSR-0https://github.com/php-fig/fig-standards/blob/master/ accepted/PSR-0.md
    45. 45. PSR-0namespace• 名前空間、PHPファイル名のルール• 著名なフレームワーク開発者などが制定• 著名なフレームワークが対応• これから名前空間を付けるなら PSR-0 で
    46. 46. PSR-0namespace• Vendor_NamePathClass.php• トップレベルはベンダー名• セカンドレベル以降は、PHPファイルへのディレク トリ• ファイル名は「クラス名.php」
    47. 47. PSR-0namespace• DoctrineCommonIsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/ IsolatedClassLoader.php• SymfonyCoreRequest => /path/to/project/lib/vendor/Symfony/Core/ Request.php
    48. 48. namespaceの特徴namespace• 名前の衝突を防ぐ• 5.3フレームワークでは必須なので、 最低限使い方は押さえておく• autoload
    49. 49. クロージャ• 無名関数、ラムダ関数• オンザフライで関数定義• create_functionを書きやすく
    50. 50. 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));
    51. 51. useで値をカプセル化 クロージャ• use で値をカプセル化<?phpclass 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));
    52. 52. __invoke() クロージャ<?phpclass Foo { public function __invoke() { echo Hello, Foo.PHP_EOL; }}$foo = new Foo();$foo();
    53. 53. __invoke() クロージャ<?phpclass Foo { public function __invoke() { echo Hello, Foo.PHP_EOL; }}$foo = new Foo();$foo(); Foo#__invoke()が実行される
    54. 54. メソッド内でコード共有 クロージャ<?phpclass Foo { public function something() { /* 似たような処理 */ /* 似たような処理 似たような処理をまとめる */ }}
    55. 55. メソッド内でコード共有 クロージャ<?phpclass Foo { public function something() { $this->共通処理(); $this->共通処理(); } protected function 共通処理() { 別メソッドに切り出す /* 似たような処理 */ }}
    56. 56. メソッド内でコード共有 クロージャ<?phpclass Foo { public function something() { $func = function() { /* 似たような処理 */ }; クロージャにまとめる $func(); $func(); }}
    57. 57. クロージャの特徴クロージャ• array_filter()等のコールバック関数を 簡潔に書ける• useでクロージャ内に値をカプセル化• 手軽にメソッド内でコード共有
    58. 58. LSB• Late Static Bindings• 遅延静的束縛• 参照するクラス定数、クラスメソッドを 実行時に決定
    59. 59. 継承クラスのクラス定数 LSB<?phpclass 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());
    60. 60. 継承クラスのクラス定数 LSB<?phpclass 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());
    61. 61. 継承クラスのクラス定数 LSB<?phpclass 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());
    62. 62. 継承クラスのクラス定数 LSB<?phpclass 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"
    63. 63. 継承クラスのクラスメソッド LSB<?phpclass 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();
    64. 64. 継承クラスのクラスメソッド LSB<?phpclass 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();
    65. 65. 継承クラスのクラスメソッド LSB<?phpclass 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();
    66. 66. 継承クラスのクラスメソッド LSB<?phpclass 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();
    67. 67. LSBの特徴LSB• static:: で、対象クラスのクラス定数、 クラス変数、クラスメソッドを参照• インスタンス化せずにクラスを利用する 用途が広がる
    68. 68. その他• __DIR__ / __NAMESPACE__• ?:• Nowdoc• goto• Phar• Reflection(Method¦Property)::setAccessible() and more...
    69. 69. その他 PHPマニュアル見なさい
    70. 70. まとめ
    71. 71. まとめ• PHP5.3がいよいよ本番• 新機能を活用しよう• 5.3フレームワークを触って学ぶ => Silex
    72. 72. 参照• 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/
    73. 73. @shin1x1

    ×