downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Аритметични оператори> <Оператори
[edit] Last updated: Fri, 18 Sep 2009

view this page in

Приоритет на операторите

Приоритетът на операторите описва колко "плътно" даден оператор свързва два израза. Например, в израза 1 + 5 * 3 отговорът е 16, а не 18, защото операторът за умножение ("*") има по-висок приоритет от оператора за събиране ("+"). Ако е необходимо, могат да бъдат използвани скоби, за да се укаже изрично приоритет. Например: (1 + 5) * 3 се изчислява на 18. Ако два оператора имат еднакъв приоритет се използва асоциативност отляво надясно.

Следната таблица описва приоритета на операторите, като операторите с най-висок приоритет са най-отгоре. Операторите на един и същи ред имат еднакъв приоритет, в който случай редът им на изчисление зависи от съответната им асоциативност.

Приоритет на операторите
Асоциативност Оператори Допълнителна информация
без асоциативност clone new clone и new
лява [ array()
без асоциативност ++ -- инкрементиране/декрементиране
без асоциативност ~ - (int) (float) (string) (array) (object) (bool) @ типове
без асоциативност instanceof типове
дясна ! логически
лява * / % аритметични
лява + - . аритметични и низови
лява << >> побитови
без асоциативност < <= > >= <> сравнителни
без асоциативност == != === !== сравнителни
лява & побитови и референции
лява ^ побитови
лява | побитови
лява && логически
лява || логически
лява ? : третични
дясна = += -= *= /= .= %= &= |= ^= <<= >>= присвоителни
лява and логически
лява xor логически
лява or логически
лява , множество употреби

Лява асоциативност означава, че изразът се изчислява отляво надясно, дясна асоциативност - обратното.

Example #1 Асоциативност

<?php
$a 
5// (3 * 3) % 5 = 4
$a true true 2// (true ? 0 : true) ? 1 : 2 = 2

$a 1;
$b 2;
$a $b += 3// $a = ($b += 3) -> $a = 5, $b = 5
?>

Използвайте скоби, за да увеличите прегледността на кода.

Забележка: Въпреки че = има по-нисък приоритет от повечето останали оператори, PHP позволява изрази като този: if (!$a = foo()), в който случай изходът на foo() се присвоява на $a.



add a note add a note User Contributed Notes Приоритет на операторите
Christopher Schramm 02-Jul-2011 09:29
( - the function call operator - has higher precedence than ++ and --, but lower precedence than [.

Therefore you can do the following:

<?php
$func
[0] = 'exit';
$func[0]();
?>

But the following will cause a syntax error:

<?php
function func() {
    return array(
'string');
}
func()[0];
?>
charles at pilger dot com dot br 09-Feb-2011 12:00
Be very careful with the precedence. See this code:

<?php
$a
= 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
?>

Result:

int(1)
NULL
bool(false)
bool(false)
bool(true) <==
kiamlaluno at avpnet dot org 12-Jul-2010 04:41
Be careful of the difference between

<?php
$obj
= new class::$staticVariable();
?>

<?php
$value
= class::$staticVariable();
?>

In the first case, the object class will depend on the static variable class::$staticVariable, while in the second case it will be invoked the method whose name is contained in the variable $staticVariable.
headden at karelia dot ru 09-Jun-2009 04:02
Although example above already shows it, I'd like to explicitly state that ?: associativity DIFFERS from that of C++. I.e. convenient switch/case-like expressions of the form

$i==1 ? "one" :
$i==2 ? "two" :
$i==3 ? "three" :
"error";

will not work in PHP as expected
Pies 08-Feb-2009 11:22
You can use the "or" and "and" keywords' lower precedence for a bit of syntax candy:

<?php

$page
= (int) @$_GET['page'] or $page = 1;

?>

 
show source | credits | stats | sitemap | contact | advertising | mirror sites