Req #46225 [Opn->Wfx]: Allow for optional arguments to __toString() magic method
| From: | cmb@php.net | 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