PHP: Kifejez�sek - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links 
search for in the  
previousEl�re defini�lt �lland�kOper�toroknext
Last updated: Fri, 30 Aug 2002
view the printer friendly version or the printer friendly version with notes or change language to English | Brazilian Portuguese | Chinese | Czech | Dutch | Finnish | French | German | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Swedish | Turkish

Fejezet 10. Kifejez�sek

A kifejez�sek a PHP legfontosabb �p�t�k�vei. A PHP-ban majdnem minden, amit le�rsz, egy kifejez�s. A lehet� legegyszer�bb �s m�gis pontos defin�ci�ja a kifejez�snek: "mindaz, amelynek �rt�ke van".

A kifejez�sek legalapvet�bb form�i az �lland�k �s a v�ltoz�k. Az "$a = 5" az '5'-�t az $a v�ltoz�hoz rendeli. Az '5'-nek nyilv�n 5 az �rt�ke, vagyis m�s szavakkal az '5' olyan kifejez�s, melynek �rt�ke 5 (itt az '5' egy eg�sz t�pus� �lland�).

Ez ut�n a hozz�rendel�s ut�n $a �rt�ke 5 kell legyen, s�t, $b = $a eset�n az eredm�nynek azonosnak kell lennie azzal, mint $b = 5 eset�n. M�sk�pp megfogalmazva az $a olyan kifejez�s, amelynek �rt�ke 5. Ha minden j�l megy, pontosan ez fog t�rt�nni.

Kiss� bonyolultabb p�ld�k a kifejez�sekre a f�ggv�nyek. P�ld�ul tekints�k az al�bbi f�ggv�nyt:

function ize()
{
    return 5;
}

Megel�legezz�k ,hogy nem idegen T�led a f�ggv�nyek koncepci�ja - ha nem �gy lenne, akkor olvasd el a f�ggv�nyekr�l sz�l� fejezetet. Amint az elv�rhat�, a $c = foo() l�nyeg�ben azonos $c = 5 be�r�s�val. A f�ggv�nyek olyan kifejez�sek, amelyeknek az �rt�ke a visszat�r�si �rt�k�k. Mivel foo() 5-tel t�r vissza, a 'foo()' kifejez�s �rt�ke 5. �ltal�ban a f�ggv�nyek nem arra haszn�latosak, hogy egy bedr�tozott sz�mmal t�rjenek vissza, hanem valamilyen sz�molt sz�rmaztatott �rt�kkel.

Term�szetesen a v�ltoz�knak a PHP-ben nem kell eg�sznek lenni�k, �s nagyon gyakran nem is azok. A PHP h�rom f�le skal�rt�pust t�mogat: eg�sz, lebeg�pontos �s sztring �rt�keket (skal�rnak az sz�m�t, amit nem lehet kisebb darabokra bontani, elt�r�en - p�ld�ul - a t�mb�kt�l). A PHP k�t nem skal�r t�pust is t�mogat: a t�mb �s objektum t�pust. Mindegyik�kh�z lehet �rt�ket rendelni, �s mindegyik�k lehet egy f�ggv�ny visszat�r�si �rt�ke.

Eddig a PHP/FI 2 haszn�l�i nem tal�lkoztak semmi k�l�n�ssel. Mindamellett a PHP tov�bbfejleszti a kifejez�s fogalm�t, ahogy azt sok hasonl� nyelv teszi. A PHP egy kifejez�s-orient�lt nyelv, abb�l a szempontb�l, hogy majdnem minden kifejez�s. Tekints�k a p�ld�t, amivel eddig foglalkoztunk: '$a = 5'. L�that�, hogy k�t �rt�ket szerepel benne: az eg�sz konstans '5' �s $a �rt�ke, amelyet az 5 �rt�kkel friss�tett�nk. Az igazs�g azonban az, hogy m�g egy �rt�k is van a kifejez�sben, a mag�� a hozz�rendel�s�. A hozz�rendel�s maga ki�rt�keli az �tadand� �rt�ket, ebben az esetben az 5-�t. Ez azt jelenti gyakorlatilag, hogy a '$a=5', a hat�s�t�l eltekintve egy kifejez�s, amelynek az �rt�ke 5. Ha ez�rt olyasmit �runk, hogy '$b=($a=5)', akkor az olyasmi, mintha '$a=5; $b=5;'-t �rtunk volna (a pontosvessz� jel�li az �ll�t�s v�g�t). Mivel a hozz�rendel�s jobbr�l balra t�rt�nik, ez �rhat� z�r�jelek n�lk�l is: '$b=$a=5'.

