2012-02-09 13 views
6

Oto prosty kod PHPJaka jest różnica między, (przecinek) i. (kropka) jako operator konkatenacji?

echo '<form method="POST" action="calcbyme.php"></br> 
    enter value1 :<input type="text" name="f1"></br> 
    give operator :<input type="text" name="op"></br> 
    enter value2 :<input type="text" name="f2"></br> 
    <input type="submit" value="calculate"></br>'; 
    if(isset($_POST["f1"]) && isset($_POST["f2"]) && isset($_POST["op"])){ 
     $a=$_POST["f1"]; 
     $b=$_POST["f2"]; 
     $op=$_POST["op"]; 
     switch ($op){ 
      case '+': 
       echo "$a+$b=". $a+$b; break; 
      case '-': 
       echo "$a-$b=". $a-$b; break; 
      case '*': 
       echo "$a*$b=". $a*$b; break; 
      case '/'; 
       echo "$a/$b=". $a/$b; break; 
      default: 
       echo "invalid operator"; break; 
     } 
    } 

Jeśli zakładam $a=4 i $b=2 ale to daje tylko wartość jak ten

6 
2 
8 
2 

Jeśli mogę umieścić, (przecinek) zamiast. (kropka), a następnie podaje prawidłowy sygnał wyjściowy, taki jak ten:

4+2=6 
4-2=2 
4*2=8 
4/2=2 

Dlaczego tak się dzieje?

+0

Z ciekawości spróbuj zamknąć operacje matematyczne na '()', np. '($ a + $ b)' – Vyktor

+0

Czy nie odtwarzasz już wbudowanych operatorów arytmetycznych? – summea

+3

Należy zauważyć, że 'echo' +', 'nie jest konkatenacją ciągów i jest nieco szybsze (ponieważ pozwala uniknąć tego narzutu). 'echo $ a, $ b' jest bardziej podobne do' echo $ a; echo $ b'. Ale jeśli chodzi o twoje pytanie, zobacz odpowiedzi, które mówią o pierwszeństwie operatora. – Matthew

Odpowiedz

3

Ma do czynienia z php operator precedence ...

ekspresyjny zawierający . jest wykonywany przed wyrażenia zawierające +, wsporniki do nich ukryte są:

.+- są równe podmioty (nie ma pierwszeństwo stosowania na nich) i są wykonywane sekwencyjnie od początku do końca, dlatego domyślne nawiasy to:

echo ("$a+$b=". $a)+$b 

Więc jeśli chcesz prawidłowego wyjścia należy użyć:

echo "$a+$b=". ($a+$b) 

empiryczne przykłady:

php > echo "foo" . 1 + 2; 
// 2 
php > echo "foo" . (1 + 2); 
// foo3 
php > echo 1 + 3 . 'foo'; 
// 4foo 

i dlaczego jest , pracy ... Bo śpiączka oddziela argumenty funkcji php i widzi to jako:

echo("$a+$b=", $a+$b); 

A operator śpiączki (,) jest oceniany jako ostatni.

+0

'echo' to _nie_ funkcja, ale konstrukt językowy, więc' $ a + $ b = "' i '$ a + $ b' są _nie_ argumentami funkcji . Powód, dlaczego tak działa, polega na tym, że ',' ma _specjalne_ znaczenie z 'echo' (jest oceniane jako' echo '$ a + $ b = "; echo $ a + $ b;'). – KingCrunch

+0

Lexer ma mniejszy narzut z echa oddzielone przecinkami. więc jest to rodzaj mikro optymalizacji –

+0

Ciekawe, że nikt nie wyjaśnił, dlaczego pierwszy przypadek rzeczywiście zwrócił prawidłowe wyniki ... Ponieważ jest to w zasadzie przypadek. W przypadku operatorów numerycznych PHP automatycznie konwertuje ciąg znaków na liczbę taką, że odczytuje ciąg znaków, dopóki nie znajdzie pierwszego nielicznego znaku, a następnie go przekonwertuje. Takie zachowanie uważam za dość wyjątkowe ... – dualed

0

Różnica polega na tym, że , nie jest operatorem konkatenacji, ale zacznijmy od początku

echo "$a+$b=". $a+$b; 

z $a=2 i $b=4 jest oceniana jak

echo ("4+2=". 4)+2; 
echo "4+2=4"+2; 
echo ((int) "4+2=4")+2; 
echo 4+2; 
echo 6 

Chodzi o to, że przecinek , nie łączy się, ale wymienia wyrażenia (przynajmniej dla echo.) manual mówi "wiele zastosowań" ...), stąd każde wyrażenie jest wykonywane n jego własny.

echo "$a+$b=", $a+$b; 
echo "$a+$b="; echo $a+$b; 
echo "2+4=";echo 2+4; 
Powiązane problemy