webForumDet fria alternativet

Motsvarighet till __toString för nummer?

PHP

6 svar · 682 visningar · startad av M@rtin

Medlem sedan dec. 19992 085 inlägg
Frågan#1

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.

Några förslag?

Medlem sedan mars 20007 896 inlägg
#2

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.

Medlem sedan dec. 19992 085 inlägg
#3

Hmm, jag kör 5.2.9 så det borde vara lungt.

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.

Medlem sedan mars 20007 896 inlägg
#4

Du tänker inte riktigt rä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());
Medlem sedan mars 20041 505 inlägg
#5

Hur blir det om man använder type casting då?

echo (int) $object
Medlem sedan dec. 19992 085 inlägg
#6

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?

Medlem sedan mars 20007 896 inlägg
#7

M@rtin skrev:

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
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)