SlideShare a Scribd company logo
2013/09/28 shin1x1
関西PHP勉強会 in 京セラドーム
いまどきのPHP
昔のPHP
(c) 2013 Masashi Shinbara @shin1x1
• HTMLとPHPの混在
• <body>タグの中にロジック
• どこからでもDB接続
• 重複しまくりコード
• とびかうグローバル変数....
昔のPHP
(c) 2013 Masashi Shinbara @shin1x1
HTMLとPHPが
混在したコード
Agenda
(c) 2013 Masashi Shinbara @shin1x1
• オブジェクト指向機能
• オブジェクト指向の活用
• 最近のトピック
(c) 2013 Masashi Shinbara @shin1x1
オブジェクト指向機能
オブジェクト指向言語
(c) 2013 Masashi Shinbara @shin1x1
• 隠蔽(カプセル化)
• 継承(インヘリタンス)
• 多態性(ポリモフィズム)
隠蔽(カプセル化)
(c) 2013 Masashi Shinbara @shin1x1
• アクセス修飾子
<?php
class Foo
{
public $public = 'public';
protected $protected = 'protected';
private $private = 'private';
}
public どこからでもアクセス可能
protected 定義したクラス、継承したクラス
private 定義したクラスのみ
隠蔽(カプセル化)
(c) 2013 Masashi Shinbara @shin1x1
<?php
class Foo
{
public function public_method()
{
// どこからでも実行可
}
protected function protected_method()
{
// Fooクラスとその継承クラス
}
private function private_method()
{
// Fooクラスのみ
}
}
継承
(c) 2013 Masashi Shinbara @shin1x1
<?php
class Foo
{
public function hello()
{
echo 'Foo'.PHP_EOL;
}
}
class FooChild extends Foo
{
public function hello()
{
echo 'FooChild'.PHP_EOL;
}
}
$obj = new FooChild();
$obj->hello(); // FooChild
• 単一継承のみ
継承
多態性(ポリモフィズム)
(c) 2013 Masashi Shinbara @shin1x1
<?php
interface Printable
{
public function output();
}
class Foo implements Printable
{
public function output()
{
echo 'Foo';
}
}
class Bar implements Printable
{
public function output()
{
echo 'Bar';
}
}
多態性(ポリモフィズム)
(c) 2013 Masashi Shinbara @shin1x1
<?php
class SomeObject
{
public function execute(Printable $obj)
{
$obj->output();
}
}
$obj = new SomeObject();
$obj->execute(new Foo()); // Foo
$obj->execute(new Bar()); // Bar
Printable なら ok
クラスメソッド、定数、変数
(c) 2013 Masashi Shinbara @shin1x1
<?php
class Foo
{
const CLASS_CONSTATNS = 'aws'; // クラス定数
static public $classValue = 'abc'; // クラス変数
static public function classMethod()
{
// クラスメソッド
}
}
echo FOO::CLASS_CONSTATNS; // aws
echo Foo::$classValue; // abc
Foo::classMethod();
コンストラクタ、デストラクタ
(c) 2013 Masashi Shinbara @shin1x1
<?php
class Foo
{
protected $name = null;
public function __construct($name)
{
$this->name = $name;
echo '__construct'.PHP_EOL;
}
public function __destruct()
{
echo '__destruct'.PHP_EOL;
}
}
$obj = new Foo('Jun'); // __construct
// __destruct
コンストラクタ
デストラクタ
抽象クラス、メソッド
(c) 2013 Masashi Shinbara @shin1x1
<?php
abstract class AbstractFoo {
public function something()
{
$this->hello();
}
abstract protected function hello();
}
class Foo extends AbstractFoo
{
protected function hello()
{
echo 'Foo';
}
}
$obj = new Foo();
$obj->something(); // Foo
抽象クラス
(インスタンス化不可)
具象クラス
final
(c) 2013 Masashi Shinbara @shin1x1
<?php
final class NoInheritance
{
}
class Foo
{
final public function noInheritanceMethod()
{
//
}
}
継承できない
オーバーライドできない
インターフェイス
(c) 2013 Masashi Shinbara @shin1x1
<?php
interface Printable
{
public function printValue($value);
}
interface Writable
{
public function writeValue($value);
}
class Foo implements Printable, Writable
{
public function printValue($value)
{
//
}
public function writeValue($value)
{
//
}
}
複数実装可
タイプヒンティング
(c) 2013 Masashi Shinbara @shin1x1
<?php
interface Printable {}
interface Writable {}
class Foo
{
public function bar(Printable $printer, Writable $writer)
{
//
}
public function something(array $array)
{
//
}
}
タイプヒンティング
タイプヒンティング
タイプヒンティング
名前空間
(c) 2013 Masashi Shinbara @shin1x1
<?php
namespace Vendorlib;
use AwsS3S3Client;
class Foo
{
public function method()
{
throw new Exception();
}
}
名前空間の宣言
名前空間のインポート
グローバル
VendorlibFoo
トレイト
(c) 2013 Masashi Shinbara @shin1x1
• Mixin のようなもの
• 変数やメソッドをまとめたもの
• クラスに追加して利用
• 複数個追加できる
トレイト
(c) 2013 Masashi Shinbara @shin1x1
<?php
trait Say
{
protected $name = 'Jun';
public function say()
{
echo 'Hello '.$this->name.PHP_EOL;
}
}
class Foo
{
use Say;
}
$obj = new Foo();
$obj->say();
トレイト
トレイトの利用
PHPのオブジェクト指向機能
(c) 2013 Masashi Shinbara @shin1x1
詳しくは
(c) 2013 Masashi Shinbara @shin1x1
http://jp1.php.net/manual/ja/language.oop5.php
(c) 2013 Masashi Shinbara @shin1x1
オブジェクト指向
の活用
フレームワーク
(c) 2013 Masashi Shinbara @shin1x1
• フレームワークの利用
• オブジェクト指向
• MVC
• デファクトスタンダードは無い
フレームワーク
(c) 2013 Masashi Shinbara @shin1x1
• CakePHP
• Symfony
• Zend Framework
• CodeIgniter
• FuelPHP
• Laravel
• Sliex
• Phalcon
• Ethna
• Yii
• BEAR.Sunday
• Lithium
• TYPO3 FLOW
• Kohana
• Slim
• Aura for PHP
Symfony
(c) 2013 Masashi Shinbara @shin1x1
• コンポーネントで構成
• コンポーネントは独立して利用可
• 他のフレームワークやライブラリで
• 部品としての品質も高い
• Zend Frameworkも
PHPUnit
(c) 2013 Masashi Shinbara @shin1x1
http://phpunit.de/manual/3.7/ja/
PHPUnit
(c) 2013 Masashi Shinbara @shin1x1
• xUnit の PHP 実装
• テストダブルやSelenium連携など
• フレームワークやライブラリのテスト
PhpStorm
(c) 2013 Masashi Shinbara @shin1x1
http://www.jetbrains.com/phpstorm/
PhpStorm
(c) 2013 Masashi Shinbara @shin1x1
• JetBRAINS社のIDE
• 補完機能が強力
• オブジェクト指向に則れば恩恵大
• いま注目のIDE
(c) 2013 Masashi Shinbara @shin1x1
最近のトピック
PHP 5.5 リリース
(c) 2013 Masashi Shinbara @shin1x1
• 2013/06 リリース
• ジェネレータ
• OPcache
• パスワードハッシュ関数
PHP 5.3 が EOL
(c) 2013 Masashi Shinbara @shin1x1
• 5.3.27 が最後のリリース
• セキュリティフィックスのみ
• 2014/06 頃に終了
• 今後は、5.4 or 5.5 を利用
BEAR.Sunday
(c) 2013 Masashi Shinbara @shin1x1
https://code.google.com/p/bearsunday/
BEAR.Sunday
(c) 2013 Masashi Shinbara @shin1x1
• @koriym さんが開発
• リソース指向のフレームワーク
• phpnw で講演
• Litinum 作者も注目
Ginq
(c) 2013 Masashi Shinbara @shin1x1
https://github.com/akanehara/ginq
Ginq
(c) 2013 Masashi Shinbara @shin1x1
• @a.kanehara さんが開発
• LINQ to Object を PHP に
• メソッドチェインで配列操作
• 遅延実行
注目のキーワード
(c) 2013 Masashi Shinbara @shin1x1
• PhpStorm
• Composer
• PSR
• Vagrant
(c) 2013 Masashi Shinbara @shin1x1
まとめ
まとめ
(c) 2013 Masashi Shinbara @shin1x1
• PHPでオブジェクト指向開発
• PHPらしく貪欲に成長
• どう使うかはあなた次第
@shin1x1
(c) 2013 Masashi Shinbara @shin1x1

