Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Czy używanie empty() w warunkach jest konieczne?
eerie
post 19.10.2020, 12:24:17
Post #1





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 3.08.2017

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


Czy używanie funkcji empty() w warunkach jest konieczne? Będzie błędem, jeśli napiszę warunek bez empty()? Bo jedno i drugie rozwiązanie działa chyba identycznie...

Kod
if (empty($var)) {
}

Kod
if (!$var) {
}
Go to the top of the page
+Quote Post
nospor
post 19.10.2020, 12:31:25
Post #2





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




Nie dziala identycznie. jesli $var nie jest zadeklarowana to poleci ci NOTICE w drugim wypadku


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
eerie
post 19.10.2020, 12:53:13
Post #3





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 3.08.2017

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


A gdy mam pewność, iż zmienna $var jest zadeklarowana (np. jest zwrócona przez funkcję jako konkretny typ wartości), to mogę chyba [zawsze] zapisać drugim sposobem (bez empty())?

Ten post edytował eerie 19.10.2020, 13:41:45
Go to the top of the page
+Quote Post
SmokAnalog
post 19.10.2020, 14:28:32
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Ja nie jestem zwolennikiem zapisywania w taki sposób warunków, gdy $var nie jest boolem.

Wolę tak:

  1. if ($var !== '') {/* dla string */}
  2. if ($var !== 0) {/* dla int */}
  3. if ($var !== null) {/* dla nullable */}
  4. if ($var) {/* dla bool */}


empty() używam tylko z tablicami.
Go to the top of the page
+Quote Post
eerie
post 20.10.2020, 11:05:52
Post #5





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 3.08.2017

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


Nasunęło mi się jeszcze jedno pytanie. A jak postępować, gdy zwracam np. z repozytorium (bazy danych) obiekt lub null (?object)? Ewentualnie wartość typu np. string lub null (?string)... Wtedy chyba powinienem użyć: if (!empty($var)) {}
Go to the top of the page
+Quote Post
nospor
post 20.10.2020, 11:24:12
Post #6





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




No wtedy tym bardziej nie powinienes uzywac empty. Przeciez srting moze byc pustym tekstem a to moze byc ok.

Wtedy masz uzyc !== null


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
eerie
post 20.10.2020, 13:24:47
Post #7





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 3.08.2017

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


Co do sprawdzania istnienia obiektów. Dla zwracanych obiektów (typu ?object) rozumiem, że ma być [zawsze] tak samo: if ($object !== null) {}. Zmylił mnie przykład z dokumentacji, gdzie przy użyciu empty() sprawdzali, czy obiekt został utworzony. Tu też zamiast empty($object) powinno się użyć raczej isset($object) i dalej is_object($object)... Bo dla np. obiektów formularzy, które mogą zwracać pusty string '' (gdy przesłany) lub null (gdy nieprzesłany), funkcja !empty() może mieć zastosowanie, gdy chcemy sprawdzić, czy jakakolwiek wartość została podana. Choć z moich obserwacji (w Symfony) puste pole formularza (z obiektu formularza) zwraca zawsze null (czy przesłany bądź nieprzesłany). I tu też chyba powinienem przyrównywać do null... smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 20.10.2020, 13:29:11
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Jeśli zwracany obiekt to wolę

Kod
if($obj instanceof ObjectInterface)

to tak dla pewności że jest tu czego oczekuję. Można też null !== $obj jeśli return z metody jest typehinted
Go to the top of the page
+Quote Post
vokiel
post 20.10.2020, 18:59:07
Post #9





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Co do porównywania null !== $var jest coś takiego jak is_null($var).

Poza tym, dobrze zapoznać się z tabelką na https://www.php.net/manual/en/types.comparisons.php żeby nie mieć wątpliwości co daje jakie wyniki.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 23.10.2020, 21:20:24
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Cieszyłbym się, gdyby zaczęli sprzątać PHP i m.in. usunęli is_null(). Nie lubię, gdy jedną prostą rzecz można zrobić na kilka identycznych sposobów.
Go to the top of the page
+Quote Post
viking
post 24.10.2020, 07:40:27
Post #11





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


To idąc dalej takim tokiem rozumowania można całkowicie dużo funkcji usunąć skoro jest empty oraz inne nowe operatory. Ja tam bardzo lubię is_null. A wracając do tematu. Zainstaluj sobie jakieś narzędzia typu cs fixer, ustaw zbiór własnych reguł (w tym tutaj yoda style) i masz z głowy zajmowanie się pierdołami.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 24.10.2020, 13:03:15
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


No i tak wg mnie powinni zrobić - zacząć usuwać. Dzisiaj już się inaczej projektuje języki, zobacz sobie takiego Swifta, albo nawet niemłodego już Pythona. Wiem, że mogę zacząć "ignorować" pewne możliwości, ale dla jakiejś tam perfekcjonistycznej części mnie to jest niedogodność biggrin.gif

empty() nigdy nie lubiłem, a w PHP <= 5.4 ta funkcja była jeszcze bardziej irytująca, bo nie pozwalała używać wyrażeń, czyli np. to wyrzucało błąd:

  1. $foo = empty(1 + 0);


Dobrze zaprojektowany język nie ma takich trudnych do zapamiętania nieścisłości, wszystko powinno być klarowne zamiast kazać nam "pamiętać" o swoich dziwactwach. Dlatego jestem za sprzątaniem. Osobiście prawie nigdy nie używam is_null(), tylko $foo === null. Jedyny wyjątek to array_filter($foo, 'is_null'), array_map('is_foo', $foo) lub jakieś inne stringowe callbacki. Ale nadal bym wolał, żeby tego nie było smile.gif
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: 16.04.2024 - 04:56