Hey again
Updated here as always https://gist.github.com/909711. I've tried to
write down the goal of this new feature. Which patterns do we want to
make easier to write?
Do you agree with the goals I've set?
+1 From me of course :)
Also added a proposal that would make userland implementations possible.
## Goal ##
So what should be solved before this new feature can be considered a succes? The
solution should offer DRY solutions to the following patterns:
// Set one variable from another or a default value.
// 1a.
$a = isset($b) ? $b : 'Default value';
// 1b.
$a = !empty($b) ? $b : 'Default value';
// Set one variable from itself or a default value.
// 2a.
$a = isset($a) ? $a : 'Default value';
// 2b.
$a = !empty($a) ? $a : 'Default value';
// Find the first set value from a range of variables and statements.
// 3a.
$tmp = get_value();
if (isset($tmp)) $a = $tmp;
$tmp = $myarr['mykey'];
if (!isset($a) && isset($tmp)) $a = $tmp;
if (!isset($a)) $a = 'Default value';
// 3b.
$tmp = get_value();
if (!empty($tmp)) $a = $tmp;
$tmp = $myarr['mykey'];
if (!isset($a) && !empty($tmp)) $a = $tmp;
if (!isset($a)) $a = 'Default value';
## Proposal 2 : Making a userland implementation possible ##
The one thing preventing us PHP end users for implementing our own solution to
this problem is - as discussed many times before - that it is not possible to
check if a passed argument can be referenced and then reference it. This
proposal adds an `AS_REFERENCE` bitmask that can be passed as the second
argument to `func_get_arg` which then in turn throws an
`ArgNotReferencableException` if the argument is not referenceable.
Below is an example of how `firstset` (ifsetor) could be implemented.
function firstset() {
$num_args = func_num_args();
for ($i = 0; $i < $num_args; ++$i) {
try {
$arg = func_get_arg($i, AS_REFERENCE);
if (!isset($arg) {
$arg = null;
}
} catch (ArgNotReferencableException $e) {
$arg = func_get_arg($i);
}
if (isset($arg) {
return $arg;
}
}
return null;
}
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php