Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Nieoczekiwane działanie isset() i empty()
Forum PHP.pl > Forum > PHP
l0ud
Witam, napotkałem na pewien problem. Mam utworzony obiekt 'router' który ma za zadanie zwracać odpowiednie zmienne. Deklaruję taką metodę:
  1. <?php
  2. public function postVar($name) {
  3. if (isset($this->postArray[$name])) return $this->postArray[$name];
  4. else return null;
  5. }
  6. ?>


I teraz chcę sprawdzić, czy zwracana wartość nie jest pusta:

  1. <?php
  2. if (empty($router->postVar('submit'))) {
  3. echo 'pusta';
  4. }
  5. else {
  6. echo 'jest';
  7. }
  8. ?>


Powyższy kod nie wygeneruje żadnego błędu, ale spowoduje wyświetlenie się pustej strony. Będzie ona pusta nawet wtedy, gdy przed całym warunkiem dodam jakieś echo.
Poniższy kod działa:
  1. <?php
  2. $submit = $router->postVar('submit');
  3.  
  4. if (empty($submit)) {
  5. echo 'pusta';
  6. }
  7. else {
  8. echo 'jest';
  9. }
  10. ?>

Nie mam pojęcia dlaczego tak się dzieje, dla mnie to trochę nielogiczne jest. snitch.gif Pewnie po prostu czegoś nie rozumiem, ale nie mogę samodzielnie tego uzasadnić...
Dodaję log do wincachegrind, jeżeli pomoże on w rozwiązaniu problemu: http://www.sendspace.pl/file/LGfYFlka/

Proszę o pomoc i pozdrawiam
kszychu
A sprawdzałeś w error_logu? Może problem jest jakiś trywialny.
cbagov
sprawdz czy isset($this->postArray[$name]))
czyli odpowiednia wlasciwosc obiektu nie jest wczesniej zainicjowana/stworzona mimo, ze pusta

wtedy isset nie daje null tylko return
a empty widzi, ze empty i daje "pusta"

WersjaOpisPHP 5As of PHP 5, objects with no properties are no longer considered empty.

PHP 4As of PHP 4, The string value "0" is considered empty.



prawdopodobnie tu sęk
l0ud
kszychu, wszystkie błędy powinny być wyświetlane. Na samym początku całości jest:
  1. <?php
  2. error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_STRICT);
  3. ?>

I dotychczas to działało. Jeżeli dostawię gdzieś jakąś literkę to wyskakuje parse error, więc wszystko ok...

cbagov, problem w tym, że warunek z empty zupełnie nic nie zwraca. Po prostu kod przerywa się nie dając żadnego wyniku.

[edit]

Przyjrzałem się jednak temu error_reporting. Teraz wygląda tak
  1. <?php
  2. error_reporting(E_ALL | E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_STRICT);
  3. ?>



No i coś się zmieniło - mam błąd smile.gif
Cytat
Can't use method return value in write context


Teraz tylko pozostaje zrozumieć, dlaczego on występuje...

Ok, wyjaśnione smile.gif
Cytat
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)).
cbagov
z tego co wiem to empty nie mozna uzywac przy sprawdzaniu return z funkcji

"<H3 class=title>Notatki</H3>
Informacja: Ponieważ jest to element składni języka a nie funkcja"

l0ud
Dokładnie, problem rozwiązany winksmiley.jpg

Ostatecznie zrobiłem na ten sposób:

  1. <?php
  2. if ($router->postVar('submit') === null) {
  3. echo 'puste';
  4. }
  5. else {
  6. echo 'jest';
  7. }
  8. ?>
bim2
Ja polece zrobienie
$router->postIsset('submit');
  1. <?php
  2. function postIsset($sName)
  3. {
  4. return isset($sName);
  5. }
  6. ?>


Wygodnie się wtedy pisze winksmiley.jpg
Kicok
W manualu jest wszystko ładnie opisane: empty" title="Zobacz w manualu PHP" target="_manual


(sekcja: Parameters)
cbagov
@bim2 Obawiam sie, ze tak 'sprawdzalbys' stan slowa ['submit']
a l0ud trzyma wartosci w tablicy



[quote name='bim2' date='30.04.2008, 16:58:52 ' post='466812']
Ja polece zrobienie
$router->postIsset('submit');

function postIsset($sName)
{return isset($sName);}
Sedziwoj
Cytat(bim2 @ 30.04.2008, 16:58:52 ) *
Ja polece zrobienie
$router->postIsset('submit');
  1. <?php
  2. function postIsset($sName)
  3. {
  4. return isset($sName);
  5. }
  6. ?>


Wygodnie się wtedy pisze winksmiley.jpg


To jest masło maślane. Co innego empty() którego parametr musi być zmienną. (chyba że źle pamiętam, bo teraz nie sprawdzę)
Do tego jednak lepiej spr. jak napisał l0ud, czyli porównanie wartości zwróconej.
Bo w odróżnieniu od zmiennej, ma ona konkretną wartość.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.