İfadeler

İfadeler, PHP'nin en önemli yapı taşlarındandır. PHP'de, hemen hemen yazdığınız her şey bir ifadedir. Bir ifadenin en basit ama en etkili tanımı şudur: "Bir değere sahip olan herşey".

İfadelerin en basit şekli sabitler ve değişkenlerdir. "$a = 5" yazdığınızda, '5' değerini $a değişkenine atamış olursunuz. '5', açık bir şekilde, 5 değerine sahiptir, ya da başka bir deyişle '5', değeri 5 olan bir ifadedir (bu durumda, '5' bir tamsayı sabittir).

Bu atamadan sonra, $a'nın değerinin 5 olmasını beklersiniz, dolayısıyla $b = $a yazdığınızda, bunun $b = 5 yazmışsınız gibi davranmasını beklersiniz. Başka bir deyişle, $a da değeri 5 olan ifadedir. Her şey doğru çalışırsa, olması gereken de tam budur.

İşlevler, ifadelerin biraz daha karmaşık örnekleridir. Örneğin, aşağıdaki işleve bakalım:

<?php
function foo ()
{
return
5;
}
?>

İşlev kavramına aşina iseniz (değilseniz, işlevler bölümünü inceleyebilirsiniz), şu örnekten hareketle $c = foo() yazmak ile $c = 5 yazmak arasında bir fark olmadığını bilirsiniz. İşlevler, değeri dönüş değeri olan ifadelerdir. foo() işlevi 5 değerini döndürdüğünden, "foo()" ifadesinin değeri 5'tir. İşlevlerin amacı normalde statik bir değer döndürmek değildir, bir hesaplamanın sonucunu döndürürler.

Elbette, PHP'deki değerlerin hep tamsayılar olması gerekmez, zaten çoğunlukla değildirler. PHP dört çeşit sayıl değer destekler: Tamsayı (int) değerler, kayan noktalı (float) değerler, dizge (string) değerler ve mantıksal bool değerler (sayıl değerler, dizilerin aksine daha küçük parçalara bölemeyeceğiniz değerlerdir). PHP ayrıca iki bileşik (sayıl olmayan) tür destekler: Diziler ve nesneler. Bu değer türlerinden her biri bir değişkene atanabilir ya da bir işlevden döndürülebilir.

PHP, birçok başka dilin yaptığı gibi ifadeleri çok ileriye götürmüştür. PHP ifade-yönelimli bir dildir, bunun sebebi hemen hemen her şeyin bir ifade olmasıdır. Az önce üzerinde çalıştığımız '$a = 5' örneğini ele alalım. Burada iki değer kullanımı sözkonusudur, bir tamsayı sabit olan '5' ve 5 olarak değiştirilmiş $a'nın değeri. Ancak gerçek şu ki, burada bu ikiliye ek olarak başka bir değer daha vardır, o da atamanın kendi değeridir. Atamanın kendisi atanan değerle değerlendirilir, bu örnekte bu 5'tir. Uygulamada, ne yaptığından bağımsız olarak "$a = 5", değeri 5 olan bir ifadedir. Böylece, "$b = ($a = 5)" yazmak, "$a = 5; $b = 5;" yazmak gibidir (noktalı virgül deyimin sonlandırıldığını gösterir). Atamalar sağdan sola doğru işlendiğinden, "$b = $a = 5" de yazabilirsiniz.

İfade yönelimi ile ilgili diğer güzel bir örnek atama öncesi ve sonrası arttırma ve eksiltme işlemleridir. PHP ve diğer birçok dilin kullanıcıları, değişken++ ve değişken-- gösterimine az çok aşinadır. Bunlar arttırma ve eksiltme işleçleridir. PHP'de, C'de olduğu gibi önceden arttırma ve sonradan arttırma diye iki tür arttırma vardır. Bunların her ikisi de değişkenin değerini bir arttırır ve değişken üzerindeki etkileri aynıdır. Fark, arttırma ifadesinin değerindedir. Önceden arttırma, ++$değişken olarak yazılır ve arttırılmış değer öncelik alır (PHP değişkenin değerini önce arttırır, sonra okur, bu sebeple önceden arttırma ismi verilmiştir). Sonradan arttırma ise, $değişken++ olarak yazılır ve değer arttırılmadan önceki özgün değer önceliklidir (PHP değişkenin değerini okuduktan sonra değerini arttırır, bu sebeple sonradan arttırma ismi verilmiştir).

