Req #46225 [Opn->Wfx]: Allow for optional arguments to __toString() magic method

From: Date: Fri, 27 Aug 2021 13:44:48 +0000
Subject: Req #46225 [Opn->Wfx]: Allow for optional arguments to __toString() magic method
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-236120@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=46225&edit=1 ID: 46225 Updated by: cmb@php.net Reported by: phpbugs at sevenlight dot com Summary: Allow for optional arguments to __toString() magic method -Status: Open +Status: Wont fix Type: Feature/Change Request Package: Scripting Engine problem Operating System: OSX 10.5.5 PHP Version: 5.3.0alpha2 -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: This feature request doesn't make any sense to me. Users are not supposed to call magic methods explicitly (except maybe to override them and call the parent's method). Thus I'm closing as WONTFIX. If anybody still wants to see optional arguments for __toString(), please pursue the RFC process[1]. [1] <https://wiki.php.net/rfc/howto> Previous Comments: ------------------------------------------------------------------------ [2015-03-14 10:15:23] 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. ------------------------------------------------------------------------ [2010-03-12 08:31:43] 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 output'; } public function __toString() { return $this->toString(); } } ------------------------------------------------------------------------ [2008-10-03 15:28:30] 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 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=46225&edit=1

« previous php.bugs (#236120) next »