Req #81359 [Com]: assignement in function parameter
| From: | rtrtrtrtrt at dfdfdfdf dot dfd | Date: | Sun, 15 Aug 2021 12:26:33 +0000 |
| Subject: | Req #81359 [Com]: assignement in function parameter | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-235829@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=81359&edit=1
ID: 81359
Comment by: rtrtrtrtrt at dfdfdfdf dot dfd
Reported by: rh at hofercomputing dot ch
Summary: assignement in function parameter
Status: Not a bug
Type: Feature/Change Request
Package: Compile Failure
Operating System: windows
PHP Version: 8.0.9
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
because it's that way forever and you can't funnily change language behavior just because
some random expectations
what you are writing here looks like someone coming from visual basic and it's named params,
been there and learnt also the hard way that different programming languages have different behavior
the real problem with this coding style is that you asgin $x for the whole scope and not just that
function call
have fun with strtolower(trim(a($somevar=18)) overwriting $somevar for the complete following code
and in the worst case it's already used for other purposes
this is simply code smell and bad practice even if it would work and in most usecases references are
bad too with no gain (php is COW) but side-effects
-------------------
your biggest problem is that you develop code with supressed errors instead E_ALL because otherwise
you would have seen a warning for years - and yes with proper code you can even run production with
E_ALL, display_errors disabled and logging enabled to get such things fixed before they become fatal
errors
Previous Comments:
------------------------------------------------------------------------
[2021-08-15 11:23:26] rh at hofercomputing dot ch
function a(&$p){
$p++;
}
$x=18;
a($x);
Why do i have to divide in 2 statements? Immediate assignement in a function call is just an elegant
way of compact coding. And the interpreter should do exactly this: first: assign the paramter, then
call the function. I see no reason not to so!
------------------------------------------------------------------------
[2021-08-14 11:51:27] cmb@php.net
> but $x is a variable, and this was accepted in recent versions.
It was supported, but a notice/strict warning was thrown as of PHP
5.1.2, and the code didn't do what you intended[1], because the
expression
$x=18 actually evaluates to 18. As of PHP 8.0.0,
you get an Error exception instead. That is explicitly
mentioned in the migration guide[2]:
| Some "Only variables should be passed by reference" notices have
| been converted to "Argument cannot be passed by reference"
| exception.
And the manual proper states[3]:
| It is an error to pass a value as argument which is supposed to
| be passed by reference.
[1] <https://3v4l.org/Pklt2>
[2] <https://www.php.net/manual/en/migration80.incompatible.php>
[3] <https://www.php.net/manual/en/functions.arguments.php#functions.arguments.by-reference>
------------------------------------------------------------------------
[2021-08-14 11:19:34] rtrtrtrtrt at dfdfdfdf dot dfd
fixed version of your code:
$x=18;
a($x);
------------------------------------------------------------------------
[2021-08-14 09:11:49] rh at hofercomputing dot ch
Description:
------------
function a(&$p){
$p++;
}
a($x=18);
this produces "Uncaught Error: a(): Argument #1 ($p) cannot be passed by reference in "
but $x is a variable, and this was accepted in recent versions.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81359&edit=1