Hi Rowan,

On Sat, Dec 6, 2014 at 11:25 PM, Rowan Collins <rowan.coll...@gmail.com>
wrote:

> On 06/12/2014 03:03, Yasuo Ohgaki wrote:
>
>> Hi Rowan,
>>
>> On Fri, Dec 5, 2014 at 6:12 PM, Rowan Collins <rowan.coll...@gmail.com
>> <mailto:rowan.coll...@gmail.com>> wrote:
>>
>>     The author of function f1() presumably designed it to apply some
>>     change to $v, rather than executing only for its side effects and
>>     return value. If the caller wants to ignore this design, they can,
>>     but they are not using the function as it was designed. If they
>>     pass a function return straight into it, they have no way of
>>     capturing the change to $v which the author intended them to see.
>>
>>
>> The value supplied to f1() is return value.
>> In languages, there are literal, constant and variable. Return value is
>> variable.
>>
>
> No, a return value is a value - it is the result of some computation which
> has not yet been assigned to a variable. This is perhaps more obvious with
> an operator: "1 + 2" is not a variable, it is the value 3; internally, a
> temporary variable is probably used to hold that value, but that temporary
> variable is never accessible to the programmer. If you have function
> add($a, $b) { return $a + $b; }, then add(1,2) is still not a variable in
> any meaningful sense.


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.

Joe pointed out PHP treats temporary variable differently. I suppose
temporary variable is created
for values not used as usual variable. e.g. Function return value.

It may be the thing we need to reconsider.
Temporary variable is an variable after all. It may be used in context that
is changed then discarded.

Even if we raise errors for temporary variables, it's better to raise
_the_same_error_ where is it allowed.

<?php
define('MYERROR', -1);
function &f1() {return -1;}  // E_NOTICE rather than E_STRICT
function &f2() {return MYERROR;} // E_NOTICE rather than E_STRICT

$v = f1();
$v = 2;
var_dump($v);

$v = f2();
$v = 2;
var_dump($v);
?>
http://3v4l.org/9LdkK#v551

I understand that return by ref and returning literal/constant is
contradictional, yet
it seems too much care for developers. Developer may simply return value
that
indicates some error in return by ref function should be allowed w/o error.
IMHO.



>  It's better to keep basic rule. IMHO.
>>
>> $top = array_pop(f2());
>>
>> is better than
>>
>> $v = f2();
>> $top = array_pop($v);
>>
>> Is there anyone who likes latter?
>>
>
> array_pop() is a stack-manipulation function, so the latter is the correct
> use, with $v going on to be used as the rest of the stack. If you're using
> it for something other than stack manipulation, neither is correct, because
> it's the wrong choice of function.


User may use array_slice() for it, but array_pop() is intuitive what it
does and works
perfectly except unneeded error. Therefore,  user surprises what is the
"Only variable
references should be ..." means.

Anyway, I wrote a blog about this spec many years ago and the entry is
accessed
constantly even today.  I suppose PHP7 will have more intuitive/flexible
parsing for
complex expressions(e.g. f()[2]->method(), etc, isn't it?), then this spec
may confuse
more users.

We don't need unwanted side effects, therefore this change should be done
carefully.
I wouldn't argue with this. If removing "Only variable references should be
..." error is
feasible, I would like to propose this change.

Regards,

--
Yasuo Ohgaki
yohg...@ohgaki.net

Reply via email to