2014-04-18 7 views
5

Sto creando un oggetto (chiamiamolo Decimal) in PHP che avvolge la funzionalità bcmath e aggiunge alcune nuove funzionalità.Perché non posso lanciare un oggetto su un float in PHP?

La maggior parte del lavoro effettivo si verifica in funzioni statiche come add(...) e divide(...). Gli unici metodi di istanza sono i metodi accessor (hooray per immutability!) E il metodo magico __toString().

__toString funziona per la maggior parte dei casi, ma c'è l'istanza dispari che voglio il mio tipo cast in un float/double/real. Potrei farlo con un metodo di istanza o facendo un cast (float)(string), ma sembra logico che ci dovrebbe essere un metodo magico simile per fare questo, come un __toFloat. Sfortunatamente, non sembra che ci sia. Non riesco a trovare alcuna documentazione in tal senso. Ho provato a farlo come __toFloat o __toDouble, sperando che fosse solo una funzionalità non documentata, senza risultato.

Sarei persino felice se lo floatval() tentasse automaticamente di trasmettere il suo argomento a una stringa, ma non lo fa. Genera un errore Notice: Object of class Decimal could not be converted to double.

C'è un modo migliore o una soluzione per questo?

+0

Domanda interessante, ma puoi delineare perché un metodo di istanza non sarebbe appropriato? – halfer

+0

Non sto dicendo che sia una soluzione inappropriata. Penso solo che sia strano che ci sia solo un metodo magico per gestire il cast in stringa e non tutti i tipi di base. Porta a richiedere interfacce diverse per ottenere sostanzialmente lo stesso effetto. – DynamiteReed

+4

Se vuoi sovraccaricare cast o operatori, dovrai scrivere un'estensione PHP. Questa funzionalità non è fornita nel codice userland. – NikiC

risposta

-2

Hai provato a utilizzare la conversione come segue?

<?php 
$str = <<<EOD 
Example of string 
spanning multiple lines 
using heredoc syntax. 
EOD; 


class foo 
{ 
var $foo; 
var $bar; 

function foo() 
{ 
    $this->foo = 'Foo'; 
    $this->bar = array('Bar1', 'Bar2', 'Bar3'); 
} 
} 

$foo = new foo(); 
$name = 'MyName'; 

echo <<<EOT 
My name is "$name". I am printing some $foo->foo. 
Now, I am printing some {$foo->bar[1]}. 
This should print a capital 'A': \x41 
EOT; 
?> 
+2

Hai letto la domanda? – Hirnhamster

1

In generale, il metodo toString() restituisce una rappresentazione di stringa di un oggetto per renderlo adatto per la visualizzazione - pensare di debug, i messaggi di errore, ecc

per restituire il valore di un oggetto si può semplicemente fare un metodo getValue().

Inoltre, consiglierei di NON utilizzare metodi statici. Prova:

$numberOne = new Number(5); 
$numberTwo = new Number(10); 

$numberOne->add($numberTwo); 

$sum = $numberOne->getValue();// 15 
Problemi correlati