Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki PHP

W języku PHP zainicjowano zmienną $a wartością 1. Porównanie $a === $b przyjmuje wartość true, w przypadku, gdy zmienna $b jest zainicjowana wartością

A. 1 lub '1'
B. "1" lub '1'
C. 1
D. '1'

Opracowane na podstawie zadania CKE, styczeń 2021 (arkusz EE.09-SG-21.01): W arkuszu CKE poprawna odpowiedź miała omyłkowy zapis „*1” (CKE uznała zadanie za wadliwe - punkt dla każdego). Poprawiono na 1.

Operator === w PHP oznacza porównanie ścisłe, czyli sprawdzana jest jednocześnie wartość oraz typ danych. Skoro zmienna $a została zainicjowana jako 1, to PHP traktuje ją jako liczbę całkowitą, czyli typ int. Żeby wyrażenie $a === $b zwróciło true, zmienna $b też musi mieć wartość 1 i też musi być typu int. Dlatego poprawna jest wartość 1 bez cudzysłowów. W praktyce ma to duże znaczenie np. przy sprawdzaniu identyfikatorów użytkowników, statusów, liczników albo danych pobranych z formularza. Formularze HTML często przekazują wartości jako tekst, więc '1' może wyglądać tak samo, ale typowo jest stringiem. Moim zdaniem w PHP warto jak najczęściej używać === zamiast ==, bo ogranicza to nieprzyjemne niespodzianki związane z automatyczną konwersją typów. To jest też zgodne z dobrymi praktykami branżowymi: kod jest czytelniejszy, bezpieczniejszy i łatwiej przewidzieć jego działanie. Przykładowo: var_dump(1 === 1) da true, ale var_dump(1 === '1') da false.
W tym pytaniu łatwo pomylić porównanie ścisłe z porównaniem zwykłym. W PHP operator == porównuje głównie wartość i może wykonać automatyczną konwersję typów, czyli tak zwane type juggling. Wtedy liczba 1 i tekst '1' mogłyby zostać uznane za równe, bo PHP próbuje dopasować typy przed porównaniem. Jednak tutaj użyty jest operator ===, a on działa bardziej rygorystycznie: wartość musi być taka sama i typ danych również musi być taki sam. To właśnie ta druga część jest kluczowa. Zapis '1' oznacza łańcuch znaków, czyli string, a nie liczbę całkowitą. Tak samo zapis z podwójnym cudzysłowem, czyli tekstowa jedynka, również jest stringiem. W PHP pojedynczy i podwójny cudzysłów różnią się między innymi interpretacją zmiennych i znaków specjalnych, ale w obu przypadkach zapis jednej cyfry w cudzysłowie nadal daje typ string. Błędne jest też założenie, że skoro coś wygląda jak liczba, to na pewno jest liczbą. To częsty błąd przy danych z formularzy, parametrów GET, POST albo plików CSV. Z mojego doświadczenia wynika, że takie drobiazgi później powodują dziwne błędy w logowaniu, filtrowaniu rekordów albo sprawdzaniu uprawnień. Jeśli potrzebujemy porównania ścisłego, trzeba zadbać o typ danych, np. rzutować wartość na int albo walidować dane wejściowe przed porównaniem. Dla $a ustawionego jako 1 prawdziwe będzie tylko porównanie z $b równym 1 typu int.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.