A kifejez�s-orient�lts�g m�sik j� p�ld�ja az el�- �s ut�n�vekm�nyes oper�tor. A PHP/FI 2 haszn�l�inak �s sok m�s nyelvet haszn�l�nak ismer�s lehet a v�ltoz�++ �s v�ltoz�-- jel�l�s. Ezek az n�vel� �s cs�kkent� oper�torok. A PHP/FI 2-ben a '$a++'-nek nincs �rt�ke (mert nem kifejez�s), �s ez�rt nem is lehet semmihez hozz�rendelni, vagy valamire haszn�lni. A PHP kiterjesztette az inkrement�l�s/dekrement�l�s lehet�s�geit azzal, hogy ezeket is kifejez�sekk� alak�totta, mint ahogyan a C nyelvben is megtett�k. A PHP-ben a C nyelvhez hasonl�an k�tf�le n�vekm�nyes oper�tor van: el�- �s ut�(n�vekm�nyes). Mindkett� megn�veli a v�ltoz� �rt�k�t, teh�t a v�ltoz� szempontj�b�l n�zve nincs k�l�nbs�g, a kifejez�s �rt�k�ben ann�l ink�bb. A '++$v�ltoz�' form�j� el�n�vekm�nyes a megn�velt �rt�ket adja vissza. (A PHP el�sz�r n�veli a v�ltoz�t, majd ki�rt�keli, innen j�n az 'el�'). A '$v�ltoz�++' alak� ut�n�vekm�nyes a v�ltoz� eredeti �rt�ket adja. (A PHP el�sz�r ki�rt�keli, azt�n n�veli a v�ltoz�t, innen j�n az 'ut�'). [A cs�kkent� oper�torokkal �rtelemszer�en ugyanez a helyzet.]

A kifejez�sek egy gyakori t�pusai az �sszehasonl�t� kifejez�sek. Ezek a kifejez�sek 0-t vagy 1-et adnak, annak megfelel�en, hogy hamisak (FALSE), vagy igazak (TRUE) (ebben a sorrendben). A PHP t�mogatja a > (nagyobb), >= (nagyobb, vagy egyenl�), == (egyenl�), != (nem egyenl�), < (kisebb) �s a <= (kisebb, vagy egyenl�) oper�torokat. Ezeket a kifejez�seket �ltal�ban felt�teles kifejez�sekben szokt�k haszn�lni. Ilyen pl. az if kifejez�s.

Az utols� p�lda, amivel itt foglalkozunk, a kombin�lt hozz�rendel�s-oper�tor kifejez�s. M�r tudhatod, hogy ha $a-t eggyel szeretn�d megn�velni, akkor egyszer�en �rhatod, hogy '$a++' vagy '++$a'. Mi van akkor, hogy ha nem eggyel, hanem 3-mal kell megn�velni? Lehet h�romszor egym�s ut�n �rni, hogy '$a++', de ez nem valami hat�kony �s �dv�z�t� megold�s. Sokkal jobb gyakorlat az '$a=$a+3' haszn�lata. Ez ki�rt�keli az $a + 3-at, �s hozz�rendeli az $a-hoz, amelynek az lesz a v�gs� eredm�nye, hogy $a �rt�ke megn� h�rommal. A PHP-ben - t�bb m�s C-szer� nyelvhaz hasonl�an - enn�l r�videbb form�ban is megadhat�: '$a+=3'. Ez pontosan azt jelenti, hogy "vedd $a �rt�k�t, �s adj�l hozz� h�rmat, �s �rd vissza az eredm�nyt $a-ba". Amellett, hogy r�videbb �s �rthet�bb, m�g gyorsabb is. '$a+=3' �rt�ke, mint egy norm�l �rt�kad�s� a hozz�rendelt �rt�k. Ez persze NEM 3, hanem $a + 3 (hiszen ezt az �rt�ket rendelt�k $a-hoz). Az �sszes t�bbi k�toperandus� oper�tort lehet ilyenform�n hozz�rendel�-oper�tork�nt haszn�lni, p�ld�ul '$a-=5' (kivon 5-�t $a-b�l), '$b*=7' (megszorozza $b-t 7-tel), stb.

