|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-10-03 15:28 UTC] phpbugs at sevenlight dot com
Description:
------------
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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 17:00:01 2025 UTC |
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 output'; } public function __toString() { return $this->toString(); } }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.