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ą
W tym przykładzie kluczowe jest to, że operator === w PHP wykonuje porównanie ścisłe, czyli sprawdza jednocześnie wartość oraz typ danych. Skoro zmienna $a została zainicjowana jako '1', to jest to napis, czyli typ string, a nie liczba całkowita. Dlatego $a === $b zwróci true tylko wtedy, gdy $b też będzie napisem o dokładnie takiej samej treści. W PHP zapis '1' oraz zapis "1" oznaczają string zawierający znak 1. Różnica między apostrofami i cudzysłowami dotyczy głównie interpretacji zmiennych oraz sekwencji specjalnych w środku tekstu, ale tutaj oba zapisy dają taki sam typ i taką samą wartość. W praktyce takie rozróżnienie jest bardzo ważne np. przy obsłudze danych z formularzy, parametrów GET/POST albo wyników z API, bo wiele danych przychodzi jako tekst. Moim zdaniem warto od początku przyzwyczajać się do === zamiast ==, bo ogranicza to dziwne błędy wynikające z automatycznej konwersji typów. Dobra praktyka w PHP, szczególnie w nowszym kodzie, to jawne pilnowanie typów danych i unikanie sytuacji, gdzie język sam zgaduje, czy coś ma być liczbą, tekstem czy wartością logiczną.
W tym pytaniu łatwo pomylić porównanie ścisłe z porównaniem zwykłym. W PHP operator == porównuje wartości po ewentualnej automatycznej konwersji typów, więc tekst '1' i liczba 1 mogą zostać potraktowane jako równoważne. Operator === działa inaczej: nie wystarczy, że wartości wyglądają podobnie. Musi zgadzać się i wartość, i typ danych. Jeżeli $a ma wartość '1', to jest stringiem, więc liczba 1 typu integer nie przejdzie takiego porównania. To jest częsty błąd myślowy: widzimy na ekranie 1 i zakładamy, że to zawsze to samo, a dla interpretera PHP to mogą być dwa różne byty. Zapis 1 bez apostrofów oznacza liczbę, natomiast '1' oznacza tekst z jednym znakiem. Jeszcze inna sprawa to zapis wyglądający jak *1. Jeśli miałby wystąpić bez cudzysłowu jako wartość, nie jest poprawnym literałem liczbowym ani tekstowym w PHP; gwiazdka jest operatorem mnożenia, więc taki zapis nie pasuje do sensownej inicjalizacji zmiennej jako pojedynczej wartości. Odpowiedź sugerująca, że pasuje zarówno 1, jak i '1', miesza zachowanie == z zachowaniem ===. W realnym kodzie, szczególnie przy logowaniu, walidacji formularzy czy porównywaniu identyfikatorów, takie drobne pomyłki potrafią zrobić bałagan. Z mojego doświadczenia najlepiej zapamiętać prostą zasadę: przy === typ musi być identyczny, a w tym przypadku identycznym typem jest string zapisany jako '1' albo "1".