真夜中のプログラミングTips このページをアンテナに追加 RSSフィード

2006-08-26 PHPなオブジェクト指向入門 vol.0 このエントリーを含むブックマーク このエントリーのブックマークコメント

PHPプログラマーの最初の壁は間違いなく、オブジェクト指向プログラミングだと思います。本格的オブジェクト指向に対応し、本来なら一気に移行が進むはずだったであろうPHP5がいまだに普及率50%に満たないのも、PHPプログラマーオブジェクト指向(クラスの利用)を好む方が少ないからではないでしょうか。

開発中のPHP6ではプロシージャ指向も今まで通りサポートするものの、オブジェクト指向をベースにするようなので、少しでもオブジェクト指向への抵抗がなくなればと思い、未熟者ながら「オブジェクト指向の入門」を書いてみたいと思います。


「クラスはオブジェクトの設計図で…(省略)」、「親クラスが哺乳類で…(省略)」といった説明は読んだけどよくわからなかった、知識にはなったが実用上は結局関数ばっかりという方を対象にしています。

また、オブジェクト指向と言っていますが、その概念とか小難しいことではなく、とりあえずクラスでコーディングできるようになることだけを目的とします。


さて、次回があるかは別として今回は初めてクラスに関する勉強をしたときに疑問に思ったことを書くことにします。最初の疑問、それは


「そもそもクラスで書く意味がわからない」


でした。

なんせPHPの入門書のサンプルはクラスで書かれていません。それでいて掲示板などの一般的なWEBアプリを作れているのです。さらに悪いことにオブジェクト指向やクラスの書き方に関して、Javaの入門書では(OOP言語なので当然ですが)相当な数のページを占めますが、PHPの入門書では紙面の都合からか後半部に数ページということも多く、全く必然性を感じません。(というか短すぎて理解できません。)

さて、話しを戻して最初の疑問の直接的な答えになるかはわかりませんが思うことを羅列してみます。


(1) オブジェクト関数の本質的な違いと使い分け

メモリの使い方といった深いことは知りませんが、コーディング上の本質的な違いは変数を保持できるか否か」に尽きます![※]このことを山田祥寛さんが何かの本の中で書かれていましたが、これに気がつかされたとき、ハッとしたことを今でも覚えています。

[※]GoFデザインパターンといった本格的なOOPをかじると「変数を保持できる」だけではなく、もっと深いものだとわかってくるようです。

実際、関数を定義するときには、(グローバル変数を除き)引数として関数の外部から渡し、return で返すことしかできませんが、クラスは内部で変数を定義でき、クラスの実体のオブジェクトはどこからでも内部変数を引き出すことができます。

定義関数の return であれもこれも返したいのにうまく返せず、煩雑な配列に格納して返す…といったことが減ると思います。あれもこれも引数として渡したいとき、または、あれもこれもreturnしたいときは、関数よりクラスの方が遥かに簡単です。

[※]関数に5を超えるような引数を渡す、関数内での多重グローバル変数宣言(global $var; だらけ)は可読性、保守性を著しく低下させるだけでなく、意図しない動作の原因となります。


(2) オブジェクト指向のメリット

そもそも関数型の限界を解消するために生まれたこともあり、メリットを挙げればキリがないのでしょうが、

「使い回し・拡張(継承)」

関数名の重複回避」

カプセル化

PEAR, Smarty などのクラスライブラリの利用

MVC分離に有効(というか必須)

ソースが読みやすい・管理がしやすい(命名規則等をしっかり行うと、間違いなくOOPの方が可読性が高いです。)

が最も基本的なものだと思います(つっこまないで下さい…)。とくに関数名の重複回避はグループ開発では必須です。また、自分でクラスを書かないとしても PEAR, Smarty などのクラスライブラリを抵抗無く使える、さらには、ある程度中味を理解して使えるといったことは、PHPプログラマー必須のスキルです。

番外メリット:

脱初心者という自己満足に浸ることができる。初めて逆上がりや二重飛びを出来るようになったとき感じたあれです。



(3) オブジェクトのデメリット

・クラスからオブジェクトを作る際にオーバーヘッド(ロス)がある

PHPにおいてはメソッドの方が関数より動作が遅い

・クラス名、メソッド名に悩むことがある(OOPでは命名は非常に重要です。)

といったことが挙げられます。しかし、実際上は一度に何百人がアクセスするようなサイトでない限り全く問題ないです。自己満足ベンチマークに浸るよりまずはアクセス増やしましょう(笑)(でもやっぱり自己満足しますよね?)

余談ですがテンプレートエンジン Smarty を使っている時点で早い遅いということを議論する資格はないそうです。Simplate などの高速テンプレートと比較すると、Smartyは何倍も遅いようですから!


文章力がないため全くまとまりがありませんが、少しでもお役に立てばそれでよしということで。次回は this などコーディング時の疑問を書いてみようと思います。

せみせみ 2008/02/04 23:24 とてもたすかりました。私はPHP初心者です。素敵なサイトを作りたくて勉強しています。勉強の合間によみとても分かったようなきがしています。ありがとうございました。

ポチポチ 2008/03/24 15:55 はじめまして。最近PHPを始め、オブジェクト指向というものもやっておくべきかな〜?と思い、こちらに辿り着きました。
「そもそもクラスで書く意味がわからない」これとまったく同じことを思っていたので、案外そう思う人は多いんでしょうかね。
「関数名の重複回避」に関してのみ分かっていたので、関数を同じような種類でまとめてxxxxClassと名前を付けて、ただ関数を纏めただけのものとして使ってたんですが、
今回拝見した限りでは、
1.配列にしてreturnしなくても複数受け取れる。これでまず「おぉ、それは便利かも!」と思いました。
2.引数が多い関数は云々。これは過去やったことがあるのですごく実感しました。
あと、番外メリットに一番納得してしまいました(笑)
おかげでオブジェクト指向のメリットが少し見えてきた気がします。
ありがとうございます。