極度の面倒くさがりにより、漠然とオブジェクト指向から距離を置いてきたが、最近初めて触れ、やっと理解できた気がするので書く。世の人間はオブジェクト指向を説明するとき、たい焼きだの設計図だの何だのと言い始める。読めるようになりたいんだ。いうことで、自分なりにまとめてみる。誰かの役に立てたら嬉しい。オブジェクトって何まず、「オブジェクト指向」とはそもそも何かと言うと、設計思想の1つのことだ。このオブジェクト指向を実現するため、「クラス構文」という書式がある。要はこれが使えればいいのだ。「オブジェクト」とは関数と変数のカタマリの事である。関数と変数が梱包された状態だと思ってほしい。このオブジェクトのことを「クラス」とも呼ぶ。「クラス構文」とは、つまりオブジェクトを定義する書式だと思えばいい。※わかりやすくするため、ここでは「オブジェクト」=「クラス」とする。後述する「インスタンス」はオブジェクトと呼ばれやすいが、クラスとは別物。「オブジェクト」=関数と変数のカタマリの総称、「クラス」=オブジェクトを定義したもの、「インスタンス」=クラスをインスタンス化したもの、なんだなーと思っておけば大丈夫。オブジェクトを使っていく流れオブジェクトは定義して呼び出すのが基本で、こういう流れになる。空っぽのオブジェクトを用意する。⇓オブジェクトの中に変数や関数を入れていく。定義されたオブジェクトを読み込む。⇓オブジェクトから変数や関数を引っ張りだして使う。オブジェクトの中身を呼び出すにはオブジェクトは、中身の呼び出し方を考えてから定義することが多いので、先に呼び出し方を確認しておこう。例として、引数に与えた文字をそのまま表示するユーザー定義関数foo()を用意した。$str;}この関数を、どんな名前でもいいが、ここではMyProjectという名前のオブジェクトに入れることにする。(「オブジェクトを定義するには」で手順は後述)早速オブジェクトMyProjectからfoo()を呼び出してみる。おはよう!が表示される最初の行を見てほしい。$objという変数の中に、オブジェクトが代入されている。〇〇という書式で、変数に一度代入することで使えるようになる。これを「インスタンス化」と呼び、このとき、変数は「オブジェクト型」という状態になっている。上記の例ではオブジェクト型の変数$objに、事前に定義したオブジェクトMyProjectの中身がそのまま入っているのだ。この代入された変数のことを「インスタンス」という。インスタンス=オブジェクト型の変数のことである。$obj->foo('おはよう!')とある。これは、オブジェクトのインスタンスからfoo()というユーザー定義関数を呼び出している。このとき、普通の関数とは呼び出し方が異なるので、この関数のことを特別に「メソッド」と呼ぶ。用語ばかり出てきて申し訳ない。先ほどのコードはこういうことである。オブジェクトを定義するにはさて、ここで先ほどの例で使ったオブジェクトMyProjectを定義する手順だ。最初に空っぽのオブジェクトを用意する。}}オブジェクトが完成!これだけ?これだけ!これで、MyProjectというオブジェクトの中にfoo()というメソッドが定義されたことになる。さっき呼び出しの部分で書いたものと組み合わせてみよう。おはよう!が表示されるこれで一段落。これが理解できたあなたは、とても基本的なクラス構文をマスターしたことになる。オブジェクトにしかできないこと...プロパティここまで来た人は疑問に思うかもしれない。「関数をメソッドにする意味って何なの?」「それ、ユーザー定義関数で良くね?」と。ここからは、オブジェクト指向だからできること、プロパティの仕組みを説明する。「オブジェクトって何?」で説明した図を思い出してほしい。梱包されてるのは関数(メソッド)だけじゃなかった。このオブジェクトの中で定義された変数のことを、「プロパティ」と呼ぶ。プロパティの基本的な定義の仕方と呼び出し方は次の通り。プロパティの呼び出しメソッドと似ていることがわかるだろうか?そう、プロパティとメソッドは扱い方がとてもよく似ている。今回は、最初に少し見慣れないキーワード「public」について説明しよう。これは、メソッド(関数)やプロパティ(変数)のアクセス権を示している。privateの3つがある。オブジェクトの外部から呼び出せる。継承されたオブジェクトから呼び出せる。オブジェクト内のメソッドから呼び出せる。オブジェクトの外部から呼び出せない。継承されたオブジェクトから呼び出せる。オブジェクト内のメソッドから呼び出せる。オブジェクトの外部から呼び出せない。継承されたオブジェクトから呼び出せない。オブジェクト内のメソッドから呼び出せる。プロパティではこれらのアクセス権を必ず明示する必要がある。メソッドでは、省略した場合publicとしてみなされる。前項の例で作ったメソッドは、publicを省略していたということだ。省略できるのだが、アクセス権はちゃんと書いておいたほうが喜ばれるだろう。プロパティで注意してほしいのは、メソッドの外でないと宣言できないということだ。以下のようなことはできない。$obj->foo();これは、ユーザー定義関数の特性上、その中で使われる変数はローカルスコープでないといけないからだ。メソッドの中でプロパティを使いたいのなら、$obj->textみたいな感じで変数を呼び出さなければならない。自分のオブジェクトの中で自分のオブジェクトを指定するのもおかしいよな...ということで、擬似変数$thisが登場する。おはよう!$thisを使うと、プロパティを活かして、例えばこんなことができる。合計金額を表示するメソッドも作れる。2340円オブジェクト指向の便利さはここからだ。上の例の後半だけ次のように書き換える。$cart2が別々のものとして計算されている。2つのオブジェクトは独立して動作しているのだ。これがインスタンス化の最大のメリットである。この処理をユーザー定義関数で無理やり実現しようとすると、それぞれの処理が複雑に干渉してしまい、たちまち地獄が訪れるだろう。処理をいい感じに独立させることは、プログラミングをする上でとても大切だ。プログラムに将来への拡張性があることも、どれほど大切かわかる人は多いだろう。オブジェクト指向はこれを実現するためにある。インスタンス化で複数の機能をいい感じに独立させられる。クラスの中にメソッドを追加しても他の処理に影響を与えないため、将来への拡張性も確保できる。おわりにオブジェクト指向はプログラマの「あったらいいな」が詰め込まれているため、機能が多すぎて面食らってしまいやすいが、本質的な部分はとても簡単なものである。継承や無名関数、コンストラクタなど、面白い機能が他にもたくさんあるので、興味があるものから一つずつ調べてみるのがいいだろう。無名関数ツイッターでシェアみんなに共有、忘れないようにメモウラルSplatoonの二次創作サイト「スプランプ」の管理人です。サーモンラン研究所やオクトチャット、フェス速報などを作りました。https://splamp.infoCrieitは個人で開発中です。どんな軽い内容でも嬉しいです。Errorで表示されないバグ[個人開発]大喜利サービスを5日でつくってわかったことPHPでメールフォームを自前でつくる。