Re: Re: Only variables can be passed by reference
| From: | Andrea Faulds | Date: | Sat, 06 Dec 2014 22:38:30 +0000 |
| Subject: | Re: Re: Only variables can be passed by reference | ||
| References: | 1 2 3 4 5 6 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-79462@lists.php.net to get a copy of this message | ||
Hi!
> On 6 Dec 2014, at 22:25, Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:
>
> Value is vague term. I would like to use "expression". Expression is
> anything that has value.
> Variables/constants are values that have actual storage.
> Literals are values that may not have actual storage.
The C world already has terminology for this:
* lvalues - values on the left-hand side of an assignment, they can be assigned to
Examples in PHP include:
* $foo
* $foo->bar
* $foo->bar[0]
* rvalues - a superset of lvalues, these are values that can be on the right-hand side of an
assignment
Examples include:
* All the lvalues above
* 3
* 2 + 3
* foobar()
* $foo + $bar
* (int)$foo
In C, you (usually) can only get pointers to lvalues, as only lvalues can be written to. In PHP, it
would make sense only to be able to reference lvalues, as only lvalues can be written to. In fact,
we (almost?) always treat references as if they were assignments, hence why you can reference
non-existent variables, because you can assign to non-existent variables. AFAIK this may be because
referencing a value inherently modifies it (in PHP 5 and earlier, it sets the if_ref flag, while in
PHP 7 it changes it to an IS_REFERENCE type). Even if referencing a value didn’t modify it, it
allows you to do so later.
Doing something like &(2+3) makes no sense as (2 + 3) isn’t a variable, it’s a temporary
rvalue that is only used once.
As others have said, there is no use-case for allowing assignments to or references to rvalues,
it’s completely nonsensical. What would make sense is adding things like array_top() or
array_bottom(), and perhaps allowing NULL rvalues to be passed to by-reference parameters with
defaults.
Thanks!
--
Andrea Faulds
http://ajf.me/