Req #81359 [Com]: assignement in function parameter

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

« previous php.bugs (#235829) next »