• ベストアンサー

PHPにおけるクラスの必要性について

私はPHPを主に、ウェブスクレイピング、cronと連携してウェブサイトの更新、MySQLの更新などで使用します。 しかし未だにCLASSの概念がよく理解できません。 私が書くコードは、functionはよく定義しますが、CLASSを使うことがありません。 どういう場面でCLASSを使うのかがいまいち理解できないからです。 継承やらコンストラクタやら、概念としてあるのは理解できるのですが、ではそれが実際にどう役立つのかがわかりません。 CLASSを使えばできること、CLASSを使えば効率が上がることなどをPHPのプログラミングの実例で教えてください。 よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
noname#177743
noname#177743
回答No.2

手書きで最初から最後までコードを書くというのは、比較的規模の小さい開発だけだろうと思います。ある程度以上の規模になると、やることも煩雑で複雑になりますし、多数のページを統合的に管理するための仕組みも必要になります。そのために各種のライブラリやフレームワークを導入することになります。 こうしたライブラリやフレームワークでは、たいていクラスを使って機能が実装されています。なぜなら、そうしないと収拾がつかないことになるからです。例えば特定の状況下で利用する数十の変数があったとして、それらは必要に応じて値を保持しいつでも利用できないといけません。これらをすべてグローバル変数にした場合、すべての状況下で必要とされる変数は数百にものぼり収拾がつかないでしょう。こうした大規模開発用のフレームワークなどではクラスは必須になります。 また、特定の役割を果たす機能が状況に応じて複数ある場合、それらをすべて同じ名前のメソッドとして用意することで効率がぐっとアップすることもあります。例えばデータベースアクセスの場合、関数を使うと、MySQLやPostgreSqlでそれぞれ関数名が違っていますね? もし、データベースを変更しようとしたら、これらの関数をすべて探しだして書き換えなければいけません。それぞれのデータベースごとにクラスを定義し、その中にすべて同じ名前でアクセス用のメソッドを用意すれば、データベースを変更する場合も、使用するクラスを変更するだけで他は一切書き換える必要もありません。(PDOのように単独クラスであらゆるデータベースを使えるようにすれば更に便利ですが) 実は、私自身も個人でフレームワークも使わずにコードを書くときは、ほとんどクラスは使いません。せいぜいPDOなどの既存クラスを利用する程度です。が、CakePHPなどのフレームワークを導入すると、とにかくクラスを書くことが基本になりますから、クラス以外のコードを書くことはなくなります。一度、そうしたフレームワークを使ってみると、クラスの役割が実感できるのではないでしょうか。

spinia0120
質問者

お礼

なるほどです。フレームワークの導入は考えたことがありませんでした。 一度試してみます。

その他の回答 (1)

  • yuv921
  • ベストアンサー率44% (12/27)
回答No.1

クラスを定義してインスタンスを生成すれば、クラスで定義した変数も使えます。 functionでは処理させるだけ、または戻り値を得ることができる といった程度じゃなかったでしょうか。 (最近さわってないので忘れかけてますが。。。) ただ個人的に、PHPのクラスを使う文法が見にくくて苦手です。 私がクラスの勉強がてら作ってるプログラムを見て、 「そんなんごときにクラスを使うか…」と言われたことがあり、 クラスが有効になるのは、かなり大きなプログラムかな、と思ったことがあります。 手元にデータが残ってないので実例はありませんが、 PHP クラス 実例 等で検索するといくつか出てきましたよ。

