Req #81359 [Com]: assignement in function parameter
| From: | rtrtrtrtrt at dfdfdfdf dot dfd | Date: | Mon, 16 Aug 2021 09:20:37 +0000 |
| Subject: | Req #81359 [Com]: assignement in function parameter | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-235841@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:
> my wish is let it be "a($x=18);"
a programming language with a decades old history and where compatibiliy matters isn't a
wishlist - my wish would be that such bad code simply ends in a parse error
both won't happen
Previous Comments:
------------------------------------------------------------------------
[2021-08-16 09:16:46] rh at hofercomputing dot ch
I am aware that assigning a value to a variable will change that variable, not important if i do it
a line before the function call or in the parameterlist.
If "a($x=18);" means exactly the same thing as "$x=18; a(18);" my wish is
let it be "a($x=18);" means exactly the same thing as "$x=18; a($x); thats all i
expect and seams to be logical to me.
------------------------------------------------------------------------
[2021-08-16 04:09:43] a at b dot c dot de
When you declare a function parameter as taking a variable by reference, you have to pass _a
variable_. "$x=18" is an assignment expression (not a variable) that gets evaluated to the
integer 18, and that integer is passed to the function. Not the variable. The value of the
assignment expression is the value on the right-hand side; the left-hand side doesn't get
involved.
"a($x=18);" means exactly the same thing as "$x=18; a(18);".
------------------------------------------------------------------------
[2021-08-15 12:26:32] rtrtrtrtrt at dfdfdfdf dot dfd
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
------------------------------------------------------------------------
[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>
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=81359
--
Edit this bug report at https://bugs.php.net/bug.php?id=81359&edit=1