PHP オブジェクト指向の勉強
相方の知り合いにPHPに強い方がいらっしゃって、相方がその方に私がPHPを勉強してるって話をしたら「んじゃ、オブジェクト指向の勉強した方がいいよ」とアドバイス頂いたのでさっそく勉強してみる。
実のところ「オブジェクト指向」っていうの、今までも何度も何度も本読んだり、サイト見たりして自分でサンプルに書かれてるソース手打ちして実験したりもしてたんだけど、なんか分かったような分からんような・・・な状態だったんですよね。何が分からないのかと聞かれるとそれもまた分からないんだけど、なんだろう、概念みたいなものが自分の理解であってんのかどうかわかんない + 使いどころはどこ? + 難しそうで怖いという先入観。まぁ、とりあえずおさらいしてみる。
手続き型とオブジェクト指向
処理を1つ1つ流れに沿って動作させるのが「手続き型」っていう方法。私がPHPに興味を持ち始めた頃「これからはPHP5だからオブジェクト指向だぜ!」みたいな内容の雑誌記事をよく目にしたんだけど、その対となる処理の形としてこの「手続き型」っていう言葉がよく出てきてた。結論としてはPHP4の頃はあまり意識しなかったけど、PHP5になってオブジェクト指向の機能が強化されてるから、今後はそっちメインでプログラミングした方が効率いいよって話っぽい。
どこで見たのか聞いたのか忘れたけど、イメージとして手続き型のやり方は家を建てるときに適当な長さの木材をその都度大きさを合わせて切って組み合わせて家を建てる。反対にオブジェクト指向は予め大きさや色の決まったレゴブロックを組み合わせて家を建てる、みたいな。
無理やりCSS脳で考える
私にはCSS脳しかないので、CSSに置き換えて考えてみると、手続き型はいちいちhtmlソース中の任意の要素に1つ1つstyle="hoge:hoge;"というスタイルを付けていく方法。反対にオブジェクト指向は予め別の場所で.hogeっていうクラスを作っていつでもどこでも好きな場所でそのクラスを指定するだけでスタイルを反映させることができる、みたいな感じですかね?
時間の流れ的にも、昔はそういう風に要素に直接styleでも普通だったけど、今は「ちょwww なんでこんな大量に要素に直接スタイルつけてんのさ。ソース見難いしww 別の場所にclass作ってhtml側ではクラス指定した方が早いキレイ便利でしょww」みたいな流れでオブジェクト指向で行こうぜ!という流れになってるとか?間違ってたら超恥ずかしいけど。
そもそも「オブジェクト」ってなんぞ?
「PHP 逆引きレシピ」という本によると、『データとそのデータを操作する手続きをまとめたものを「オブジェクト」と呼び、オブジェクトの定義(雛形)を「クラス」と呼びます。PHPでは、オブジェクトは変数(データ)と関数(手続き)をまとめたものです。
』とのこと。うん。なんか分かったような分からんような。
なんせ普通の関数との違いはそこに一緒に変数を持てるかどうか、ということらしい。で、また専門用語出てきたわ。
プロパティとメソッド
- プロパティ(属性)
- オブジェクトの持つ変数 / メンバー変数、メンバーとも言う。
- メソッド
- オブジェクトの持つ関数 / メンバー関数とも言う。
さすがにこれは私でも意味はわかる。「メンバー」はサイトによっては「メンバ」って書いてあるところもあるけど、多分同じ意味。
クラスとは
上にも書いたけど、クラスはオブジェクトの定義(雛形)らしい。そういえば昔自分の先輩にオブジェクト指向について質問した時に「設計図のこと」って言ってた。その先輩曰く「何か作るときってまず設計図作るやん?設計図の作り方はもう決まってるから、そこに必要な事を入れる。で、設計図だけじゃモノはできないでしょ?だからそれを実体化するわけさ。なんたらかんたら・・・」きっと今なら話聞けば理解できたかもしれないのに、当時はこの人は違う世界の人だと思ってた。失敗した。やっぱり目上の人の話はちゃんと聞かなきゃいかんね。なにはともあれ、その雛形の書き方。
クラスを定義する
基本的な定義の書き方はこんな感じみたい。参考)PHP: クラスの基礎 - Manual
class クラス名
{
// プロパティの宣言
public $プロパティ名 = 'プロパティの内容';
// メソッドの宣言
public function メソッド名(引数){
メソッドの内容
}
}
「$プロパティ名」の部分で、このクラスはこんなプロパティを持ってますよーっていうのを定義、「function メソッド名(引数)」の部分でこのクラスができる機能っていうか関数を定義。メソッドの定義方法はユーザー定義関数と同じ。
アクセス修飾子
上の基本形のプロパティ部分では「public」を使用して定義してるけど、PHP5でのではアクセス修飾子というものを使用して、そのプロパティへのアクセス権を指定できるらしい。全部で3つ(4つ)ある。いろんなサイト見てるとここ「var」にしてあるページが多かったけど昔の名残なんかな?マニュアルによると『var で変数を宣言する PHP 4 の方法は、互換性を保つために今でもサポートされています (これは public と同じ扱いになります)
』とのこと。
- public
- どこからでもアクセス可能(デフォルト)
- protected
- そのクラス自身と継承したクラス、親クラスからのみアクセス可能
- private
- 定義したクラスからのみアクセス可能
- var
- public と同じ扱いになります
どういう使い分けをしていいのかまだまったく分からないけれども、とりあえずそういうのがあるということだけ覚えておく事にする。
public $プロパティ名 = 'プロパティの内容'; の部分
上の基本形では変数を宣言して、そこに初期値を入れてるけど、別にここは初期化せずに単に変数の宣言だけでもいいみたい。とりあえずそういうプロパティ持ってますっていうのを宣言すること。
ここで宣言したプロパティにはクラス内のどこからでも「$this->●●」という形で取り出したり、値を変えたりできる。この「$this」はオブジェクト自分自身のことやんね。javascriptとかでも使うし、身近な感じするね。
これ「->」は何回か使ったことあるけど、何て呼ぶのかは未だ不明。勝手に「矢印」とか「~の($this「の」●●)」とか脳内では呼んでる。で、調べてみたら「矢印演算子」っていうものと判明。オブジェクト(インスタンス)のメソッドやプロパティにアクセスするためのものなんだって。
クラスを使う
クラスを利用するには上で作った雛形だけじゃダメ。そこから実体を作る。それには「new演算子」というものを使用する。そうしてクラスから生成されたオブジェクトを「インスタンス」と呼ぶ。また、クラスからインスタンスを生成することを「インスタンス化(実体化)」と呼ぶ。
1つのクラスからオブジェクト(インスタンス)はいくつでも生成でき、生成されたオブジェクトはそれぞれがプロパティを持つ。これが関数との大きな違いということらしい。
インスタンスって言葉、CS4使ってると何かたまに見かける。(FlashとかFireworks等等)その場合は一旦シンボルっていう元となる形を作っておいて必要な状況になったらそれを実体化(インスタンス)して使うよね。元になってるシンボルをコピーしてインスタンスにして、必要に応じて個別のインスタンスの色変えたり、大きさ変えたり・・・。クラス=シンボルって置き換えて考えるとすごく理解しやすいんだけど、同じような事って考えていいんかな。
話は戻ってPHP。オブジェクトの生成はこんな感じで書く。これで「$変数hoge」の中にオブジェクトが入る。
$変数hoge = new クラス名();
オブジェクトが元々持ってるプロパティやメソッドにアクセスしたい場合はこんな風に書く。(●●っていうプロパティにアクセスしたい場合)
$変数hoge->●●
この前、simplexml_load_fileを使ってRSSフィードをサイト内に表示するっていうのをやったんだけど、なんか意識せずにこういうのやってたってことだよね。
ちょっと実験
こういうのは手を動かさないと分かった気になって終わってしまう私なので、ちょっと上で勉強した事ふまえて適当なクラス作る~使うまで書いてみたよ。なんかホント意味ない内容で笑われそうだけど><
・・・こういう時にササっともっと気の利いたサンプル作れるくらいの賢さが欲しい。
クラスの継承
クラスの継承とは既存のクラスを元に拡張や変更した新しいクラスを作ること。元になったクラスを「親クラス(スーパークラス・基底クラス)」、継承して新しく作ったクラスを「子クラス(サブクラス・派生クラス)」と呼ぶ。親が持ってるプロパティ&メソッドは子が引き継ぐ。子は親の持ってないプロパティ&メソッドを定義したり、変更したりする記述のみ加えればいい。
これはCSS脳には非常に分かりやすい項目なのでは・・・。あの便利な継承だよね、継承。この勉強記録書きながら一番自信あるわ、継承の概念。
書き方はこんな感じ。
class 子クラス名 extends 親クラス名
上の方で「クラスを定義する」っていうところに書いた基本形の頭の部分で「このクラスはこの親から派生してます」っていうのをちゃんと書いて上げなきゃいけないっていうことなんですね。了解。
クラスを継承して子クラスで親クラスと同じメソッド名を定義した場合は子クラスの方が優先され、親クラスのメソッドは上書きされる。(「オーバーライド」と言う)
ちょっと実験
コンストラクタとデストラクタ
オブジェクトが生成されるときに自動的に実行されるメソッドの事を「コンストラクタ」と言う。オブジェクトを生成する時に初期化の処理を済ませておきたい時に使うものらしい。(プロパティの初期化・データベースへの接続等)別にこれは必須ではない。
コンストラクタメソッドのメソッド名の書き方はこんな感じ。
function __construct(引数){
// コンストラクタで行う処理
}
デストラクタはその逆。「特定のオブジェクトへの全てのリファレンスが削除された直後やオブジェクトが明示的に破棄された直後に実行されるメソッド」らしい。なんか難しい説明だけど、なんせそのオブジェクトが消える時に実行したいものがあればデストラクタメソッドを使う。書き方はこう。
function __destruct(引数){
// デストラクタで行う処理
}
デストラクタはよく分からないけど、コンストラクタは意味分かった。前にPEARのAuthを使ってみたいとか言ってた時に「Auth::Auth()はコンストラクタ」って書いてあって『何それ?どゆこと?』状態やったんよね。もう頭の中で専門用語がごじゃごじゃで。ようやく分かった。ありがとうありがとう。
参考にしたサイト・本
<< PHP 添付ファイル付メール送信 勉強メモ | PHP宿題 PDFライブラリを使う >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/248
PHP オブジェクト指向の勉強 へのトラックバック一覧
» オブジェクト指向をあえて車目線で書いてみた 送信元 Re* Programming
Redさんのエントリを見てちょっとオブジェクト化について書いてみた。
PHP オブジェクト指向の勉強@RedLine Magazine
kamiyamとい...
Trackback time : 2010.01.23
コメント (6)
こんばんは~。
こちらではおひさしぶりですw
オブジェクト=外注とか代行屋さんって感じだと分かりやすいですかねぇ。
オブジェクトの中の人の段取り・手続きまでは、使う側(ページ側)では知らなくても良いというか。
まぁ、結局自分でクラス設計するから知っているはずなんですがw
PDFライブラリとか自分で作ることを考えると設計しやすいかもしれませんね。
生成→必要な情報のみ渡す→出力・・・みたいな。
クラス化してオブジェクトにすると使いまわしがきいて、ソース・設計とか作り方が激変しますよ~。
投稿者: かみやん | 2010年01月07日 23:04
>かみやんさん
こんにちわー。お久しぶりですねw
>オブジェクト=外注とか代行屋さんって感じだと分かりやすいですかねぇ。
あー、こっちがイチイチ手順ふんでやり方とか説明しなくても、オブジェクト自身がちゃんと必要なことを分かってて、こっちは「アレやって!」って言うだけで済む・・・みたいな意味ですかね。
>PDFライブラリとか自分で作ることを考えると設計しやすいかもしれませんね。
ふむふむ。
ちと手が空いたらやってみます!
投稿者: Red | 2010年01月08日 08:55
ばんわー。PHPは5年ぶりくらいに弄っている、某きのこる先生ですw
次はMVCの概念を知るといいですよ。以下によいサンプルがあります。
http://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp
一通り、オブジェクト指向やMVCを学んだら、次はフレームワーク(cakePHPやsymfony)を勉強するとよいです。フレームワークを使って開発するとめちゃくちゃ開発効率がよくなりますよっ!基礎知識がないのにいきなりフレームワークを使うのはお勧めしません。。
開発環境は何か使ってます?PHPの開発にはEclipse+PDTやNetBeansを使うと便利です。
分からんことがあったらいつでも聞いてください。またなにかあったらコメントします^^
投稿者: hogepage | 2010年01月21日 18:08
>きのこる先生ww
わーい。コメントありがとうございますですー!
いろいろアドバイスありがとうございます。参考サイトまで・・・。感謝感謝です。
cakePHPは試した事あります。といっても設置していろんな解説サイトのソース真似して「おおお。こんなんできるんか!」程度ですけど・・・。
環境は前はEclipseを先輩に教えてもらって使ってたんですけど、なんとなく自分にはまだ早い気がして封印してました。今は適当なフリーのエディタとかDWとかでチマチマやってます。NetBeansは分からないです。ちちとググってみますね。
とりあえず次はMVC、ですね。頑張りますですー(n'∀')η
投稿者: Red | 2010年01月22日 09:25
初めまして、オブジェクト指向で行き詰っていたら、たまたまこのサイトを拝見しました。すごくわかりやすくて、感激して思わずコメント書いてしまいました。本当にありがとうございます。
投稿者: 匿名 | 2011年11月27日 21:42
あれ、匿名になってしまいました、、、houseiiiと申します。参考になりました、ありがとうございます!
投稿者: houseiii | 2011年11月27日 21:43