• ベストアンサー

functionとclassの使い分け

PHP初心者です。 まだ僕が思いつようなものはすべてfunctionで事足りてしまうので classで定義する必要のあるものがよくわからずにいます。 こういう事が必要なら間違いなくclassというのは どういう時でしょうか?

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

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

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

手っ取り早くオブジェクト指向のメリットを理解するのであれば「プロパティ」から入るといいでしょうね。言葉で書いていても伝わりにくいので具体例で示します。 [基本情報] 田中太郎(男) [詳細情報] 1年2組 田中太郎(男) [基本情報] 山田花子(女) [詳細情報] 1年3組 山田花子(女) と表示することを目標とします。 【クラス・メソッドでの例】 class Student {    private $name;  private $grade;  private $class;  private $gender;    public function __construct($name, $grade, $class, $gender) {   $this->name = $name;   $this->grade = $grade;   $this->class = $class;   $this->gender = $gender;  }    public function getInfo() {   return $this->name . '(' . $this->gender . ')';  }    public function getDetail() {   return $this->grade . '年' . $this->class . '組 ' . $this->getInfo();  }   } $st = new Student('田中太郎', 1, 2, '男'); echo '[基本情報] ' . $st->getInfo() . PHP_EOL; echo '[詳細情報] ' . $st->getDetail() . PHP_EOL; $st = new Student('山田花子', 1, 3, '女'); echo '[基本情報] ' . $st->getInfo() . PHP_EOL; echo '[詳細情報] ' . $st->getDetail() . PHP_EOL; 【関数での例】 function format_student_info($name, $gender) {  return $name . '(' . $gender . ')'; } function format_student_detail($name, $grade, $class, $gender) {  return $grade . '年' . $class . '組' . format_student_info($name, $gender); } echo '[基本情報] ' . format_student_info('田中太郎', '男') . PHP_EOL; echo '[詳細情報] ' . format_student_detail('田中太郎', 1, 2, '男') . PHP_EOL; echo '[基本情報] ' . format_student_info('山田花子', '女') . PHP_EOL; echo '[詳細情報] ' . format_student_detail('山田花子', 1, 3, '女') . PHP_EOL; さて、あなたはこれを見てどっちが美しいと感じますか?単純なコード量で比較すれば関数で書いた方がスッキリしているように思えますが、「再利用性(何回も使うことを考慮)」という観点から見れば…言うまでもないですよね。クラス・メソッドで書けば限定した複数のメソッド間で「プロパティ」を共有させることが出来るので、何回も引数を渡したりする必要が省けます。これがオブジェクト指向最大の強みの一つです。また、関数名よりもメソッド名のほうが(所属するクラスも含めての分類になるので)短く書ける傾向にあると思います。 関数を用いる方法でも、強引に引数を渡す必要を無くしてしまう方法はあります。「グローバル変数」の利用です。 【関数での例(グローバル変数)】 function format_student_info() {  global $name;  global $gender;  return $name . '(' . $gender . ')'; } function format_student_detail() {  global $grade;  global $class;  global $name;  global $gender;  return $grade . '年' . $class . '組' . format_student_info($name, $gender); } $name = '田中太郎'; $grade = 1; $class = 2; $gender = '男'; echo '[基本情報] ' . format_student_info() . PHP_EOL; echo '[詳細情報] ' . format_student_detail() . PHP_EOL; $name = '山田花子'; $grade = 1; $class = 3; $gender = '女'; echo '[基本情報] ' . format_student_info() . PHP_EOL; echo '[詳細情報] ' . format_student_detail() . PHP_EOL; さて、こうすると一見スッキリしたように感じるかもしれません。しかし、これには大きな問題点があります。「他の関数と使う変数名が被っていたらどうするのか」ということです。グローバル変数は全ての領域で共有される変数なので、プログラムの規模が大きくなってくると訳のわからないことになります。それに対し、「これだけの範囲でなら共有させてもいい」と限定的な提供を行える優秀な役割を持つのが「プロパティ」なのです。 他にもメリットはたくさんありますが、大雑把に取っつきやすい点から述べるとこんな感じでしょうか。

