Nie można użyć metody return value w kontekście zapisu

Myślę, że następujący fragment kodu powinien działać, ale nie (Edited: teraz działa w PHP 5.5+):

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

Gdzie getError() jest po prostu:

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

A jednak kończę z tym błędem:

Nie można użyć metody zwracającej wartość w kontekście zapisu

Co to znaczy? Czy to nie jest tylko odczyt?
 467
php
Author: thanksd, 2009-07-02

8 answers

empty() musi uzyskać dostęp do wartości przez odniesienie( aby sprawdzić, czy to odniesienie wskazuje na coś, co istnieje), a PHP przed 5.5 Nie obsługiwało odniesień do tymczasowych wartości zwracanych z funkcji.

Jednak prawdziwym problemem jest to, że w ogóle używasz empty(), błędnie wierząc, że wartość " empty "różni się od"false".

Empty jest tylko aliasem dla !isset($thing) || !$thing. Gdy to co sprawdzasz zawsze istnieje (w PHP wyniki wywołań funkcji zawsze istnieje), funkcja empty() jest niczym innym jak operatorem negacji .

PHP nie ma pojęcia pustości. Wartości, które oceniają na false są puste, wartości, które oceniają na true są niepuste. To to samo. Ten kod:

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

I to:

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

Ma zawsze ten sam wynik, we wszystkich przypadkach, dla wszystkich typów danych (ponieważ $x jest zdefiniowane empty() jest zbędne).

Wartość zwracana z metody zawsze istnieje (nawet jeśli nie masz return instrukcji, return value exists and contains null). Dlatego:

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

Jest logicznie równoważne:

if ($r->getError())
 772
Author: Kornel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 15:59:08

Uwaga: jest to bardzo wysoko głosowana odpowiedź z dużą widocznością, ale proszę pamiętać, że promuje złe, niepotrzebne praktyki kodowania! Zobacz odpowiedź @ Kornel dla poprawnego sposobu.

Uwaga #2: popieram sugestie użycia @ Kornel ' s answer. Kiedy pisałem tę odpowiedź trzy lata temu, chciałem jedynie wyjaśnić naturę błędu, niekoniecznie popierając alternatywę. Poniższy fragment kodu nie jest polecam.


Jest to ograniczenie empty () w wersjach PHP poniżej 5.5.

Notatka: empty() sprawdza tylko zmienne jako Wszystko inne spowoduje parse błąd. Innymi słowy, następujące nie zadziała: empty (trim ($name)).

Musisz zmienić na to

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
 331
Author: Peter Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Przed PHP 5.5, PHP docs mawiał:

Empty sprawdza tylko zmienne, ponieważ cokolwiek innego spowoduje błąd parsowania

W PHP empty() bezpośrednio na zwracanej wartości funkcji. Zamiast tego możesz przypisać zwrot z getError() do zmiennej i uruchomić empty() Na zmiennej.

W PHP > = 5.5 nie jest to już konieczne.

 38
Author: George Claghorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 22:18:36

Zwykle tworzę globalną funkcję o nazwie is_empty (), aby ominąć ten problem

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

Wtedy gdziekolwiek bym normalnie użył empty () używam tylko is_empty ()

 19
Author: Luke P M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 19:40:26

Jak zauważyli inni, jest to (dziwne) ograniczenie funkcji empty ().

Dla większości purpurowych, robienie tego jest równoznaczne z nazywaniem pustym, ale to działa:

if ($r->getError() != '')
 4
Author: Jani Hartikainen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 17:08:05

Problem polega na tym, że chcesz wiedzieć, czy błąd nie jest pusty.

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

Dodanie metody isErrorSet() rozwiąże problem.

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

Teraz to będzie działać dobrze z tym kodem bez powiadomienia.

if (!($x->isErrorSet())) {
    echo $x->getError();
}
 2
Author: Jean Carlo Bambalan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-12 17:58:55

Nie jestem pewien, czy byłby to częsty błąd, ale jeśli zrobisz coś w stylu:

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

Spowoduje to również ten sam błąd

Nie można użyć metody zwracającej wartość w kontekście zapisu

Nie możesz mieć = i .= w tym samym oświadczeniu. Możesz użyć jednego lub drugiego, ale nie obu.

Uwaga, rozumiem, że nie ma to związku z rzeczywistym kodem w pytaniu, jednak to pytanie jest najlepszym wynikiem podczas wyszukiwania Komunikatu o błędzie, więc chciałem opublikuj go tutaj, aby uzyskać kompletność.

 0
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 22:06:35

Alternatywnym sposobem sprawdzenia czy tablica jest pusta może być:

count($array)>0

U mnie działa bez tego błędu

 -3
Author: quardas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 08:44:43