More Related Content

いまどきのPHP

  • 2. 昔のPHP (c) 2013 Masashi Shinbara @shin1x1 • HTMLとPHPの混在 • <body>タグの中にロジック • どこからでもDB接続 • 重複しまくりコード • とびかうグローバル変数....
  • 3. 昔のPHP (c) 2013 Masashi Shinbara @shin1x1 HTMLとPHPが 混在したコード
  • 4. Agenda (c) 2013 Masashi Shinbara @shin1x1 • オブジェクト指向機能 • オブジェクト指向の活用 • 最近のトピック
  • 5. (c) 2013 Masashi Shinbara @shin1x1 オブジェクト指向機能
  • 6. オブジェクト指向言語 (c) 2013 Masashi Shinbara @shin1x1 • 隠蔽(カプセル化) • 継承(インヘリタンス) • 多態性(ポリモフィズム)
  • 7. 隠蔽(カプセル化) (c) 2013 Masashi Shinbara @shin1x1 • アクセス修飾子 <?php class Foo { public $public = 'public'; protected $protected = 'protected'; private $private = 'private'; } public どこからでもアクセス可能 protected 定義したクラス、継承したクラス private 定義したクラスのみ
  • 8. 隠蔽(カプセル化) (c) 2013 Masashi Shinbara @shin1x1 <?php class Foo { public function public_method() { // どこからでも実行可 } protected function protected_method() { // Fooクラスとその継承クラス } private function private_method() { // Fooクラスのみ } }
  • 9. 継承 (c) 2013 Masashi Shinbara @shin1x1 <?php class Foo { public function hello() { echo 'Foo'.PHP_EOL; } } class FooChild extends Foo { public function hello() { echo 'FooChild'.PHP_EOL; } } $obj = new FooChild(); $obj->hello(); // FooChild • 単一継承のみ 継承
  • 10. 多態性(ポリモフィズム) (c) 2013 Masashi Shinbara @shin1x1 <?php interface Printable { public function output(); } class Foo implements Printable { public function output() { echo 'Foo'; } } class Bar implements Printable { public function output() { echo 'Bar'; } }
  • 11. 多態性(ポリモフィズム) (c) 2013 Masashi Shinbara @shin1x1 <?php class SomeObject { public function execute(Printable $obj) { $obj->output(); } } $obj = new SomeObject(); $obj->execute(new Foo()); // Foo $obj->execute(new Bar()); // Bar Printable なら ok
  • 12. クラスメソッド、定数、変数 (c) 2013 Masashi Shinbara @shin1x1 <?php class Foo { const CLASS_CONSTATNS = 'aws'; // クラス定数 static public $classValue = 'abc'; // クラス変数 static public function classMethod() { // クラスメソッド } } echo FOO::CLASS_CONSTATNS; // aws echo Foo::$classValue; // abc Foo::classMethod();
  • 13. コンストラクタ、デストラクタ (c) 2013 Masashi Shinbara @shin1x1 <?php class Foo { protected $name = null; public function __construct($name) { $this->name = $name; echo '__construct'.PHP_EOL; } public function __destruct() { echo '__destruct'.PHP_EOL; } } $obj = new Foo('Jun'); // __construct // __destruct コンストラクタ デストラクタ
  • 14. 抽象クラス、メソッド (c) 2013 Masashi Shinbara @shin1x1 <?php abstract class AbstractFoo { public function something() { $this->hello(); } abstract protected function hello(); } class Foo extends AbstractFoo { protected function hello() { echo 'Foo'; } } $obj = new Foo(); $obj->something(); // Foo 抽象クラス (インスタンス化不可) 具象クラス
  • 15. final (c) 2013 Masashi Shinbara @shin1x1 <?php final class NoInheritance { } class Foo { final public function noInheritanceMethod() { // } } 継承できない オーバーライドできない
  • 16. インターフェイス (c) 2013 Masashi Shinbara @shin1x1 <?php interface Printable { public function printValue($value); } interface Writable { public function writeValue($value); } class Foo implements Printable, Writable { public function printValue($value) { // } public function writeValue($value) { // } } 複数実装可
  • 17. タイプヒンティング (c) 2013 Masashi Shinbara @shin1x1 <?php interface Printable {} interface Writable {} class Foo { public function bar(Printable $printer, Writable $writer) { // } public function something(array $array) { // } } タイプヒンティング タイプヒンティング タイプヒンティング
  • 18. 名前空間 (c) 2013 Masashi Shinbara @shin1x1 <?php namespace Vendorlib; use AwsS3S3Client; class Foo { public function method() { throw new Exception(); } } 名前空間の宣言 名前空間のインポート グローバル VendorlibFoo
  • 19. トレイト (c) 2013 Masashi Shinbara @shin1x1 • Mixin のようなもの • 変数やメソッドをまとめたもの • クラスに追加して利用 • 複数個追加できる
  • 20. トレイト (c) 2013 Masashi Shinbara @shin1x1 <?php trait Say { protected $name = 'Jun'; public function say() { echo 'Hello '.$this->name.PHP_EOL; } } class Foo { use Say; } $obj = new Foo(); $obj->say(); トレイト トレイトの利用
  • 22. 詳しくは (c) 2013 Masashi Shinbara @shin1x1 http://jp1.php.net/manual/ja/language.oop5.php
  • 23. (c) 2013 Masashi Shinbara @shin1x1 オブジェクト指向 の活用
  • 24. フレームワーク (c) 2013 Masashi Shinbara @shin1x1 • フレームワークの利用 • オブジェクト指向 • MVC • デファクトスタンダードは無い
  • 25. フレームワーク (c) 2013 Masashi Shinbara @shin1x1 • CakePHP • Symfony • Zend Framework • CodeIgniter • FuelPHP • Laravel • Sliex • Phalcon • Ethna • Yii • BEAR.Sunday • Lithium • TYPO3 FLOW • Kohana • Slim • Aura for PHP
  • 26. Symfony (c) 2013 Masashi Shinbara @shin1x1 • コンポーネントで構成 • コンポーネントは独立して利用可 • 他のフレームワークやライブラリで • 部品としての品質も高い • Zend Frameworkも
  • 27. PHPUnit (c) 2013 Masashi Shinbara @shin1x1 http://phpunit.de/manual/3.7/ja/
  • 28. PHPUnit (c) 2013 Masashi Shinbara @shin1x1 • xUnit の PHP 実装 • テストダブルやSelenium連携など • フレームワークやライブラリのテスト
  • 29. PhpStorm (c) 2013 Masashi Shinbara @shin1x1 http://www.jetbrains.com/phpstorm/
  • 30. PhpStorm (c) 2013 Masashi Shinbara @shin1x1 • JetBRAINS社のIDE • 補完機能が強力 • オブジェクト指向に則れば恩恵大 • いま注目のIDE
  • 31. (c) 2013 Masashi Shinbara @shin1x1 最近のトピック
  • 32. PHP 5.5 リリース (c) 2013 Masashi Shinbara @shin1x1 • 2013/06 リリース • ジェネレータ • OPcache • パスワードハッシュ関数
  • 33. PHP 5.3 が EOL (c) 2013 Masashi Shinbara @shin1x1 • 5.3.27 が最後のリリース • セキュリティフィックスのみ • 2014/06 頃に終了 • 今後は、5.4 or 5.5 を利用
  • 34. BEAR.Sunday (c) 2013 Masashi Shinbara @shin1x1 https://code.google.com/p/bearsunday/
  • 35. BEAR.Sunday (c) 2013 Masashi Shinbara @shin1x1 • @koriym さんが開発 • リソース指向のフレームワーク • phpnw で講演 • Litinum 作者も注目
  • 36. Ginq (c) 2013 Masashi Shinbara @shin1x1 https://github.com/akanehara/ginq
  • 37. Ginq (c) 2013 Masashi Shinbara @shin1x1 • @a.kanehara さんが開発 • LINQ to Object を PHP に • メソッドチェインで配列操作 • 遅延実行
  • 38. 注目のキーワード (c) 2013 Masashi Shinbara @shin1x1 • PhpStorm • Composer • PSR • Vagrant
  • 39. (c) 2013 Masashi Shinbara @shin1x1 まとめ
  • 40. まとめ (c) 2013 Masashi Shinbara @shin1x1 • PHPでオブジェクト指向開発 • PHPらしく貪欲に成長 • どう使うかはあなた次第
  • 41. @shin1x1 (c) 2013 Masashi Shinbara @shin1x1