Строгое сравнение в PHP - PullRequest
       50

Строгое сравнение в PHP

0 голосов
/ 30 января 2012

Мне нужно написать класс Player в php, который работает с функцией, которую мне запрещено изменять.Я должен написать этот класс таким образом, чтобы эта функция возвращала максимальное значение.Я могу использовать только целые числа от 1 до 10.Я только скопировал проблемную часть здесь:

function CalcPlayerPoints($Player) {

$Points = 0;

    foreach($Player as $key => $Value) {

    switch ($key) {
    case "profyears":
        if($Value===true) // this should be true
        $Points+=($Value*5); // this should take tha value I give in the class construct
        break;
    case "gentleman":
        if($Value===true) 
        $Points+=10;                
        break;
    }
   }
return $Points; // that should be maximized
}

Поскольку я не могу изменить сравнение ===, я не могу инициализировать атрибут profyears.Если я инициализирую с 10, то это не входит, если заявление ...

public function __construct() {
   $this->gentleman = true;
   $this->profyears = 10;  
}

Ответы [ 3 ]

0 голосов
/ 30 января 2012

Эта функция не работает так, как задумал создатель.Переменная $Value оценивается как строго булева, но затем ей выполняются математические операции.Невозможно решить эту проблему, не изменив исходную функцию.

Также, похоже, отсутствует закрывающая скобка.

Функция называется как:

function index()
{
   var_dump( $this->CalcPlayerPoints(array( 'profyears' => 10 )) );
}

function CalcPlayerPoints($Player) {

  $Points = 0;

     foreach($Player as $key => $Value) {

        switch ($key) {
            case "profyears":
                if($Value===true) // this should be true
                $Points+=($Value*5); // this should take tha value I give in the class construct
                break;
            case "gentleman":
                if($Value===true) 
                $Points+=10;                
                break;

        }
     }
return $Points; // that should be maximized
}

будет отображать int 0 каждый раз, независимо от того, какое целое значение вы указали.Если исходная функция может быть изменена для исключения строгого сравнения, например:

function index()
{
   var_dump( $this->CalcPlayerPoints(array( 'profyears' => 10 )) );
}

function CalcPlayerPoints($Player) {

  $Points = 0;

     foreach($Player as $key => $Value) {

        switch ($key) {
            case "profyears":
                if($Value==true) // this should be true
                $Points+=($Value*5); // this should take tha value I give in the class construct
                break;
            case "gentleman":
                if($Value==true) 
                $Points+=10;                
                break;

        }
     }
return $Points; // that should be maximized
}

, функция выдаст ожидаемые результаты: int 50

0 голосов
/ 30 января 2012

Кажется, что функция CalcPlayerPoints имеет ошибку, так как имеет смысл сделать это:

if ($Value === true)
    $Points += $Value * 5;

Т.е. "ИСТИНА 5" ничего не значит.

0 голосов
/ 30 января 2012

Единственный параметр, который допускает эта функция, это то, что profyears является логическим значением, так что true или false. Другие варианты невозможны.

Таким образом, класс обрабатывает прошлые годы не в виде количества лет, а в зависимости от того, существуют ли годы или нет. Таким образом, единственное правильное значение в __construct - это true или false. Это может быть странное преобразование имен. Это имело бы смысл, если бы он назвал: hasProfYears, например.

некоторые примеры:
Джентльмен с годами дает: 15 баллов.
Не джентльмен с прошлым годом дает 5 баллов.
Джентльмен без профитов дает 10 баллов.
Негент джентльмен без профайра дает 0 баллов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...