2

私はOOPを勉強していて、これが私の最初の研究プロジェクトです。

Mathクラスを作成し、addメソッドも作成しました。しかし、減算メソッドを作成しようとすると、どこで問題が発生するのかわかりません。

OOPの詳細情報を入手できる情報を教えてください。

<?php

class Math
{
    /**
     *
     * @return int  
     */
    function add()
    {
        $args = func_num_args();
        $sum = 0;
        $i = 0;

        for ( $i; $i < $args; $i++ )
        {
            is_int(func_get_arg($i)) ? $sum += func_get_arg($i) : die('use only integers, please');
        }
        return $sum;
    }

    function subtract()
    {
        $args = func_num_args();
        $sub = 0;
        $i = 0;

        while($i < $args)
        {
            $sub = func_get_arg($i);
            if (is_int(func_get_arg($i)))
            {
                is_int($sub - func_get_arg($i));
            }    
        }
        $i++;
        return $sub;
    }
}

私はこのクラスを私のindex.phpで次のように呼んでいます:

<?php
    include("Math.php");

        $c = new Math();
        $result = $c->subtract(100,10,20,45);

        echo $result;
?>
4

4 に答える 4

3

ここにはいくつかの小さな問題があります。

  1. $ iの増分はwhileループの外にあるため、ループが終了することはありません。
  2. $ subの最初の設定は、whileループの前に行う必要があります。あなたの減算関数は、最初の引数から後者の引数を減算することを意図していると思います。現在、$subはループを通過するたびにリセットされます。
  3. $ subの値は、ループ内の減算演算によって更新されることはありません。減算に基づいて、$subに新しい値を割り当てる必要があります。add()メソッドで+ =省略形を使用したのと同じように、これに-=省略形を使用できます。

実用的なソリューションは次のようになります。

$sub = func_get_arg( $i );         // At this point $i == 0

while ( $i < $args ) {             // Loop while $i is less than the number of args
    $i++;                          // Increment $i
    $operand = func_get_arg( $i ); // Name the argument for clarity

    if ( is_int( $operand )) {     // Make sure the $operand is an integer
        $sub -= $operand;          // Update $sub by subtracting $operand from it
    } else {
        // Do some error handling here...
    }
}
于 2011-04-30T14:38:09.270 に答える
1

このビデオ
「TheCleanCodeTalks-Inheritance、Polymorphism、&Testing」をご覧になることをお勧めします。

これは、OOPをよりよく理解するのに役立つ可能性があり、講演の例の1つは、作成しようとしている例と非常によく似ています。

于 2011-04-30T14:20:13.340 に答える
1

機能ラインis_int($sub - func_get_arg($i));が正しくありません。これを三項演算子として使用し、ロジックを追加するつもりだと思います。これが私の書き直しです:

public function subtract() {
   $args = func_get_args();
   $sub = array_shift($args);
   foreach ($args as $arg) {
      is_int($sub - $arg) and $sub -= $arg
         or die('use only integers please');
   }
   return $sub;
}
于 2011-04-30T14:24:29.147 に答える
0

array_reduce()およびbcsub()(または他の減算関数)を使用してこれを行うこともできます。

$sub = array_reduce(array_slice(func_get_args(), 1), 'bcsub', func_get_arg(0));
于 2011-04-30T15:05:29.960 に答える