関連するQ&A

  • PHPにてクラスを配列にすることは可能でしょうか。

    PHPにてクラスを配列にすることは可能でしょうか。 環境はPHP5です。 現在下記のようなクラスを作成しました。 class Ary_c { var $v1; // コンストラクタ function Ary_c() { $this->v1 = "test"; } } このクラスをC++言語などで出来るような、 クラスの配列として扱いたいのです。 C++だとたとえば10個の要素があるクラスの配列は Ary_c t[ 10 ]; みたいな感じで宣言できます。 こういったことをPHPでやることは可能でしょうか。

    • ベストアンサー
    • PHP
  • PHP4でのSmarty派生クラスの定義について

    こんにちはよろしくお願いします。 PHP4でSmarty派生クラスを定義する方法を教えてください。 PHP5のサンプルコードで次のようなものがありました。 PHP4では,「private」が使えないらしいとか,「__construct」ではなくてクラス名がコンストラクタ名になるとかでうまくいかないようです。どのように修正すればよいのでしょうか? また,「__destruct」はどのようにすれば良いのでしょうか?コンストラクタ名とデストラクタ名が同じでよいのでしょうか? よろしくお願いします。 <?php require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("sqlite://localhost/samples.db"); } public function __destruct() { $this->_db->disconnect(); } public function getDb() {return $this->_db;} } ?>

    • ベストアンサー
    • PHP
  • phpのオブジェクトの使用方法について

    プログラミングはPHPが初めてで、プログラミングというもの自体に慣れていないこともあり、初心者用の本を買ってそれに従って進めているのですが、オブジェクトのところで理解するのに行き詰まってしまいました。 検索してみたものの、以下のページがわかりやすそうだったのですが、これらを読んでみてもいまいちしっくりときません。 http://www.komonet.ne.jp/~php/chap10.htm http://www.stackasterisk.jp/tech/php/php03_09.jsp オブジェクト指向のコンセプトは把握できているつもりです。いつでも使い回しができるコードの束のようなものだと理解しています。しかし、その用法で今まで自分が読んできたものと違うことがあり、また、それらを使用する必然性にたいする理解ができません。いったいどういったタイミングで使用するのでしょうか?以下にそれらの例を挙げて見ました。 1.var $aaa = "hoge"; このvarはいったいどこからやってきたのでしょうか?それに関する解説が本にもWEBにも見つけられなくて困っています。これはクラスの定義内でのみ有効なのでしょうか?何のために使用するのでしょうか? 2.$this -> aaa これをなぜ、単に$aaaと表記しないのでしょうか? 3.プロパティ(property) なぜクラス内の変数(variable)をわざわざそう呼ぶのでしょうか? 4.メソッド(method) なぜクラス内の関数(function)をあえてそう呼ぶのでしょうか? 5.コンストラクタ(Constructor)、継承(Inheritance) 1~4の部分で躓いているためか、いまいちその必要性が理解できません。 もしご存知の方おられましたご教授していただけるとうれしく思います。

    • ベストアンサー
    • PHP
  • クラスの使い方

    php5です。 --- test1.class.php --- class TEST1 { function hoge1() { // 実際に複雑な処理ですが概要として簡易化してます $aaa = 'hoge1'; // クラスの実行で単純に戻り値を返す return $aaa; } } --- test2.class.php --- class TEST2 { function hoge2() { // 実際に複雑な処理ですが概要として簡易化してます $bbb = 'hoge2'; // クラスの実行で単純に戻り値を返す return $bbb; } } --- MySmarty.class.php --- require_once 'test1.class.php'; require_once 'test2.class.php'; class MySmarty extends Smarty { function MySmarty() { //ここでclassTEST1,2の戻り値を利用しif文で分岐をしたい if ($aaa == 'hoge1') { $ccc = 'あああ'; } elee { $ccc = 'いいい'; } if ($bbb == 'hoge2') { $ddd = 'ううう'; } elee { $ddd = 'えええ'; } $this->assign('aaa', $aaa); $this->assign('bbb', $bbb); ・・・ } } このような使い方はできないものでしょうか?クラスに触れてまだ間も無く理解も深めれて いない状態で参考サイトなどを調べてみたのですがこのような使い方を書いている説明は みつかりませんでした。 思いつく方法としてはMySmartyに継承すればいいようなのですが継承は1つまでと 制限があるようでそれもできない状態です。 単純に1つのクラスにまとめて書けば済むような気もあるのですが他にも別のクラスの 戻り値を利用して分岐等をさせたく思っているのですがこの場合どうすればいいのでしょうか? もし不可能な場合(可能だけど方法的に良くない場合)の別の方法としてアドバイスを 頂けますと幸いです!宜しくお願いします!

    • 締切済み
    • PHP
  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • インターフェイス 抽象クラス

    PHP初心者です。 xampp1.7.0(最新)でアパッチなど一括ダウンロード クラスの概念は分かりましたが、インターフェイス、及び抽象クラスについて理解が追い付きません。 下記コードをご覧ください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <? abstract class AbstractClass { abstract public function test1(); } class Impl1 extends AbstractClass { public function test1() { print "こんにちは\n"; } } class Impl2 extends AbstractClass { public function test1() { print "ありがとう.\n"; } public function hoge() { print "さようなら\n"; } } $i1 = new Impl1(); $i1->test1(); $i2 = new Impl2(); $i2->test1(); ?> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 抽象クラスが上にありますが、中身がないので継承し、そのクラスの中で処理させています。抽象クラスの必然性が理解できません。まあこのコード事態がものすごく短いので、その必然性がないと思うのですが、例えばもっと長いコードになったときなどは抽象クラスは絶対使った方がいいということになるのでしょうか。 さらに全て抽象クラスであればインターフェイスを利用できるようですが、インターフェイスのメリットにつき理解が追い付きません。 どなたかご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHP5でクラスを作成しています。

    PHP5でクラスを作成しています。 コンストラクタの段階で論理エラーにしたくて、インスタンス値をnullにしたいです。 つまり直ちにプログラムを止めずに、クラスの生成(インスタンス化)を失敗させる 方法を__construct()関数内でどのように書けば良いのでしょうか? class Sample { function __construct() { // この中で処理の異常が発生! // インスタンス作成を失敗させる or インスタンス値をヌルにする。 //? //?どのように書けば?? //? } } $a = new Sample(); if ($a === null) { printf("正しくインスタンスの生成ができませんでした。"); } よろしくお願いします。

    • 締切済み
    • PHP
  • PHPの読解お願いいたします クラスについて

    独学でPHPを学んでます。 環境:XAMPPにて1.7.0でアパッチなど一括ダウンロード クラスについておおまかな概念は分かりますが、細かな点が多々わかりません。 下記コードをまずご覧ください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <html> <head> <title> </title> </head> <body> <?php $test=new Figure(3,4); print "三角形の面積は"; print $test->getarea();● print "となります"; class Figure{ protected $width; △ protected $height;△ function __construct($width,$height){ $this->width=$width; $this->height=$height; } function getarea(){ return $this->width * $this->height;●● } } </table> </body> </html> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ まず私の解釈ですが、 コンストラクターでオブジェクトが作成される $width $heightにそれぞれ、3と4が格納。 クラス内ではメンバ変数を$thisであらわす必要性があることから、$widthと$heightをそれぞれ$this->width $this->heightにする。 ●で$test->getarea()を呼んでいるので●●の部分の計算が行われ、その値を再度$test->getarea()に返す。 以上になりますが、なぜかエラーが出ます。 どこに誤りがありますでしょうか。 また●の部分 $test->getarea()ですが、これは関数呼び出し文とはまた別のものなのでしょうか。もし関数呼び出し文であるなら、print表記は必要ないとは思うのです。また関数呼び出し文は文字列ではないので、""は必要はないとの理解でよろしいでしょうか。 さらに△の二行につき、このコード上での存在意義とはなんでしょうか。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】クラスを継承した際にデータ型も継承すると

    とある有料のオンライン学習サイトをつかっています。 学習項目の流れは以下の通りです。 現在「15 型の継承について見ていこう」で躓いています。 01 オブジェクトを使ってみよう (02:56) 02 投稿に関する処理を作ろう 03 クラスでデータ型を定義しよう 04 インスタンスを作ってみよう 05 コンストラクタを使ってみよう 06 クラスを整理しておこう 07 アクセス修飾子について見ていこう 08 メソッドを介してプロパティを操作しよう 09 プロパティで型宣言をしてみよう 10 staticキーワードを使ってみよう 11 オブジェクト定数を使ってみよう 12 クラスを継承してみよう 13 子クラスで独自の実装をしていこう 14 メソッドをoverrideしてみよう 15 型の継承について見ていこう *型の継承 *型を継承するメリット この項目で記述されているソースコードは下記のとおりです。コード内のクラス、SponsoredPostは クラスPostを継承しています。よって両方のクラスともにPost型として扱えると説明があります。 ソース内のこの箇所で processPostという関数を作成し、変数$postにPost型と型付けをしています そしてforeachでPostで型付けられた$post型(クラスPostとそれを継承したクラスSponsoredPost)をひとつづつ取り出し、processPostを用いてそれぞれにshow()メソッドで表示させています。 ----------------------- <?php class Post{ protected $text; public function __construct($text){ $this->text = $text; } public function show(){ printf('%s',$this->text); } class SponsoredPost extends Post{ private $sponsor; public function __construct($text, $sponsor){ parent::__construct($text); $this->sponsor = $sponsor; } public function show(){ printf('%s by %s', $this->text, $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('iPhone','Apple'); function processPost(Post $post){ $post->show(); } foreach($posts as $post){ processPost($post); ------------- クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。「15 型の継承について見ていこう」という項目では 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 と解説してあります。 クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。私の知っているデータ型(文字列型、整数型、浮動小数点数型、論理型、配列型、オブジェクト型、リソース型、NULL)は下記の2か所だけです。 show()メソッド内の、['%s']と['%s by %s']で文字列が指定されています。 したがってこの項目で説明されている 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 とは、「クラスを継承する際にプロパティやメソッドだけでなく、データ型、ここでは(['%s']と['%s by %s'])も継承されるということが説明されているという解釈でよろしいのでしょうか? 少し混乱しています。もし私の解釈が間違っているようでしたら教えてください。 初学者です。よろしくお願いいたします。 <表示結果>

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトをprivateプロパティ($_db)に設定しているのですが,query文のところでエラーSELECT * FROM books [nativecode=1046 ** No database selected]となります。ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。なぜコンストラクタ外に出るとエラーになるのかわかりません。どなたかご教示ください。どうぞよろしくお願いします。 下記ソースです。 =====派生クラス======================= <?php $user = "dbuser"; $pass = "dbpassword"; $name = "mobilephp"; $host = "localhost"; require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== ==========メインのPHP=================================== <?php require_once("../MySmarty.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); $stt=$db->query("SELECT * FROM books");←ここでエラーになる $data=array(); while($row=$stt->fetchRow(DB_FETCHMODE_ASSOC)){ $data[]=array("isbn"=>$row['isbn'],"title"=>$row['title'], "publish"=>$row['publish'],"price"=>$row['price']); } $o_smarty->assign("data",$data); $o_smarty->display("structure.html"); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう