/ Comparação Estrita em PHP - php, comparison, integer, boolean, strict

Comparação estrita em PHP - php, comparação, inteiro, booleano, estrito

Eu preciso escrever uma classe Player em php que funcionacom uma função que não tenho permissão para alterar. Eu tenho que escrever essa classe de uma maneira que esta função retornará o valor máximo. Eu só posso usar os inteiros entre 1-10. Eu copiei apenas a parte problemática aqui:

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
}

Como não consigo alterar a comparação ===, não consigo inicializar o atributo profyears. Se eu inicializar com 10, então ele não entra se declaração ...

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

Respostas:

0 para resposta № 1

A única opção que esta função permite é que os profyears sejam booleanos, verdadeiros ou falsos. Nenhuma outra opção é possível.

Então a classe lida com profyears não como uma quantiade anos, mas como se há profyears ou não. Então o único valor correto em você __construct é verdadeiro ou falso. Esta pode ser uma estranha conversão de nomenclatura. Faria sentido se nomeasse: hasProfYears por exemplo.

alguns exemplos:
Um cavalheiro com profyears dá: 15 pontos.
Um não-cavalheiro com profyears dá 5 pontos.
Um cavalheiro sem profyears dá 10 pontos.
Um não-cavalheiro sem profyears dá 0 pontos.


0 para resposta № 2

Parece que a função CalcPlayerPoints tem um bug, pois faz sentido fazer isso:

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

Ou seja, "TRUE times 5" não significa nada.


0 para resposta № 3

Esta função não funciona como o criador pretendia. o $Value variável está sendo avaliada como estritamente booleana, mas depois tem operações matemáticas pré-formadas para ela. Não há como resolver esse problema sem modificar a função original.

Além disso, parece haver um colchete de fechamento ausente.

A função chamada como é:

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
}

Exibirá int 0 toda vez, não importa o valor inteiro que você forneça. Se a função original pode ser modificada para eliminar a comparação estrita como:

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
}

a função retornaria os resultados esperados: int 50