PHP:クラスを使ってみた

そろそろ関数は慣れてきたので、「クラス」を使い慣れたいなと思い、わざわざ遠回りして、クラスを作って、使い、答えを出してみた。

最初の解答で分かったこと、

  • クラスのスコープ外にある、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つ前までの処理(文字) の合計値を維持しているところが、分かりやすいかなと。

理解度が上がってきているのが、分かる!!!