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

Reply via email to