Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Nieoczekiwane działanie isset() i empty()
l0ud
post 30.04.2008, 15:16:18
Post #1





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował l0ud 30.04.2008, 15:28:22


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
kszychu
post 30.04.2008, 15:24:10
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

Ostrzeżenie: (0%)
-----


A sprawdzałeś w error_logu? Może problem jest jakiś trywialny.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
cbagov
post 30.04.2008, 15:31:54
Post #3





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
l0ud
post 30.04.2008, 15:49:41
Post #4





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


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)).


Ten post edytował l0ud 30.04.2008, 15:44:23


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
cbagov
post 30.04.2008, 15:49:43
Post #5





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

Ostrzeżenie: (10%)
X----


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"

Go to the top of the page
+Quote Post
l0ud
post 30.04.2008, 15:56:37
Post #6





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
bim2
post 30.04.2008, 15:58:52
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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

Ten post edytował bim2 30.04.2008, 15:59:07


--------------------
Go to the top of the page
+Quote Post
Kicok
post 30.04.2008, 15:59:46
Post #8





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


W manualu jest wszystko ładnie opisane: empty" title="Zobacz w manualu PHP" target="_manual


(sekcja: Parameters)


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
cbagov
post 30.04.2008, 16:23:22
Post #9





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

Ostrzeżenie: (10%)
X----


@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);}

Ten post edytował cbagov 30.04.2008, 16:29:45
Go to the top of the page
+Quote Post
Sedziwoj
post 30.04.2008, 18:18:13
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ść.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.05.2024 - 23:56