---
title: "Motsvarighet till __toString för nummer?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/178619-motsvarighet-till-tostring-för-nummer"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "M@rtin"
published: "2009-05-20T09:40:34.000Z"
updated: "2009-05-20T12:12:28.000Z"
replies: 6
views: 699
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/178619-motsvarighet-till-tostring-för-nummer"
---

# Motsvarighet till __toString för nummer?

## #1 — M@rtin, 2009-05-20T09:40Z

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?

Permalänk: https://www.webforum.nu/p/178619

## #2 — SPiN, 2009-05-20T10:31Z

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! \__to**String**) och inte på %d.

Permalänk: https://www.webforum.nu/p/2185327

## #3 — M@rtin, 2009-05-20T10:43Z

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.

Permalänk: https://www.webforum.nu/p/2185328

## #4 — SPiN, 2009-05-20T11:03Z

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());
```

Permalänk: https://www.webforum.nu/p/2185331

## #5 — Troxy, 2009-05-20T11:08Z

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

```
echo (int) $object
```

Permalänk: https://www.webforum.nu/p/2185332

## #6 — M@rtin, 2009-05-20T11:27Z

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?

Permalänk: https://www.webforum.nu/p/2185336

## #7 — SPiN, 2009-05-20T12:12Z

> **[M@rtin skrev:](https://www.webforum.nu/p/1468404)**
>
> 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.

Permalänk: https://www.webforum.nu/p/2185337

---

Tråden på webben: https://www.webforum.nu/amne/php/178619-motsvarighet-till-tostring-för-nummer
