Как создать метод вычитания в классе Math? - PullRequest
2 голосов
/ 30 апреля 2011

Я изучаю ООП, и это мой первый учебный проект.

Я создал класс Math, а также создал метод add.Но когда я пытаюсь создать метод вычитания, я не знаю, где у меня проблема.

Пожалуйста, помогите и дайте мне информацию, где я могу получить более подробную информацию об ООП.

<?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 ]

3 голосов
/ 30 апреля 2011

Здесь есть несколько небольших проблем:

  1. Ваш цикл никогда не прекратится, поскольку увеличение $ i находится за пределами вашего цикла while.
  2. Установка $sub первый раз должен произойти до цикла while.Я предполагаю, что ваша функция вычитания предназначена для вычитания последних аргументов из первого аргумента.Прямо сейчас $ sub сбрасывается при каждом прохождении цикла. Значение * sub 100 *
  3. никогда не обновляется операцией вычитания в вашем цикле.Вам нужно присвоить новое значение $ 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...
    }
}
1 голос
/ 30 апреля 2011

Функциональная линия 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;
}
1 голос
/ 30 апреля 2011

Я бы порекомендовал вам посмотреть это видео
The Clean Code Talks - Наследование, полиморфизм и тестирование .

Это может помочь вам лучше понять ООП, и один из примеров в докладе очень похож на тот, который вы пытаетесь создать.

0 голосов
/ 30 апреля 2011

Вы также можете сделать это, используя array_reduce() и bcsub() (или другую функцию вычитания):

$sub = array_reduce(array_slice(func_get_args(), 1), 'bcsub', func_get_arg(0));
...