L�tezik m�g egy kifejez�s, amely el�g k�l�n�snek t�nhet, hacsak nem l�ttad m�r m�s nyelvekben: a h�romoperandus� felt�teles oper�tor:

$elso ? $masodik : $harmadik

�rt�ke: ha az els� kifejez�s �rt�ke TRUE(nem nulla), akkor a m�sodik r�szkifejez�s, egy�bk�nt a harmadik r�szkifejez�s. Egy seg�t� p�lda:

$b = $todo == 'n�vel' ? $a+5 : $a-5; // $b $a+5 lesz, ha $todo �rt�ke 'n�vel'
                                     // egy�bk�nt $b $a-5 lesz

Ez megegyezik az al�bbi k�ddal:

if ($todo == 'n�vel') $b = $a+5 else $b = $a-5;

Az al�bbi p�lda seg�thet az el�- �s ut�n�vekm�nyes illetve cs�kkent� oper�torok �s kifejez�seik jobb meg�rt�s�ben:

function duplaz($i)
{
    return $i*2;
}

$b = $a = 5;        /*�t�t rendel�nk $a �s $b v�ltoz�khoz */

$c = $a++;          /* ut�n�vekm�nyes, $c 5 lesz, mert
                       el�sz�r $a ki�rt�kel�dik, csak azt�n n� */

$e = $d = ++$b;     /* el�n�vekm�nyes, $b n�velt �rt�ke (6)
                       ad�dik tov�bb $d-nek �s $e-nek */

                    /* itt $d �s $e hat */

$f = duplaz($d++);  /* $d k�tszeres�nek hozz�rendel�se MIEL�TT
                       inkrement�l�dik, 2*6 = 12 lesz $f */

$g = duplaz(++$e);   /* $e k�tszeres�nek hozz�rendel�se MIUT�N
                        inkrement�l�dik 2*7=14 lesz $g */

$h = $g += 10;       /* el�sz�r $g 10-zel n�, �gy 24 lesz az �rt�ke,
                        ez ad�dik tov�bb $h-nak, az is 24 lesz*/

A fejezet elej�n azt �g�rt�k, hogy le�rjuk a k�l�nb�z� utas�t�s-t�pusokat, �s �g�retnek megfelel�en a kifejez�sek lehetnek �ll�t�sok. Nem minden kifejez�s �ll�t�s azonban, mert utas�t�s, amely illeszkedik 'kif' ';' mint�ra, vagyis a pontosvessz�vel folytatod� kifejez�s. A '$b=$a=5;'-ben $a=5 �rv�nyes kifejez�s, de nem �rv�nyes utas�t�s �nmag�ban. A teljes '$b=$a=5;' m�r igen.

M�g egy eml�t�sre m�lt� dolog a kifejez�sek igaz �rt�ke. Sok esetben f�leg felt�teles el�gaz�sokban �s ciklusokban, nem igaz�n �rdekes, hogy a kifejez�snek mi az �rt�ke, csak az, hogy igaz (TRUE) vagy hamis (FALSE). A TRUE �s FALSE konstansok (nev�k nem f�gg a kis- �s nagybet�s �r�sm�dt�l) a PHP k�t lehets�ges logikai �rt�kei. Amikor sz�ks�ges, a kifejez�sek automatikusan logikai �rt�kk� alakulnak. L�sd a t�puskonverzi�kr�l sz�l� fejezetet tov�bbi r�szletek�rt.

