La digitazione libera non viene applicata agli oggetti

1

Ho poca esperienza con le classi e gli oggetti. Lavoro in un linguaggio generico, PHP.

Stavo lavorando con un oggetto SimpleXML e ho incontrato un problema in cui stavo cercando di fare matematica con un elemento di quell'oggetto come $results->ProductDetail->{'Net'.$i};

Se faccio eco a quel valore, otterrei 0.53 ma quando ho provato a fare matematica con esso, è stato convertito in 0

C'è una ragione per cui un linguaggio non tipizzato non lo riconoscerebbe come float e lo gestisse come tale? Perché "echo" gestirlo come una stringa ma il calcolo matematico non riesce a convertirlo?

Esempio:

$xml='<?xml version="1.0" encoding="UTF-8" ?>';
$xml.='<Test>
  <Item>
    <Price>0.53</Price>
  </Item>
</Test>';

$result=simplexml_load_string($xml);

var_dump($result->Item->Price);
echo '<br>';
echo $result->Item->Price;
echo '<br>';
echo 1+$result->Item->Price;
echo '<br>';
echo 1+(float)$result->Item->Price;

Output:

object(SimpleXMLElement)#4 (1) { [0]=> string(4) "0.53" } 
0.53
1
1.53

Versione senza oggetto:

$no='.53';
echo 1+$no;

Output:

1.53

================================

Nota a margine: PHP strpos() non converte correttamente un ago intero $i in una stringa.

$x=101; $i=1; if(strpos($x,"$i")===FALSE){echo $i." missing";}

e

$x=101; $i=1; if(strpos($x,$i)===FALSE){echo $i." missing";}

dare risultati diversi. Non voglio diventare un php hater, ma sto iniziando a perdere quella sensazione d'amore.

    
posta TecBrat 29.10.2013 - 17:53
fonte

1 risposta

2
echo $result->Item->Price;

Questo produrrà una variabile stringa.

echo 1+$result->Item->Price;

Questo convertirà la stringa "0.53" in numero intero. PHP non arrotonda. Quindi diventa 0 e 1+0=1 .

echo 1+(float)$result->Item->Price;

Questo funziona perché stai dicendo a PHP di trasmettere su un float. PHP convertirà automaticamente 1 da un int a float.

In alternativa, puoi anche farlo.

echo 1.0+$result->Item->Price;

Questo dirà a PHP di convertire anche la stringa in un float.

Questo fa parte del tipo di giocoleria di PHP.

link

I tuoi problemi sono specifici della conversione del tipo di stringa.

link

Una delle ragioni per cui PHP può fare queste cose è perché l'operatore + è sempre matematico. Dove in altre lingue esegue concatenazioni di stringhe. Poiché + esegue sempre ulteriori tentativi PHP per convertire tipi di stringhe in tipi numerici per onorare l'operazione + .

AGGIORNAMENTO: problemi specifici di SimpleXMLElement

C'è un bug noto in PHP quando si usa l'estensione SimpleXML. PHP eseguirà il cast delle stringhe che rappresentano valori float su int invece che su float. La giocoleria di tipo automatico non funziona correttamente.

Ecco una segnalazione di bug relativa al problema: link

Per ora ti consiglio di trasmettere a (float) ogni volta che usi SimpleXML e ti aspetti un valore float. Questo non dovrebbe rompere nulla quando la correzione viene eliminata in futuro.

    
risposta data 05.11.2013 - 23:00
fonte

Leggi altre domande sui tag