Finns det någon motsvarighet till __toString för heltal och andra nummer?
Har letat igenom php.net utan att hitta något men det måste finnas något för om man använder sprintf() för att kräva ett tal så säger den att den inte kan konvertera. Ex:
class StringObject {
private $str;
public function __construct($str){
$this->str = $str;
}
public function __toString(){
return $this->str;
}
}
class NumberObject {
private $nr;
public function __construct($nr){
$this->nr = $nr;
}
public function __toString(){
return $this->nr;
}
}
$str = new StringObject("test");
$nr = new NumberObject(123);
echo sprintf("en sträng: %s, och ett heltal: %d",$str,$nr->__toString()); //funkar
echo sprintf("en sträng: %s, och ett heltal: %d",$str,$nr); //funkar inte
Den andra varianten ger "Object of class NumberObject could not be converted to int". Att första varianten funkar bevisar ju att den inte använder __toString först och sedan försöker konvertera utan anropar någon annan metod hos objektet.
Om du använder en äldre version än 5.2.0 så anropas inte __toString() när du försöker formatera en utström med sprintf() eller printf(). Det fungerar bara med echo eller print.
Efter 5.2.0 kan man använda sprintf() och printf() utan att explicit anropa __toString(), men den lyssnar ju självklart på %s (det är ju en sträng, inget heltal! __toString) och inte på %d.
Hur menar du med lyssnar på %s? Det bästa (näst efter __toInt) hade ju varit om php körde __toString automatiskt och sedan körde intval på det efteråt.
Om vi bortser från sprintf(), finns det något sätt att få intval att fungera för ett objekt? Kan man overrida de inbyggda funktionerna på nåt sätt?
strval() fungerar ju för object, förstår inte varför inte intval() funkar på samma sätt.
PHP är inget hårt typat språk, variabler kan mixas, returmetoder har inga signaturer, osv. Du får med andra ord konvertera själv, då ingen autoboxing finns.
Ett par lösningar:
class Number {
private $value;
...
public function __toString() { return strval ($this->value); }
}
$obj = new Number(5);
printf ("Talet är: %s", $obj);
-----
class Number {
...
public function getInt() { return intval ($this->value); }
}
$obj = new Number(5);
printf ("Ett tal: %d", $obj->getInt());
Troxy: Ja castar man får man exakt samma fel, jag tror (int)$object är exakt samma sak som att köra intval($obj).
SPiN: Hehe ja jag börjar inse att detta inte är möjligt i php. Men visst skulle inte en magisk __toInt()-metod inte vara något problem att införa (om de bara orkade) trots att det inte är hårt typat?
SPiN: Hehe ja jag börjar inse att detta inte är möjligt i php. Men visst skulle inte en magisk __toInt()-metod inte vara något problem att införa (om de bara orkade) trots att det inte är hårt typat?
Nej, det skulle nog vara ett ganska banalt problem att lösa i såsen. Däremot ser jag ingen nytta till det - i så fall borde det finnas __toLong(), __toFloat(), o.s.v. vilket bara sölar ner koden. __toString() finns för att man ska kunna formatera objektets egenskaper som oftast används vid skrivningar. Vid formatering av objektens värden ska programmeraren sköta det själv. Det finns motsvarigheter till __toString() i de flesta oo-språk, men jag kommer inte på något språk där objekt automagiskt har metoden __toInt(). Det finns inget underlag för det - formatering ska helt enkelt skötas av programmeraren, inte klass-bibliotek.
253 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e