|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #46225 Allow for optional arguments to __toString() magic method
Submitted: 2008-10-03 15:28 UTC Modified: 2016-12-31 00:32 UTC
Avg. Score:4.0 ± 0.8
Reproduced:22 of 22 (100.0%)
Same Version:9 (40.9%)
Same OS:3 (13.6%)
From: phpbugs at sevenlight dot com Assigned:
Status: Open Package: Scripting Engine problem
PHP Version: 5.3.0alpha2 OS: OSX 10.5.5
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please — but make sure to vote on the bug!
Your email address:
Solve the problem:
45 - 27 = ?
Subscribe to this entry?

 [2008-10-03 15:28 UTC] phpbugs at sevenlight dot com
I believe it should be possible to have optional arguments to the __toString() magic method to allow for explicitly changing the behaviour of this function.  I understand why you cannot have any required arguments, but I do not see why it would not be possible to have optional arguments that would define the default behaviour.

Reproduce code:
class Test
    public function __toString($bDebug = FALSE)
        return $bDebug ? 'This is the debugging output' : 'This is the default output';

$o = new Test();
echo $o . "\n";
echo $o->__toString(TRUE) . "\n";

Expected result:
This is the default output
This is the debugging output

Actual result:
Fatal error: Method Test::__tostring() cannot take arguments in /srv/www/test/toString.php on line 3


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2010-03-12 08:31 UTC] olamedia at gmail dot com
Why not to use another function instead of modifying system function?
class Test
    public function toString($bDebug = FALSE)
        return $bDebug ? 'This is the debugging output' : 'This is the default 
    public function __toString()
        return $this->toString();
 [2015-03-14 10:15 UTC] ianbytchek at gmail dot com
Because there is already a method for that and because this is an extra call. When you are converting thousands of objects into strings this becomes noticeable. Using your example:

$iterations = 1000000;
$test       = new Test();
$this->runBenchmark('toString', function () use ($iterations, $test) {
    for ($i = 0; $i < $iterations; $i++) {
        $result = $test->toString();
$this->runBenchmark('__toString', function () use ($iterations, $test) {
    for ($i = 0; $i < $iterations; $i++) {
        $result = $test->__toString();
$this->runBenchmark('(string)', function () use ($iterations, $test) {
    for ($i = 0; $i < $iterations; $i++) {
        $result = (string) $test;

testToString(toString)      Time: 2.008s Memory: 5.50Mb
testToString(__toString)    Time: 3.875s Memory: 5.50Mb
testToString((string))      Time: 4.173s Memory: 5.50Mb

The "why not to use another function instead" is almost twice slower. While the performance implication is always debatable, it's clear that allowing magic methods, __toString in particular, to accept default arguments has a real value for people who care to write dry and performant code.
 [2016-12-31 00:32 UTC]
-Package: Feature/Change Request +Package: Scripting Engine problem
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Thu Jul 16 18:01:25 2020 UTC