More Related Content Similar to 40分濃縮 PHP classの教室 (11) More from Yusuke Ando (20) 40分濃縮 PHP classの教室3. 本日の対象者
PHPを使っている
関数はなんとなくわかる
classを理解したい
完全版はWebで
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
4. 本日のメニュー
関数を使ったPHP
オブジェクト指向の基礎
コードの拡張性を上げる
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
7. function
<?php
function hoge() {
return date( Y-m-d );
}
function fuga($w = null) {
if (is_null($w)) {
$w = date( w );
}
$list = array( 日 , 月 , 火 , 水 , 木 , 金 , 土 );
return $list[$w];
}
echo hoge(); // 2012-03-21 などと表示
echo fuga(3); // 水 と表示
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
8. functionの細かいとこ
名前の大文字小文字
スコープ
引数の順番
2重定義
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
9. 名前の大文字小文字
<?php
function hoge() {
return date('Y-m-d');
}
echo hoge(); // 2012-03-21 などと表示
echo Hoge();
echo HOGE();
echo hogE();
$a = 'hoge';
echo $a(); 全部同じ結果
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
10. スコープ
<?php
$out = '1000';
function hoge() {
$in = 'ABCD';
echo $out;
hoge()内で有効なのは
echo $etc;
} $inのみ
function fuga() {
$etc = 'XYZ';
}
hoge();
hoge(); $inが有効なのは
echo $in; hoge()内のみ
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
11. 引数の順番
<?php
function hoge($a) {
}
function fuga($a, $b =0){
}
function moge($a=null,$b=null,$c) {
}
hoge(1); //OK
fuga(1); //OK
moge(1,2,3); //OK
hoge();
fuga(); 必須の引数が指定されて
moge(1,2); いないとエラー
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
13. 練習1
関数を作ってください
引数: 名前、性別
結果:
男なら○○くん
女なら○○ちゃん
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
14. 作例1
<?php
function getLabel($name, $sex) {
if ($sex == '1') {
$suffix = 'くん';
} else {
$suffix = 'ちゃん';
}
return $name . $suffix;
}
echo getLabel('つとむ', 1); //つとむくん
echo getLabel('やよい', 2); //やよいちゃん
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
16. 作例2
<?php
function getLabel($name, $sex, $age=0) {
if ($sex == '1') {
$suffix = 'くん';
if ( $age >= 12) {
$suffix = '君';
}
} else {
$suffix = 'ちゃん';
if ( $age >= 12) {
$suffix = 'さん';
}
}
return $name . $suffix . "n";
}
echo getLabel('つとむ', 1,10); //つとむくん
echo getLabel('やよい', 2,20); //やよいさん
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
17. 練習3
練習1,2の機能は維持して
男の子なら青
女の子ならピンク
になるようにタグで囲む。
(タグなしの機能も残す)
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
18. <?php
作例3
function getLabel($name, $sex, $age=0, $coloring=false) { echo getLabel('つとむ', 1); //つとむくん
if ($sex == '1') { echo getLabel('やよい', 2); //やよいちゃん
$suffix = 'くん'; echo getLabel('つとむ', 1,10); //つとむくん
$color = 'blue'; echo getLabel('やよい', 2,8); //やよいちゃん
if ( $age >= 12) { echo getLabel('つとむ', 1,12); //つとむ君
$suffix = '君'; echo getLabel('やよい', 2,20); //やよいさん
} echo getLabel('つとむ', 1,0,true);
} else { //<span style='color:blue'>つとむくん</span>
$suffix = 'ちゃん'; echo getLabel('やよい', 2,0,true);
$color = 'pink'; //<span style='color:pink'>やよいちゃん</span>
if ( $age >= 12) {
$suffix = 'さん';
}
}
$str = "<span style='color:$color'>". $name . $suffix .
"</span>n";
if (!$coloring) {
$str = $name . $suffix . "n";
}
return $str;
}
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
20. <?php
作例4 } else if ( $age >= 18 && $age <= 21 ) {
function getLabel($name, $sex, $age=0, $coloring=false, $suffix .= "(大)";
$school=false ) { }
if ($sex == '1') { $str = "<span style='color:$color'>".
$suffix = 'くん'; $name . $suffix . "</span>n";
$color = 'blue'; if (!$coloring) {
if ( $age >= 12) { $str = $name . $suffix . "n";
$suffix = '君'; }
} return $str;
} else { }
$suffix = 'ちゃん';
$color = 'pink'; echo getLabel('つとむ', 1); //つとむくん
if ( $age >= 12) { echo getLabel('やよい', 2); //やよいちゃん
$suffix = 'さん'; echo getLabel('つとむ', 1,10); //つとむくん
} echo getLabel('やよい', 2,8); //やよいちゃん
} echo getLabel('つとむ', 1,12); //つとむ君
if ( $age >= 6 && $age <= 11 ) { echo getLabel('やよい', 2,20); //やよいさん
$suffix .= "(小)"; echo getLabel('つとむ', 1,10,false,true); //つとむくん
} else if ( $age >= 12 && $age <= 14 ) { echo getLabel('やよい', 2,8,false,true); //やよいちゃん
$suffix .= "(中)"; echo getLabel('つとむ', 1,12,false,true); //つとむ君
} else if ( $age >= 15 && $age <= 17 ) { echo getLabel('やよい', 2,20,false,true); //やよいさん
$suffix .= "(高)";
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
22. 長さがヤバイ
エディタに収まらなく
なりつつある
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
23. マジックナンバー
この数字や文字を後で変
更する時にミスりそう
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
24. 多すぎる引数
呪文と化した引数
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
25. 複数の関数に分割?
共通部分が多く
引数も多い
簡単には分割できない
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
26. 分割するにも
扱っている変数が多い
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
27. 関数の弱点
引数と返り値は
複雑なデータを扱うには貧弱
(データが単純ならOK)
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
29. 一見綺麗だが…
このあたりの変数名が
衝突した瞬間にアウト
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
30. 再利用性に乏しい
データをセットしなおさ
す必要がある
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
31. つまり
あのプラグインを入れた
ら真っ白に…
ここでは動いているけ
ど、あっちではダメ
似たような関数がたくさ
んコピペされている
手出しできない密林が
コードにある
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
34. クラス
<?php
class MyClass {
const HOGE =100;
public $some_string = こんにちは ;
public $num;
public function sayHello() {
echo Hello ;
}
}
classでクラスを宣言
プロパティ、定数、メソッド
をクラス内に宣言できる
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
35. インスタンス化
<?php
$obj = new MyClass();
$obj->sayHello();
$obj->some_string = AAAA ;
クラスとして宣言した処理を
利用する為のオブジェクトを作成
アロー演算子(->)でメソッド等を指定
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
36. $this
<?php
class MyClass {
const HOGE =100;
public $some_string = こんにちは ;
public function sayHello() {
echo $this->some_string;
}
}
自分自身を指すオブジェクト
メソッド内で使える
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
37. const
<?php
class MyClass {
const HOGE =100;
public function sayHello() {
echo self::HOGE; // MyClass::HOGE でもOK
}
}
オブジェクトに属する定数を設定
self:: か クラス名:: で参照できる
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
38. $this
<?php
class MyClass {
public $some_string = こんにちは ;
public function sayHello() {
echo $this->some_string;
}
public function change() {
$this->some_string = こんばんわ ;
}
}
プロパティはメソッドを跨って
参照や更新ができる
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
44. 引数
破滅の予感
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
45. 直接セット
面倒くさい
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
46. 初期化用メソッド
忘れそう
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
47. コンストラクタ
<?php
class MyClass {
public $name;
public __construct($name) {
$this->name = $name;
}
}
__construct というメソッドを作成
クラスをnewしてインスタンス化時に
必ず実行される!
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
52. アクセス修飾子
<?php
class MyClass {
const HOGE =100;
private $some_string = こんにちは ;
public function sayHello() {
echo Hello ;
}
}
メソッドやプロパティへのクラス外から
のアクセスを制限できる
public / private / protected
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
53. アクセス修飾子
外部アクセスが不要な
プロパティ
メソッド
をprivateにする事が多い
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
56. static
<?php
class MyClass {
const HOGE =100;
private $some_string = こんにちは ;
public static function sayHello() {
echo Hello ;
}
}
echo MyClass::sayHello();
staticが指定されたメソッドは
インスタンスを作らずに実行できる
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
57. staticの落とし穴
<?php
class MyClass {
const HOGE =100;
private $some_string = こんにちは ;
public static function sayHello() {
echo $this->some_string;
}
}
echo MyClass::sayHello();
staticが指定されたメソッドは
$thisを使えない!
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
61. 継承
<?php
class MyClass {
public function hoge() {
echo a ;
}
}
class MySubClass extends MyClass {}
$obj = new MySubClass();
$obj->hoge();
既存のクラスを再利用して
クラスを作る
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
62. parent::
<?php
class MyClass {
public function hoge() {
echo a ;
}
}
class MySubClass extends MyClass {
public function Hello() {
parent::hoge();
}
}
メソッドを再利用して新しい処理を作成
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
63. 継承
元のクラスは親クラス、
スーパークラスと呼ぶ
parent:: で参照できる
既存のメソッドを上書きも可
privateは触れない
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
68. インターフェース
<?php
interface iihito {
public function sayHello();
}
class Person implements iihito {
public function sayHello(){
}
}
特定のメソッドの保持を強制する
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
69. トレイト
<?php
trait iihito {
public function sayHello() {
}
}
class Person{
use iihito;
}
特定のメソッドをクラスに注入する
40分濃縮PHP classのクラス / Yusuke Ando (@yando)
70. 最初に思う疑問
継承
抽象クラス
インターフェース
トレイト
なぜ似たような機能が?
40分濃縮PHP classのクラス / Yusuke Ando (@yando)