__toString() en Exceptions
Joakim Broden
21/03/2013 08:42:05Ik vraag met het volgende af, weet iemand toevallig waarom je geen exceptions mag gooien in de __toString() method?
PHP hulp
28/11/2024 06:50:14Reshad F
21/03/2013 09:00:06volgens http://devzone.zend.com/930/zend-weekly-summaries-issue-336/ dit artikeltje kan het inderdaad niet omdat bij een toString methode het onzeker is of het goed wordt afgehandeld. Wat je wel kan doen is trigger_error() gebruiken
Joakim Broden
21/03/2013 09:33:45Stel ik heb de volgende class:
En doe dan het volgende:
In mijn gedachte zou dat gewoon moeten kunnen, dus snap niet waarom dat niet mag :/
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class InputText {
protected $attributes = array(
'type' => 'text',
'name' => 'textInput'
);
public function __toString() {
if (!isset($this->attributes['name'])) {
throw new Exception('Name attribute does not exists');
} else {
return sprintf('<input type="%s" name="%s" />', $this->attributes['type'], $this->attributes['name']);
}
}
}
?>
class InputText {
protected $attributes = array(
'type' => 'text',
'name' => 'textInput'
);
public function __toString() {
if (!isset($this->attributes['name'])) {
throw new Exception('Name attribute does not exists');
} else {
return sprintf('<input type="%s" name="%s" />', $this->attributes['type'], $this->attributes['name']);
}
}
}
?>
En doe dan het volgende:
Code (php)
In mijn gedachte zou dat gewoon moeten kunnen, dus snap niet waarom dat niet mag :/
Voor die vrijheid is __toString() te streng geïmplementeerd: __toString() MOET een string retourneren, anders krijg je een fatal error en die mag je niet afhandelen met een exception. Of anders gezegd: __toString() MOET een object converteren in een string en dus niet een nieuw object, zoals een Exception.
Wat je ook zou kunnen zeggen, is dat __toString() zelf al een error handler is voor het afvangen van een catchable fatal error van dit type:
Wat je ook zou kunnen zeggen, is dat __toString() zelf al een error handler is voor het afvangen van een catchable fatal error van dit type:
Code (php)
1
2
3
4
2
3
4
<?php
$db = new Database(); // $db is een object
echo $db; // Catchable fatal error: Object of class Database could not be converted to string
?>
$db = new Database(); // $db is een object
echo $db; // Catchable fatal error: Object of class Database could not be converted to string
?>