PHPのオブジェクト指向でデータのやり取りにつまづいた

このQ&Aのポイント
  • PHPのプログラムをオブジェクト指向で書いているが、クラス間のデータのやり取りで問題が発生
  • クラス間のデータのやり取りについては、設定用のクラスから各クラスに値を渡す必要がある
  • 設定用のクラスのインスタンス化や値の管理について理解が不足しており、具体的な使用方法が分からない
回答を見る
  • ベストアンサー

phpのオブジェクト指向でつまづきました・・・

phpのプログラムをオブジェクト指向で書こうと思ったのですが、クラス間のデータのやり取りのあたりでつまづきました。 クラスはそれぞれ 1.設定用 2.データの読み書き用 3.入出力用 4.データ処理用 5.メイン です。 オブジェクト指向で書く前よりはコードも見やすくなったのですが、例えば4のデータ処理のところからは1、2、3の全てのプロパティを参照していたりして、なんだか複雑に。 オブジェクト指向で検索するとwikipediaには プログラムを構成するコードとデータのうちコードについては手続きや関数といった仕組みを基礎に整理され、その構成単位をブラックボックス とすることで再利用性を向上し、部品化を推進する仕組みが提唱され構造化プログラミング (structured programming) として1967年にエドガー・ダイクストラ (Edsger Wybe Dijkstra) らによってまとめあげられた と書いてありました。これだと関数を種類ごとにまとめただけであまり部品化はされておらず、前と変わらないような気がしてしまって・・・ 例えば設定用のクラスはのプロパティほとんどすべての所で値が必要になるのですが、毎回newを使うのは気が引けるので、クラスの外で new でインスタンス化して必要なところから毎回 global で呼び出したりしているんですが・・・使い方が間違っている気がするのですが、そういったことを解説しているサイトが見当たらなかったため、全く分からない状態です。そもそもこの場合、設定用の値はクラスにまとめるべきなのかどうか・・・。 書く時は$クラスー>メンバ変数 とか $クラスー>メンバ関数 のように書くので今何をしているのかが分かりやすく、それは便利だと思うのですが。 すみません。自分でも上手く説明できずによくわからない文章になってしまいましたが、結局の所オブジェクトがどんな物でどんな書き方をすれば良いかが分かっていないのだと思います。そういった所を分かりやすく教えてください。お願いします。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

一人だと「クラスを使う人」と「クラスを作る人」に上手に頭を切替える必要があって、その辺で混乱しているのかも…。 方法として、各クラスを書いてメイン処理を書くのではなく、逆にまずクラスを使う人の立場で、こんな関数があったら便利だな、という感じで メイン(クラスを使う方)から書いてゆき、実際のクラスや関数は後で実装する(クラスを作る人になる)というのも手です。 また「クラスを作る人」になったときは「いつかフリー配布して皆に使ってもらう」ようなつもりで書けば、必要なメンバ変数や関数が見えてくるかも知れません。globalが必要になることもないはずです。 ※最初は自己流でよいので「 UML 」のクラス図を書き出して、一度整理して全体の構造を見直すことをお勧めします。 >設定用の値はクラスにまとめるべきなのかどうか・・・。 あまりピンと来ません。例えば、多言語対応とかで言語によって各種設定が変わるなら分かりますが…。普通に設定ファイルを読み込んで、各クラス・オブジェクトへ必要な値を渡し、取得した結果や生成されたオブジェクトを次へ渡してゆくのではダメなのでしょうか? 「何をどこまでオブジェクトと見なして、どのようにクラスとして切るか」は、物事の見方、洞察・分析力、汎化するセンス、適度な妥協等、ちょっと慣れが必要かも知れません。 今は頭が脱皮している最中だと思います。もう少しで「見えてくる」はずです。 ちなみに以下が良書ですが、今見たら絶版のようで残念。中古も高値みたい。 http://www.amazon.co.jp/PHP%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E4%B8%8B%E5%B2%A1-%E7%A7%80%E5%B9%B8/dp/4798015164

qazwsx254
質問者

お礼

なるほど。使う人が使いやすいようになどとは考えてませんでしたね。 もう少し汎用性なども考えて使いやすいように、頑張ってみます。ありがとうございました。 ¥ 25,998より これは、、残念ですね。