A PHP a kifejez�sek egy teljes �s hat�kony megval�s�t�s�t biztos�tja, �s teljes dokument�ci�ja meghaladja e k�zik�nyv kereteit. A fenti p�ld�k r�vil�g�tanak, hogy mi is az a kifejez�s, �s hogyan kell l�trehozni hasznos kifejez�seket. A k�zik�nyv h�tralev� r�sz�ben az expr alatt egy �rv�nyes PHP kifejez�st �rt�nk.

User Contributed Notes
Kifejez�sek
add a note about notes
[email protected]
29-Sep-1999 08:43

boolean expressions short-circuit, currently.
If boolean expression short-circuiting is a feature rather than a coincidence, it should probably be added here... Unless I missed it.

[email protected]
24-Nov-2000 05:01

The ternary conditional operator is a useful way of avoiding inconvenient if statements. They can even be used in the middle of a string concatenation, if you use parentheses.

Example:

if ( $wakka ) {
$string = 'foo' ;
} else {
$string = 'bar' ;
}

The above can be expressed like the following:

$string = $wakka ? 'foo' : 'bar' ;

If $wakka is true, $string is assigned 'foo', and if it's false, $string is assigned 'bar'.

To do the same in a concatenation, try:

$string = $otherString . ( $wakka ? 'foo' : 'bar' ) ;

mircho@_NO_SPAM_abv.bg
23-Jan-2001 06:23

try this

$a = "-1";
$a++;
echo $a;

this prints -2 as a result

to be sure you get what you wanted to get just do this

$a = "-2"
$b = (integer)($a)
and now $b will behave

somebody mentioning strict typing?

[email protected]
12-Mar-2001 05:14

Manual defines "expression is anything that has value", Therefore, parser will give error for following code.

($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,

($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.

[email protected]
13-Sep-2001 05:57

As reported previously, PHP boolean operators seem to short-circuit. What if you want them to do not short-circuit?

Exemple:
$result_of = f1() and f2() and f3()

suppose you want to run f3 even when f1 already returned false.

If you perform some silly tests such as:
echo true + true;
you'll see that indeed, true=1 and false=0 and true+true = 2 (ok. this _is_ silly!)

Anyway, the point is: you could use * (multiplication) instead of 'and', to get a not short-circuiting 'and' and + (sum) to get a not short-circuiting or.


[]s
MaCa

08-Mar-2002 07:20
I found this worked nicely:

echo $var ? "yup" : "nope";

This doesnt work:

echo $var ? "yup";

you need to go:

echo $var ? "yup" : "";

-- there is not space in "", but it may appear that way above

[email protected]
25-May-2002 09:29

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.

[email protected]
27-May-2002 08:30

I actually find the short-circuit aspect of expressions useful. As in:
if ($foo AND Bar()) { echo "OK"; }

where Bar() should only be run if $foo is set, and OK should only be printed if both evaluate to TRUE.

My only concern is if this is the intended result in PHP. In other words, if I code this way will it fail under later releases of PHP?

[email protected]
30-May-2002 01:30

Regarding short-circuit expression, it is a frozen feature, not a coincidence. At least, that's what I read from the URL below.



Now, I sometimes feel the need for BNF-written document to explain PHP syntax to others...does anyone know where I can find one?

[email protected]
16-Jul-2002 07:47

If you need to do something like make sure you dont say '1 days' try this

echo $being-$today.' day'.($begin-$today===1?'':'s').' untill XYZ';

[email protected]
17-Jul-2002 05:08

It should probably be mentioned that the short-circuiting of expressions (mentioned in some of the comments above) is often called "lazy evaluation" (in case someone else searches for the term "lazy" on this page and comes up empty!).
[email protected]
07-Aug-2002 12:06

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

add a note about notes
previousEl�re defini�lt �lland�kOper�toroknext
Last updated: Fri, 30 Aug 2002
show source | credits | stats | mirror sites
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat Aug 31 06:19:44 2002 CEST