そろそろ関数は慣れてきたので、「クラス」を使い慣れたいなと思い、わざわざ遠回りして、クラスを作って、使い、答えを出してみた。
最初の解答で分かったこと、
クラスのスコープ外にある、foreach のなかで、
class CalSum
が元になる インスタンス を作成(インスタンス化)をしている。$calSum = new CalSum($v);
それにより、
class CalSum
にあるメソッドcalSum()
が使えるようになった。$calSum->calSum();
また、
$calSum = new CalSum($v);
と$calSum2 = new CalSum($v);
は違うインスタンスを生成していることがわかった。元になるクラス(class CalSum)
は、同じだけど。
/* ・連続する "<" の数が整数の 10 の位を表し、 それに続く連続する "/" (スラッシュ) の数が整数の 1 の位を表す ・3 ≦ (E の長さ) ≦ 100 */ $result = 0; $result2 = 0; $paizaNotation = str_split(trim(fgets(STDIN))); class CalSum { private int $amount = 0; public function __construct(private string $v) { $this->v = $v; } public function calSum():int { if ($this->v === '/') { return $this->amount += 1; } elseif ($this->v === '<') { return $this->amount += 10; } } } foreach ($paizaNotation as $v) { if ($v !== '+') { $calSum = new CalSum($v); $calSum2 = new CalSum($v); $result += $calSum->calSum(); $result2 += $calSum2->calSum() - 5; } } echo $result . ' ' . $result2; // 入力値:</</ -> 結果:22 2 $result2 = 10 - 5 + 1 - 5 + 10 - 5 + 1 - 5 = 2 これより、$calSum と $calSum2 は、別物の インスタンス であるとわかる。 ちなみに、`$result2 += $calSum->calSum();` としたら、 結果は、$result と同じ 22 が出力される。 よって、$calSum と $calSum2 では、それぞれ互いに影響を与えていないことがわかる。
$calSum = new CalSum($v);
インスタンス化をして、インスタンスメソッドcalSum()
を扱えるようにしている。
まあ、初期段階の理解と操作力を得る上では、この程度で良いだろう。
「インスタンスメソッドは、特定のインスタンスに対する操作を行います。」 とのことなので、この時の「特定のインスタンス」とは、「$calSum = new CalSum($v)」でしょう。
別解1 class CalSum { private int $amount = 0; public function calSum(string $v):int { if ($v === '/') { return $this->amount += 1; } elseif ($v === '<') { return $this->amount += 10; } } } foreach ($paizaNotation as $v) { if ($v !== '+') { $calSum = new CalSum(); $result += $calSum->calSum($v); } }
別解1 で分かりやすいなと思ったのは、$amount
の値が、維持されているということ。
foreach で 1文字ずつ $calSum = new CalSum();
によって生成された インスタンス の メソッド(calSum()
) に投げて、計算をしているが、$amount
の値が1つ前までの処理(文字) の合計値を維持しているところが、分かりやすいかなと。
理解度が上がってきているのが、分かる!!!