その他の回答 (2)

  • SexyAkeko
  • ベストアンサー率41% (26/63)
回答No.2

私は、ぶっちゃけ完全に理解はしていないとは思うんですが、オブジェクト指向。 そんな私の意見としては、オブジェクト指向にしたからと行って、利便性はよくなるけど、簡潔にかけるわけではない。 とくに、PHPのような開発環境がメンバの名前を表示してくれたりとかをサポートしてくれないとかえって面倒なことに。 しかし、データをカプセル化ができたり、継承により、柔軟にクラスの使い回しができたり、便利にはなる。 つまり、過去に作ったクラスを、ちょっとだけ変えるのに便利。 なるんだけど、もともとPHPは、変数の型がなかったりと、ナチュラルにポリモーフィズムだったりするので、PHPであえてクラスで作る必要が・・・・ある?とも。 のと、オブジェクト指向といのは、毎回全部自分で作れちゃう、小さいソフトを作ってもたいして変わらないというか、逆に分けがわからなくなる。 やはり、大規模で大人数のプロジェクトで真価を発揮するものだと、、、、 アホな私はそう決めました。 なので、ガンガン関数ベースで書いていってみては? オブジェクト指向がどういう使いかたかが分からないのは、多分経験不足で、とりあえず、使い回しを意識して、グローバル変数は使わず関数で全部書いてみる。 例えば、ファイル読み込み用・保存用の関数とか自作してみる。 で、何度かその使い回しを使っていくうちに、使いまわせない状況ってのが出てくるんだわ。 それを改善できるのが、クラスって考え方で、それがオブジェクト指向に近いんじゃないかなー?と、私は思うんだけど、、、、たぶん、もっと頭のいい人からは、「そんなんじゃねーよーっ!」と言われるかもしれない。www

qazwsx254
質問者

お礼

なんとなくですが、オブジェクトのイメージがはっきりしてきました。 モヤモヤが無くなって気分すっきりです。ありがとうございます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

PHPから一旦離れるのはいかがでしょうか? 「PHPでオブジェクト指向」となると、あまり参考書等も出ていないと思います。 例えば、Javaなら、言語+オブジェクト指向の参考書やサイトがたくさんあります。 これらで基礎を身に付けてから、PHPに応用するのがよいのではないでしょうか。

qazwsx254
質問者

お礼

確かに、PHPでのオブジェクト指向の本は全然見ないですね・・ Javaはやった事が無いですが、本を探してみたいと思います。

