2011-11-09 12 views
7

Właśnie znalazłem kawałek mojego kodu, który zawierał jedną oryginalną literówkę.Typo daje nieoczekiwane wyniki w PHP

$msg = "Some text"; 
$msg .= " some more text"; 
$msg .+ " yet more text!"; 
$msg .= " last text"; 

Zawiadomienie .+ które powinny być .=. Co zaskakuje mnie to, że kod prowadził bez wytwarzania błędu, ostrzeżenia lub powiadomienia, a wyjście było:

Some text some more text last text

Zastanawiałem się, dlaczego to zrobił. Wiem doskonale, co to jest, ale jak interpretowana jest interpretacja, ponieważ nie ma znaku równości.

Odpowiedz

10

Nie ma operatora .+, czyli ., a następnie +.

Budujesz wyrażenie, które składa się z $msg połączonego z wynikiem stosowania jednoskładnikowa + do " yet more text!" (which is 0 powodu obsady do liczby całkowitej) ... i potem odrzucając całą sprawę, ponieważ nie robisz nic z wynik.

$msg .+ " yet more text!"; 
$msg . +" yet more text!"; // 1. PHP doesn't care about the spacing 
$msg . 0;     // 2. Conversion to int from unary `+` 
$msg . "0";    // 3. Coersion to string for concatenation 
          // 4. Nothing done with value 

Jest całkowicie poprawny; po prostu nic nie robi.

+0

Dzięki za wejście! – Iznogood

+1

@lznogood: Nie ma problemu! Warto tutaj zastanowić się, co się stanie, jeśli użyjesz wyrażenia "witaj", jako samotnego stwierdzenia: nic. To naprawdę sedno tego pytania. –

+0

w prawo! Dzięki jeszcze raz! – Iznogood

2

Urządzenie + zostaje zinterpretowane jako jednoargumentowe. PHP rzuca łańcuch na liczbę całkowitą o wartości 0 i łączy ją z $msg. Nie przypisujesz jednak niczego w tym wierszu, więc $msg nie zostanie zmieniony.

+0

Dzięki za wejście! +1! – Iznogood

1

Działa to, ponieważ . jest operatorem konkatenacji, a operatorem dodawania jest +.

Linia got interpretowane tak:

$msg . (+" yet more text!"); 

Wyrażenie +" yet more text!" konwertuje ciąg do int (0 w tym przypadku jako kiedy PHP konwertuje ciąg znaków na int, to zatrzymuje się na 1 brak numeru postać). Następnie ustalono 0 do $msg i zignorowano wynik.

+0

Dzięki za wejście! +1! – Iznogood

+0

@Iznogood: No prob. :-) –

Powiązane problemy