__toString() en Exceptions

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joakim Broden

Joakim Broden

21/03/2013 08:42:05
Quote Anchor link
Ik vraag met het volgende af, weet iemand toevallig waarom je geen exceptions mag gooien in de __toString() method?
 
PHP hulp

PHP hulp

28/11/2024 06:50:14
 
Reshad F

Reshad F

21/03/2013 09:00:06
Quote Anchor link
volgens 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

Joakim Broden

21/03/2013 09:33:45
Quote Anchor link
Stel ik heb de volgende class:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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']);
            }
        }
    }

?>


En doe dan het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
    $input
= new InputText();

    try {
        echo $input;
    }
catch($e) {
        echo $e->getMessage();
    }

?>


In mijn gedachte zou dat gewoon moeten kunnen, dus snap niet waarom dat niet mag :/
 
Ward van der Put
Moderator

Ward van der Put

21/03/2013 10:05:59
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.