Can't use method return value in write context

Php

Php Problem Overview


I would think the following piece of code should work, but it doesn't (Edited: Now works in PHP 5.5+):

if (!empty($r->getError()))

Where getError() is simply:

public function getError()
{
	return $this->error;
}

Yet I end up with this error:

> can't use method return value in write context

What does this mean? Isn't this just a read?

Php Solutions


Solution 1 - Php

empty() needs to access the value by reference (in order to check whether that reference points to something that exists), and PHP before 5.5 didn't support references to temporary values returned from functions.

However, the real problem you have is that you use empty() at all, mistakenly believing that "empty" value is any different from "false".

Empty is just an alias for !isset($thing) || !$thing. When the thing you're checking always exists (in PHP results of function calls always exist), the empty() function is nothing but a negation operator.

PHP doesn't have concept of emptyness. Values that evaluate to false are empty, values that evaluate to true are non-empty. It's the same thing. This code:

$x = something();
if (empty($x)) …

and this:

$x = something();
if (!$x) …

has always the same result, in all cases, for all datatypes (because $x is defined empty() is redundant).

Return value from the method always exists (even if you don't have return statement, return value exists and contains null). Therefore:

if (!empty($r->getError()))

is logically equivalent to:

if ($r->getError())

Solution 2 - Php

> Note: This is a very high voted answer with a high visibility, but please note that it promotes bad, unnecessary coding practices! See @Kornel's answer for the correct way. > > Note #2: I endorse the suggestions to use @Kornel's answer. When I wrote this answer three years ago, I merely meant to explain the nature of the error, not necessarily endorse the alternative. The code snippet below is not recommended.


It's a limitation of empty() in PHP versions below 5.5.

> Note: empty() only checks variables as > anything else will result in a parse > error. In other words, the following > will not work: empty(trim($name)).

You'd have to change to this

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

Solution 3 - Php

Prior to PHP 5.5, the the PHP docs used to say:

> empty() only checks variables as anything else will result in a parse error

In PHP < 5.5 you weren't able use empty() directly on a function's return value. Instead, you could assign the return from getError() to a variable and run empty() on the variable.

In PHP >= 5.5 this is no longer necessary.

Solution 4 - Php

I usually create a global function called is_empty() just to get around this issue

function is_empty($var)
{ 
 return empty($var);
}

Then anywhere I would normally have used empty() I just use is_empty()

Solution 5 - Php

As pointed out by others, it's a (weird) limitation of empty().

For most purproses, doing this is equal as calling empty, but this works:

if ($r->getError() != '')

Solution 6 - Php

The issue is this, you want to know if the error is not empty.

public function getError() {
    return $this->error;
}

Adding a method isErrorSet() will solve the problem.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Now this will work fine with this code with no notice.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

Solution 7 - Php

I'm not sure if this would be a common mistake, but if you do something like:

$var = 'value' .= 'value2';

this will also produce the same error

> Can't use method return value in write context

You can't have an = and a .= in the same statement. You can use one or the other, but not both.

Note, I understand this is unrelated to the actual code in the question, however this question is the top result when searching for the error message, so I wanted to post it here for completeness.

Solution 8 - Php

The alternative way to check if an array is empty could be:

count($array)>0

It works for me without that error

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionExtrakunView Question on Stackoverflow
Solution 1 - PhpKornelView Answer on Stackoverflow
Solution 2 - PhpPeter BaileyView Answer on Stackoverflow
Solution 3 - PhpGeorge ClaghornView Answer on Stackoverflow
Solution 4 - PhpLuke P MView Answer on Stackoverflow
Solution 5 - PhpJani HartikainenView Answer on Stackoverflow
Solution 6 - PhpJean Carlo BambalanView Answer on Stackoverflow
Solution 7 - PhpMikeView Answer on Stackoverflow
Solution 8 - PhpquardasView Answer on Stackoverflow