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:
Co to znaczy? Czy to nie jest tylko odczyt?Nie można użyć metody zwracającej wartość w kontekście zapisu
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())
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))
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.
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 ()
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() != '')
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();
}
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ść.
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
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