2014-04-18 2 views
5

Ich erstelle ein Objekt (nennen wir es Decimal) in PHP, das die bcmath-Funktionalität umschließt und einige neue Funktionen hinzufügt.Warum kann ich kein Objekt in PHP in ein Float-Objekt umwandeln?

Die meisten der tatsächlichen Arbeit tritt in statischen Funktionen wie add(...) und divide(...). Die einzigen Instanz-Methoden sind Accessor-Methoden (horay for immutability!) Und die __toString() magische Methode.

__toString funktioniert in den meisten Fällen, aber es gibt die seltsame Instanz, dass ich möchte, dass mein Typ in ein float/double/real umgewandelt wird. Ich könnte das mit einer Instanzmethode machen oder indem ich eine (float)(string) Umwandlung mache, aber es scheint logisch, dass es eine ähnliche magische Methode dafür geben sollte, wie eine __toFloat. Leider scheint es nicht so zu sein. Ich kann keine Dokumentation zu diesem Zweck finden. Ich versuchte es einfach als __toFloat oder __toDouble, in der Hoffnung, dass es vielleicht nur eine undokumentierte Funktionalität war, ohne Erfolg.

Ich wäre sogar glücklich, wenn floatval() automatisch versucht, sein Argument auf eine Zeichenfolge zu werfen, aber es tut es nicht. Es wirft einen Fehler Notice: Object of class Decimal could not be converted to double.

Gibt es einen besseren Weg oder eine Arbeit dafür?

+0

Interessante Frage, aber können Sie skizzieren, warum eine Instanzmethode nicht angemessen wäre? – halfer

+0

Ich sage nicht, dass es eine unangemessene Lösung ist. Ich denke nur, dass es merkwürdig ist, dass es nur eine magische Methode geben würde, um mit String zu stringeln und nicht alle Grundtypen. Es führt dazu, dass unterschiedliche Schnittstellen erforderlich sind, um im Wesentlichen den gleichen Effekt zu erzielen. – DynamiteReed

+4

Wenn Sie Casts oder Operatoren überladen möchten, müssen Sie eine PHP-Erweiterung schreiben. Diese Funktionalität wird dem Benutzerlandcode nicht zur Verfügung gestellt. – NikiC

Antwort

-2

Haben Sie versucht, in Ihrer Umwandlung die folgenden unten zu verwenden?

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

Haben Sie sogar die Frage gelesen? – Hirnhamster

1

Im Allgemeinen ist die toString() Methode liefert eine String-Darstellung eines Objekts, um es für die Anzeige geeignet zu machen - man denke an das Debuggen, Fehlermeldungen usw.

Um den Wert eines Objekts zurückgeben können Sie einfach machen eine getValue() Methode.

Auch ich würde empfehlen, keine statischen Methoden zu verwenden. Versuchen Sie dies:

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

$numberOne->add($numberTwo); 

$sum = $numberOne->getValue();// 15 
Verwandte Themen