アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP初心者です。

まだ僕が思いつようなものはすべてfunctionで事足りてしまうので
classで定義する必要のあるものがよくわからずにいます。

こういう事が必要なら間違いなくclassというのは
どういう時でしょうか?

A 回答 (2件)

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

    • good
    • 0

手っ取り早くオブジェクト指向のメリットを理解するのであれば「プロパティ」から入るといいでしょうね。

言葉で書いていても伝わりにくいので具体例で示します。

[基本情報] 田中太郎(男)
[詳細情報] 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;


さて、こうすると一見スッキリしたように感じるかもしれません。しかし、これには大きな問題点があります。「他の関数と使う変数名が被っていたらどうするのか」ということです。グローバル変数は全ての領域で共有される変数なので、プログラムの規模が大きくなってくると訳のわからないことになります。それに対し、「これだけの範囲でなら共有させてもいい」と限定的な提供を行える優秀な役割を持つのが「プロパティ」なのです。

他にもメリットはたくさんありますが、大雑把に取っつきやすい点から述べるとこんな感じでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!