Çok geniş bir kullanıma sahip olan ifade türlerinden birisi de karşılaştırma ifadeleridir. Bu ifadeler false ya da true değerlerinden birini alırlar. PHP > (büyüktür), >= (büyüktür ya da eşittir), == (eşittir), != (eşit değildir), < (küçüktür) ve <= (küçüktür ya da eşittir) gösterimlerini destekler. Dil aynı zamanda aynılık işleçlerini de destekler: === (eşit ve aynı türdedir) ve !== (ne eşit ne de aynı türdedir). Bu ifadeler çoğunlukla if deyimleri gibi koşula bağlı işlemlerde kullanılmaktadırlar.

Vereceğimiz son ifade örneği işleçli atama ifadeleridir. $a'nın değerini 1 arttırmak istediğinizde, basitçe '$a++' ya da '++$a' yazmanızın yeterli olduğunu zaten biliyorsunuz. Ama ya birden daha büyük bir değer, örneğin 3 eklemek isterseniz? '$a++' ifadesini birkaç kez yazabilirsiniz, ama bunun pek verimli ya da kullanışlı yöntem olmadığı oldukça açık. '$a = $a + 3' çok daha yaygın bir kullanımdır. '$a + 3' ifadesi $a'nın değerini önce 3 arttırır sonra sonucu $a'ya atar, böylece $a'nın değeri 3 arttırılmış olur. PHP'de, birkaç dilde olduğu gibi C benzeri, daha temiz gözükecek ve daha kısa biçimde yazabileceğiniz bir gösterim daha vardır. $a'nın mevcut değerine 3 ekleme işlemi '$a += 3' biçiminde yazılabilir. Bunun anlamı tam olarak "$a'nın değerini al, 3 ekle ve yeni değeri $a'ya ata" olacaktır. Daha kısa ve temiz olmasının yanında, bu kod daha hızlı çalıştırılacaktır. '$a += 3' işleminin değeri, normal bir atama işleminde olduğu gibi, atanan değerdir. Bu değerin 3 OLMADIĞINA dikkat edin, bu değer $a ile 3'ün toplamıdır ($a’ya bu değer atanır). İşleçli atama kipinde herhangi bir iki terimli işleç kullanılabilir, örneğin '$a -= 5' ($a'nın değerinden 5 çıkarılır), '$b *= 7' ($b'nin değeri 7 ile çarpılır), vs.

Diğer dillerde görmediyseniz size farklı gözükebilecek bir ifade daha vardır, o da üç terimli koşul işlecidir:

<?php
$birinci
? $ikinci : $üçüncü
?>

İlk alt ifadenin değeri true (sıfırdan farklı) ise, ikinci alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur. Aksi takdirde, üçüncü alt ifade değerlendirilir ve koşullu ifadenin sonucu bu olur.

Aşağıdaki örnek, önceden ve sonradan arttırma işleçlerini ve ifadelerini genelde biraz daha iyi anlamanıza yardımcı olacaktır:

<?php
function double($i)
{
return
$i*2;
}
$b = $a = 5; /* beş değerini $a ve $b değişkenlerine atar */
$c = $a++; /* sonradan arttırma, $a'nın özgün değerini (5) $c'ye atar */
$e = $d = ++$b; /* önceden arttırma, $b'nin arttırılmış değerini (6) $d
ve $e'ye atar */

/* bu noktada, $d ve $e 6'ya eşittir */

$f = double($d++); /* $d'nin değerini arttırmadan önce $d'nin değerinin iki
katını $f'ye atar, 2*6 = 12 */
$g = double(++$e); /* $e'nin değerini arttırdıktan sonra iki katını alıp
$g'ye atar, 2*7 = 14 */
$h = $g += 10; /* önce, $g 10 arttırılır ve değeri 24 olur. Sonra bu
değer (24) $h'ye atanır ve onun da değeri 24 olur. */
?>

Bazı ifadeler deyim olarak ele alınabilir. Bu durumda, deyim 'ifade' ';' şeklinde, noktalı virgülle sonlandırılmış bir ifade şeklinde olacaktır. '$=$a=5;' olduğunda, $a=5 geçerli bir ifadedir, ancak kendi başına bir deyim değildir. '$b=$a=5;' ise geçerli bir deyimdir.

Son olarak bahsetmemiz gereken bir konu da ifadelerin gerçek değeridir. Birçok olayda, çoğunlukla da koşula bağlı çalışmalarda ve döngülerde, ifadenin kendi değeri ile değil, true ya da false olması ile ilgileniyor olacaksınız. true ve false sabitleri (büyük-küçük harf duyarsız) olası iki mantıksal değerdir. Gerektiğinde, bir ifade otomatik olarak mantıksal değere dönüştürülür. Tür çarpıtma bölümünde bunun nasıl gerçekleştiği ayrıntılı olarak anlatılmıştır.

PHP ifadeleri tümüyle ve çok güçlü bir biçimde uygulamaya geçirmiştir ve bunların tamamını belgelemek bu kılavuzun kapsamının dışında kalır. Yukarıdaki örnekler hangi ifadelerle nasıl kullanışlı ifadeler oluşturabileceğiniz hakkında yeterli fikir verecektir. Bu kılavuzun geri kalanında, geçerli herhangi bir PHP ifadesini belirtmek için ifade sözcüğünü kullanacağız.

add a note

User Contributed Notes 12 notes

up
59
Magnus Deininger, dma05 at web dot de
15 years ago
Note that even though PHP borrows large portions of its syntax from C, the ',' is treated quite differently. It's not possible to create combined expressions in PHP using the comma-operator that C has, except in for() loops.

Example (parse error):

<?php

$a
= 2, $b = 4;

echo
$a."\n";
echo
$b."\n";

?>

Example (works):
<?php

for ($a = 2, $b = 4; $a < 3; $a++)
{
echo
$a."\n";
echo
$b."\n";
}

?>

This is because PHP doesn't actually have a proper comma-operator, it's only supported as syntactic sugar in for() loop headers. In C, it would have been perfectly legitimate to have this:

int f()
{
int a, b;
a = 2, b = 4;

return a;
}

or even this:

int g()
{
int a, b;
a = (2, b = 4);

return a;
}

In f(), a would have been set to 2, and b would have been set to 4.
In g(), (2, b = 4) would be a single expression which evaluates to 4, so both a and b would have been set to 4.
up
51
yasuo_ohgaki at hotmail dot com
23 years ago
Manual defines "expression is anything that has value", Therefore, parser will give error for following code.

<?php
($val) ? echo('true') : echo('false');
Note: "? : " operator has this syntax "expr ? expr : expr;"
?>

since echo does not have(return) value and ?: expects expression(value).

However, if function/language constructs that have/return value, such as include(), parser compiles code.

Note: User defined functions always have/return value without explicit return statement (returns NULL if there is no return statement). Therefore, user defined functions are always valid expressions.
[It may be useful to have VOID as new type to prevent programmer to use function as RVALUE by mistake]

For example,

<?php
($val) ? include('true.inc') : include('false.inc');
?>

is valid, since "include" returns value.

The fact "echo" does not return value(="echo" is not a expression), is less obvious to me.

Print() and Echo() is NOT identical since print() has/returns value and can be a valid expression.
up
22
chriswarbo at gmail dot com
11 years ago
Note that there is a difference between a function and a function call, and both
are expressions. PHP has two kinds of function, "named functions" and "anonymous
functions". Here's an example with both:

<?php
// A named function. Its name is "double".
function double($x) {
return
2 * $x;
}

// An anonymous function. It has no name, in the same way that the string
// "hello" has no name. Since it is an expression, we can give it a temporary
// name by assigning it to the variable $triple.
$triple = function($x) {
return
3 * $x;
};
?>

We can "call" (or "run") both kinds of function. A "function call" is an
expression with the value of whatever the function returns. For example:

<?php
// The easiest way to run a function is to put () after its name, containing its
// arguments (if any)
$my_numbers = array(double(5), $triple(5));
?>

$my_numbers is now an array containing 10 and 15, which are the return values of
double and $triple when applied to the number 5.

Importantly, if we *don't* call a function, ie. we don't put () after its name,
then we still get expressions. For example:

<?php
$my_functions
= array('double', $triple);
?>

$my_functions is now an array containing these two functions. Notice that named
functions are more awkward than anonymous functions. PHP treats them differently
because it didn't use to have anonymous functions, and the way named functions
were implemented didn't work for anonymous functions when they were eventually
added.

This means that instead of using a named function literally, like we can with
anonymous functions, we have to use a string containing its name instead. PHP
makes sure that these strings will be treated as functions when it's
appropriate. For example:

<?php
$temp
= 'double';
$my_number = $temp(5);
?>

$my_number will be 10, since PHP has spotted that we're treating a string as if
it were a function, so it has looked up that named function for us.

Unfortunately PHP's parser is very quirky; rather than looking for generic
patterns like "x(y)" and seeing if "x" is a function, it has lots of
special-cases like "$x(y)". This makes code like "'double'(5)" invalid, so we
have to do tricks like using temporary variables. There is another way around
this restriction though, and that is to pass our functions to the
"call_user_func" or "call_user_func_array" functions when we want to call them.
For example:

<?php
$my_numbers
= array(call_user_func('double', 5), call_user_func($triple, 5));
?>

$my_numbers contains 10 and 15 because "call_user_func" called our functions for
us. This is possible because the string 'double' and the anonymous function
$triple are expressions. Note that we can even use this technique to call an
anonymous function without ever giving it a name:

<?php
$my_number
= call_user_func(function($x) { return 4 * $x; }, 5);
?>

$my_number is now 20, since "call_user_func" called the anonymous function,
which quadruples its argument, with the value 5.

Passing functions around as expressions like this is very useful whenever we
need to use a 'callback'. Great examples of this are array_map and array_reduce.
up
17
egonfreeman at gmail dot com
17 years ago
It is worthy to mention that:

$n = 3;
$n * --$n

WILL RETURN 4 instead of 6.

It can be a hard to spot "error", because in our human thought process this really isn't an error at all! But you have to remember that PHP (as it is with many other high-level languages) evaluates its statements RIGHT-TO-LEFT, and therefore "--$n" comes BEFORE multiplying, so - in the end - it's really "2 * 2", not "3 * 2".

It is also worthy to mention that the same behavior will change:

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

So, if you ever find yourself on a 'wild goose chase' for a bug in that "impossible-to-break, so-very-simple" piece of code that uses pre-/post-'s, remember this post. :)

(just thought I'd check it out - turns out I was right :P)
up
21
Mattias at mail dot ee
22 years ago
A note about the short-circuit behaviour of the boolean operators.

1. if (func1() || func2())
Now, if func1() returns true, func2() isn't run, since the expression
will be true anyway.

2. if (func1() && func2())
Now, if func1() returns false, func2() isn't run, since the expression
will be false anyway.

The reason for this behaviour comes probably from the programming
language C, on which PHP seems to be based on. There the
short-circuiting can be a very useful tool. For example:

int * myarray = a_func_to_set_myarray(); // init the array
if (myarray != NULL && myarray[0] != 4321) // check
myarray[0] = 1234;

Now, the pointer myarray is checked for being not null, then the
contents of the array is validated. This is important, because if
you try to access an array whose address is invalid, the program
will crash and die a horrible death. But thanks to the short
circuiting, if myarray == NULL then myarray[0] won't be accessed,
and the program will work fine.
up
17
winks716
16 years ago
reply to egonfreeman at gmail dot com
04-Apr-2007 07:45

the second example u mentioned as follow:
=====================================

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

===========================================

everything works correctly but one sentence should be modified:

"from 3 * 3 into 3 * 4" should be "from 3 * 3 into 4 * 3"

best regards~ :)
up
13
petruzanauticoyahoo?com!ar
16 years ago
Regarding the ternary operator, I would rather say that the best option is to enclose all the expression in parantheses, to avoid errors and improve clarity:

<?php
print ( $a > 1 ? "many" : "just one" );
?>

PS: for php, C++, and any other language that has it.
up
10
denzoo at gmail dot com
16 years ago
To jvm at jvmyers dot com:
Your first two if statements just check if there's anything in the string, if you wish to actually execute the code in your string you need eval().
up
5
Bichis Paul
7 years ago
Regarding 12345alex at gmx dot net's example:

I think you miss the identical equal documentation line from: http://php.net/manual/en/language.operators.comparison.php

$a == $b Equal TRUE if $a is equal to $b after type juggling.
$a === $b Identical TRUE if $a is equal to $b, and they are of the same type.

Try:
print array() === NULL ? "True" : "False";

Check this:
var_dump(is_null(array()));
up
8
oliver at hankeln-online dot de
21 years ago
The short-circuiting IS a feature. It is also available in C, so I suppose the developers won?t remove it in future PHP versions.

It is rather nice to write:

$file=fopen("foo","r") or die("Error!");

Greets,
Oliver
up
5
antickon at gmail dot com
12 years ago
evaluation order of subexpressions is not strictly defined for all operators

<?php
function a() {echo 'a';}
function
b() {echo 'b';}
a() == b(); // outputs "ab", ie evaluates left-to-right

$a = 3;
var_dump( $a == $a = 4 ); // outputs bool(true), ie evaluates right-to-left
?>

this is not a bug: "we [php developers] make no guarantee about the order of evaluation".
See https://bugs.php.net/bug.php?id=61188
up
5
shawnster
17 years ago
An easy fix (although intuitively tough to do...) is to reverse the comparison.

if (5 == $a) {}

If you forget the second '=', you'll get a parse error for trying to assign a value to a non-variable.
To Top