その他の回答 (1)

  • ahoo_ok
  • ベストアンサー率31% (30/95)
回答No.1

とりあえずデザインパターンについて勉強すれば答えは出る。

関連するQ&A

  • PHP 5.2.5で class内のfunctionから

    <?php class other_class{ static $short = 5; function shortcut(){ $this -> short = "ららら"; } }//class print other_class::$short;//ららら になるように ?> PHP 5.2.5で $this -> short を使おうとすると Fatal error: Using $this when not in object context in C:\***\***\***.php on line 7 エラーが出ます。 $short に function shortcut() から "ららら" を入れるにはどう書けばいいでしょうか? よろしくお願いします。m(_ _)m

    • ベストアンサー
    • PHP
  • PHPでのClass使用について

    これまで社内で1人でPHPコーディングを担当していたので、複数人での開発を経験した事がなく、Classを使用した事がありません。 PHPでもClassを使用するのが主流かと思うのですが、Classの有用性が今ひとつ理解出来ずにいます。 開発用のライブラリは用意しているのですが、「接続用function」などfunctionのみを使用してコードを纏めています。 現状このやり方で全く困っていないのですが、Classを使用する事でどんなメリットがあるのでしょうか? 使い慣れていないせいなのでしょうが、Class化する事で機能を纏め過ぎてより面倒臭くなっているような気がします…。

    • ベストアンサー
    • PHP
  • classの使い方について

    とある書籍にて require_once "MDB2.php"; require_once "Smarty.class.php"; class BBS extends Smarty{  private $_db;  public function __construct(){   $this->Smarty();   $this->template_dir = "{$dir}/themes";   $this->compile_dir = "{$dir}/templates_c";   $this->config_dir = "{$dir}/config";   $this->config_load("app.conf",basename($_SERVER["SCRIPT_NAME"],".php"));   $this->security=TRUE;   $this->secure_dir=array("{$dir}/image");   $this->_db=MDB2::connect($this->get_config_vars("db_string"));  }  public function __destruct(){   if(!PEAR::isError($this->_db)) $this->_db->disconnect();  }  public function get_db(){ return $this->_db; } } $Bbs = new BBS(); $db = $Bbs->get_db(); $db->setCharset('ujis'); と、あるのですがサーバーがPHP4の為、それに適用させたいのですがどのようにすればいいのでしょうか。ローカルサーバーはPHP5なので問題ないのですが。 class BBS extends Smarty{  var $_db;  function BBS(){   $this->Smarty();   $this->template_dir = "{$dir}/themes";    ~省略~  }  function shutdown(){   if(!PEAR::isError($this->_db)) $this->_db->disconnect();  }  register_shutdown_function("shutdown");  function get_db(){ return $this->_db; } } 上記で試してみたのですが Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in D:\aki\public_html\1\class\smarty.php on line 33 とエラーが出てしまいデストラクタがうまくできない状態です。 PHP4のクラスについて調べてみたが応用できそうなのが見つからなくて・・・ ご教授を願えたらと思います。

    • 締切済み
    • PHP
  • あのう function d_system の定義についてです。

    こんばんわ。 function date($DB ....)と言う感じに使い 呼び出されたいくつかの情報をまとめてfunction dateへ受け渡しを行いログファイルに書き込みを行ったりDBへログデータをinsertしたりと言う事をしてました。 そうした所、Cannot redeclare date() (previous ....) と言う function date 存在しませんみたいなエラーが出ます。 そのファイル名は DB.php と言うファイルなんですけども仮に同じファイルの中に同じ名前の  function date($DB....)と言う定義しているとどちらかエラーになりますか。 実は function date(...) と言うファンクションの関数を同じファイル内に(DB.php)二つ使っております。 片方のものは動いていますけどももう一つのfunction date(...) は動いてくれません。 そのせいかなとも思い今度は名前を変えてみたところ、まったく動かなくなりました。 色々調べたりしました。iniファイルが関係している等あるサイトで見かけたのですけどももしかしたら function date と言う定義づけをする場合に何かしら別なファイルで何かを記載する必要があるのでしょうか。。。 又は同じファイル内に同じファンクション名をするには何かしらの細工しなければなりませんか。 お時間ございましたらぜひともご教示お願いいたします。

    • ベストアンサー
    • PHP
  • phpで関数を定義するfunctionは、なんとい

    phpで関数を定義するfunctionは、なんという物なんですか?

    • ベストアンサー
    • PHP
  • actionscriptのfunction関数について

    現在Flashの勉強をしている者です。 超初心者丸出しの質問なのですが調べても納得いく回答にめぐりあわなかったのでここで質問させていただきます(前回もPHPについて質問したら素晴らしい回答があったので!!) Function関数なのですが function 半角英字で任意の文字 () {  以下実行文 } でユーザー定義関数が作られるのはわかったのですが、 本を読みながら勉強をしていてわからないのが this.onRollOver = function () { roll = true; this.nextFrame(); }; という記述で、『マウスがムービークリップ上にあるかの判定処理』という説明がされているのですが恥ずかしながらよくわかりません。 ユーザー定義関数のFunctionと上記のものでは別物なのでしょうか? ちょっと曖昧な質問で申し訳ないのですが どなたが是非よろしくお願いします。。。

    • ベストアンサー
    • Flash
  • classとIDの使い方?何が違うんでしょうか?

    こんにちは、よく<div class"○○○○">とか<div ID=""○○○>などと記述がしてあるのですが、classとIDの違いは何でしょうか? 私はよくわからないので、全部classで書いていたのですが、やはり何かが違うからclassとIDが存在するのだろうと思ったら、気になってしょうがありません。 ちなみに全部classで書いている私は駄目なのでしょうか? また、classとIDの決定的な違いはなんでしょうか?使用方法や正しい使い方などが存在するのでしょうか? とりあえず現在、全てclassで定義しているのですが、特にこれといった問題は内容に思えます。 詳しい方がおられましたら、宜しくお願いいたします。

    • ベストアンサー
    • HTML
  • classの再定義エラーについて

    C++初心者で初歩的な質問ですがよろしくお願いします。 【内容】  <test.h>  class testを定義  <test2.h>  class testを継承したclass test2を定義  <test3.h>  class testを継承したclass test3を定義  <test4.h>  class test2とclass test3で作成したインスタンスをメンバに持つclass test4を定義 【問題】  test2.hとtest3.hではclass testを継承するために#include "test.h"をしています。そして、test4.hではclass test2とclass test3を使うため#include "test2.h"、#include "test3.h"をしているのでredefinition of 'class test'というエラーが発生します。  このようなエラーを発生させずに上記の内容のものを実現させることは出来るのでしょうか?  ちなみにOSはTurboLinux8でコンパイラはg++です。よろしくお願いします。

  • functionの()の中の&とは?

    phpのfunctionに function _sample(&$value){ } といった$の前に&が付いている時がありますが、これは何なのでしょうか?

    • ベストアンサー
    • PHP
  • classでエラー

    IIS5+PHP4.4.0+MSDEで、開発しているのですが、 テスト環境では、動いていたソースを、本番環境に動かしたら、 Notice: Undefined variable: m_strDBName in C:\xxx.php on line 110 Fatal error: Call to undefined function: mssql_pconnect() in C:\xxx.php on line 119 というエラーが出てしまいました。 もちろん、テスト環境と、本番環境は、同じ環境で、 PHP.iniもコピーしました。(インストールパスも同じです) エラー部分は、 require_once("xxx.php"); で、呼び出し、 class clsXXX { var $m_strDBName; function clsXXX() { $this->$m_strDBName = "mmdb"; return; } } としています。 どうすれば、解決できるでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう