Req #81359 [Com]: assignement in function parameter

From: 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

« previous php.bugs (#235841) next »