関連するQ&A

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • オブジェクト指向が理解できません 教えてください

    現在Javaを勉強しているのですが、 Javaに限らず最近のプログラムの特徴であるオブジェクト指向がよくわかりません。 C言語も学んでいたので少しは知識はあります。 以下は私の解釈です。 C言語は関数の集まったものがいわゆる私たちが作るプログラムで、 作ったプログラムはそれ単体で機能する。 それに比べてオブジェクト指向を用いたプログラムでは、 オブジェクトからクラスが生成、このクラスが一つのプログラムとなる。 クラスのプログラムをいくつも集めたものが最終的なソフトとなる。 Cだとミスを一か所直すと他のところを直す羽目になるかもしれませんが、 オブジェクト指向においてはミスをオブジェクト単位で修正するので、 他のオブジェクトへの影響度は少ない。 よってオブジェクト指向の方が拡張・修正などでも優れている。 こんな感じに解釈したのですがどうでしょうか? オブジェクト指向では最終的なプログラムソフトはオブジェクトの集合体によって構成されているため、オブジェクト指向=オブジェクト中心の考えと言えるのでしょうか。

  • オブジェクト指向に関して。

    Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?  また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか? ぜひ、力を課してください。

  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向でないプログラムってどんなのですか

    オブジェクト指向はそれぞれのインスタンスに属性とオペレーションがあるのがわかりましたが、そうでないプログラムの仕組みなんてありえるんですか? Aを動かす為にBを押したらCがAを動かしてくれたって物を作ろうとしたときにそれぞれをオブジェクトとする以外に方法は無いような気がしますが。 ものを作るときって部品を組み立てたり作用させたりすると思うので、それ以外の組み立て方法ってどうやるのでしょうか?

  • オブジェクト指向プログラミング

    一般に、オブジェクト指向プログラミングといわれているプログラミングに関してですが、 「関数・手続きを使用するプログラミング」と 「クラスを作成してプログラミング」というのは おおきな違いがあるのでしょうか? (クラスを作成しなくても関数・手続きで、プログラミングすれば 一緒じゃないかなぁと思っていますので・・・。) どなたか、これに関して、お返事をして頂けたら今後いろいろな面でかなり助かります。

  • 非オブジェクト指向で開発中のシステムをoopsに…

    php5.3で、クラスを1個しかつかわず、関数も数個しか使っていない状況でシステムを構築中です。 関数のスコープもめちゃくちゃです。 で・・・・これをオブジェクト指向にしたいのですが、 どこから手をつけていいものか迷ってます。(オブジェクトもほとんどわかってない。extend privateくらい) この場合、どうやってoopsにかえていくのがいいでしょうか? どんな意見でもいいので、お教えいただけますでしょうか? よろしくお願い申し上げます。 あと、こんな状態の私(オブジェクト指向をほとんどわかってない)にとって 役立つサイトをご存じでしたらぜひお教えください。よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 【PHP】オブジェクト指向の解説が分からない

    http://www.scollabo.com/banban/php/php_11.html のページで、オブジェクト指向の説明があるんですが その中でのこのくだり↓ //----------------------------------------- $newShopping = new Shopping(); $item = $newShopping->item メンバ変数に格納されている $item では、 もともと「コンピュータ」が定義されていましたが、 このようにして、その内容を随時変更することができます。 //----------------------------------------- この下りでの、"その内容を随時変更することができます"がよく分かりません。 たとえば、コンピューターという定義を MAC とかに変更できるということですか? だとしたらどうやって変更できるのでしょうか。

    • ベストアンサー
    • PHP
  • オブジェクト指向の勉強にちょうど良いソースコードはありませんか?

    オブジェクト指向の勉強にちょうど良いソースコードはありませんか? VB6からVB.NETへの移行中ですが、VB.NETは本格的にオブジェクト指向言語となったそうで、オブジェクト指向といえばデザインパターンらしいので勉強をしつつリファクタリングを行っています。 デザインパターンのサンプルコードはwebで散見されますが、どれも説明に必要な最小限のコードなので実際の開発にどのように適用したらよいかいまいちイメージできない部分があります。 また、具体的なところだと、オブジェクト指向ではオブジェクト間の結合度を弱くしてグローバル変数を極力使用しないとありますが、設定値を管理するオブジェクトのようにあちこちから参照されるものはやはりグローバルにするのが一般的なのでしょうか。 設計の参考になるソースコードとかサイトとか教えてください。 ちなみに、今作成しているのは測定器や電源装置などを制御してデータ収集したりする制御系のソフトです。

  • オブジェクト指向の本当の便利な点。

    オブジェクト指向の特徴は、ある程度分かりました。 が、個人で小さなソフトを作り、できるだけ自分でプログラムを作りたいため、オブジェクト指向の利点が今ひとつ分かりません。 PHPでは、構造化でできるだけグローバル変数を減らし、関数内でも関数名+変数名という変数名にしていたので、変数の名前が重複すると言ったこともなかったし。 関数名+でない場合も、関数内では不必要な変数は値を解放していたし。 過去の資産も関数を再利用する事もよくありましたし、継承のような事もしていました。 オブジェクト指向の便利さは分かるのですが、どうも実感できないというか、その便利さを持て余しているというか。 構造化プログラミングでも、さほど問題ないし。 delphiなので、JAVAのようにオブジェクト指向(クラス)が必須という訳でもないし。 逆にクラスを作ってしまうと、メモリーから解放しないといけないので、それが少し怖いです。 で、オブジェクト指向の利点をあげるとしたら何ですか? 可能なら、上位から3つくらいを詳しく書いてください。 ソフトは大規模か小規模か、制作者は大勢か少数・個人か、それは構造化プログラミングでは無理な事なのか? オブジェクト指向の利点や特徴は、分かるのですがピンとこないというか、実感できないというか・・・。

専門家に質問してみよう