Hi all,
Because the feature freeze for PHP 7 is near I like to know your
thoughts about one more change in passing arguments. Sure this one would
introduce one more deprecated message / BC break but this one s for
reducing BC break in the future!
Currently a caller can pass undefined arguments as much he like. Such
passed arguments are only visible by the callee using
func_get_args/func_num_args but the need for such function definitions
has been gone with argument unpacking feature. The other rare
possibility for ignoring passed arguments by callables from functions
like array_walk has been gone, too, with the introduction of clusures.
By the way we already have internal functions triggering warnings on
unknown arguments. This is also an unneeded inconsistency and more it's
invisible by the user without testing each function for it.
At least simply ignoring passed arguments is a violation as described in
the following examples (http://3v4l.org/U2lnf):
class Calculator {
public function calc($v) {
return $v + 1;
}
}
class MyCalculator extends Calculator {
public function calc($v1, $v2 = 0) {
return parent::calc($v1) + $v2;
}
}
function calcArray(array $values, Calculator $calculator) {
foreach ($values as &$v) {
$v = $calculator->calc($v, $v); // Second argument is wrong !!
}
return $values;
}
$ar = [1,2,3];
var_dump(calcArray($ar, new Calculator)); // ignores the second argument
var_dump(calcArray($ar, new MyCalculator)); // UNEXPECTED: the second
argument will be used
Both calculators should be 100% compatible but they aren't as the
function "calcArray" shows.
So because of the described issues with the existing code base I like to
propose the change to no longer ignore undefined arguments and introduce
E_DEPRECATED messages if a function get's an undefined argument. So the
user get enough time to fix their code before throwing errors in this
case in PHP 8.
As this should be consistent over the engine I would propose this change
for user defined functions and for internal functions as well.
Again, yes this one would introduces one more BC break but first this
would be deprecated before disabled and next it's for reducing BC in the
future.
Marc
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php