PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<ConstantenOperators>
view the version of this page
Last updated: Tue, 22 Apr 2003

Hoofdstuk 10. Expressies

Expressies zijn de belangrijkste bouwstenen van PHP. In PHP is bijna alles wat je schrijft een expressie. De eenvoudigste en meest accurate manier om een expressie te defineren is "alles dat een waarde heeft".

De basis vorm van expressies zijn constanten en variabelen. Als je typt "$a = 5", dan geef je $a de waarde '5'. '5', heeft als waarde (natuulijk) 5, of met andere woorden '5' is een expressie met de waarde 5 (in dit voorbeeld, '5' is een integer constante).

Na deze toekenning verwacht je dat de waarde van $a ook 5 zal zijn, en als je nu zou schrijven $b = $a, dan verwacht je dat dit precies hetzelfde zal doen als $b = 5. Met andere woorden, $a is ook een expressie met de waarde 5. Als alles werkt zoals het hoort, zal $b dus ook de waarde 5 krijgen.

Wat complexere voorbeelden van expressies zijn functies. Kijk bijvoorbeeld naar de volgende functie:

function foo () {
    return 5;
}

Aangenomen dat je bekend met met het concept 'functiens' (als je dit niet bent kijk dan in het hoofdstukk over functies), verwacht je dat het typen van $c = foo() in essentie precies hetzelfde is als het typen van $c = 5, en dit is ook waar. Functies zijn expressies met de waarde die gelijk is aan de return waarde van de functie. Omdat foo() 5 teruggeeft, is de waarde van de expressie 'foo()' 5. Normaal gesproken retourneren functies geen statische waarden natuurlijk, maar berekenen ze iets.

Natuurlijk kunnen waarden in PHP ook iets anders zijn dan integers. PHP ondersteund drie scalaire types: integers, floating points en strings. (Scalaire types hebben waardes die je niet in kleinere stukken kunt breken, dit in tegenstelling tot bijvoorbeeld array's). PHP ondersteund ook twee niet scalaire types: array's en objecten Al deze types kunnen worden toegekend aan variabelen of worden teruggegeven uit functies.

Tot zover zullen de gebruikers van PHP/FI 2 geen verschil merken, maar PHP gaat veel verder met expressies, op dezelfde manier als veel andere talen doen. PHP is een expressie-geori�nteerde taal waarbij bijna alles een expressie is. Neem bijvoorbeeld het voorbeeld dat je eerder hebt gezien: '$a = 5'. Het is eenvoudig te zien dat het hier om twee waardes gaat, de waarde van de integer constante '5' en de waarde van $a waaraan 5 wordt toegekend. Maar in werkelijkheid is er nog een waarde, en deze waarde is de waarde van de toekenning zelf. De toekenning zelf evalueert tot de toegekende waarde, in dit geval 5. Dit betekend dat '$a = 5', terzijde gelegd wat het doet, een expressies is met de waarde 5. Dus als je zou schrijven: '$b = ($a = 5)' gebeurd er precies als je zou schrijven: '$a = 5; $b = 5;' (een puntkomma markeerd het einde van een statement). Omdat toekenningen worden geparsed van rechts naar links, zou je ook kunnen schrijven '$b = $a = 5'.

Een ander goed voorbeeld van expressie ori�ntatie zijn pre- en post-increment en decrement. Gebruikers van PHP/FI 2 en vele andere talen zullen wellicht de notatie variabele++ en variable-- kunnen. Dit zijn de increment en decrement operaties. In PHP/FI 2, heeft het statement '$a++' geen waarde (het is geen expressie), en daarom kun je het niet toewijzen of gebruiken op een andere manier. PHP voegt increment/decrement toe aan de expressies, net zoals dit in C is. In PHP zijn er twee types of increment, pre-increment en post-increment. Zowel pre-increment en post-increment verhogen de variabele, en het effect op de variabele is identiek. Het verschil ligt hem aan de waarde van de totale increment expressie. Pre-increment, dat wordt geschreven als '++$variable', evaluaeerd tot de opgehoogde waarde (PHP increments de variabele voordat de waarde wordt gelezen, vandaar de naam 'pre-increment'). Post-increment, dat wordt geschreven als '$variable++' evalueert tot de oorspronkelijke waarde van $variable, voordat deze is opgehoogd (PHP increments de variable nadat deze is uitgelezen, vandaar de naam 'post-increment').

Andere normale expressies zijn vergelijkings expressies. Deze expressies evalueren tot 0 of 1 (dit betekent respectievelijk FALSE en TRUE). PHP ondersteund > (groter dan), >= (groter dan of gelijk aan), == (gelijk), != (niet gelijk), < (kleiner dan) en <= (kleinder dan of gelijk aan). Deze expressies worden meestal gebruikt binnen conditionele statements, zoals if statements.

Het laatste type expressies waar we het over zullen hebben zijn gecombineerde operatie-toewijzings expressies. Je weet al dat als je $a wilt verminderen met 1, je '$a++' of '++$a' kunt schrijven. Maar wat als je er meer wailt afhalen, bijvoorbeeld 3? Je zou natuurlijk vaker '$a++' kunnen scjrijven, maar dit is natuurlijk niet effici� of handig. Veel vaker wordt er geschreven '$a = $a + 3'. '$a + 3' evaluaeerd tot de waarde van $a plus 3, en wordt dan weer teruggewezen aan $a, dit resulteert in een nieuwe waarde van $a die 3 onder d ehuidige waarde ligt. In PHP, en in vele andere talen waaronder C, kun je dit korter schrijven, zodat het makkelijker leest en sneller te begrijpen is. Het ophogen van de huidige waarde van $a met 3 kan worden geschreven als '$a += 3'. Dit betekend "neem de waarde van $a, tel er 3 bij op, en ken het weer toe aan $a". Als derde voordeel (naast korter en makkelijker te lezen, zal het statement ook sneller worden uitgevoerd. De waarde van '$a += 3', is net zoals de waarde van een normale toekenning, de toegekende waarde. Begrijp goed dat dit NIET 3 is, maar de gecombineerde waarde van $a plus 3 (dit is namelijk de waarde die wordt toegekend aan $a). Elke binairy operator kan worden gebruikt voor deze operatie-toekennings mode, bijvoorbeeld '$a -= 5' (verminder de waarde van $a met 5), '$b *= 7' (vermenigvuldig de waarde van $b met 7), enz.

Er is nog een expressie die vreemd zal lijken als je het nog niet hebt gezien in andere talen, namelijk ternaire conditionele operator:

$eerste ? $tweede : $derde

Als de waarde van de eerste sub-expressie waar is (niet-nul), dan worde de tweede sub-expressie geevalueerd, en dit resultaat zijn van de conditionele expressie. Anders worde de derde sub-expressie geevalueerd, en wordt dit de waarde van de operatie.

Het volgende voorbeeld helpt je met het beter begrijpen van pre- en post-increment en expressies in het algemeen:

function dubbel($i) {
    return $i*2;
}
$b = $a = 5;        /* ken de waarde 5 toe aan de variabelen $a en $b */
$c = $a++;          /* post-increment, ken de originele waarde van $a 
                       (5) toe aan $c */
$e = $d = ++$b;     /* pre-increment, ken de opgehoogde waarde van 
                       $b (6) toe aan $d en $e */

/* op dit punt zijn $d en $e beide gelijk aan 6 */

$f = double($d++);  /* ken twee keer de waarde van $d voor 
                       de ophoging, 2*6 = 12 toe aan $f */
$g = double(++$e);  /* ken twee keer de waarde van $e na
                       de ophoging, 2*7 = 14 toe aan $g */
$h = $g += 10;      /* als eerste wordt $g opgehoogd met 10 en eindigt met de 
                       waarde 24. De waarde van de toekenning (24) wordt dan
                       toegekend aan $h, zodat ook $h uiteindelijk de waarde
                       24 krijgt. */

Aan het begin van dit hoofdstuk vertelden we dat we verschillende statement types zouden beschrijven, en zoals is gebleken kunnen expressies statements zijn. Maar niet iederen expressie is een statement. Een statement heeft de vorm 'expressie' ';' dat is een expressie gevolgt door een punt-komma. In '$b=$a=5;' is $a=5 een geldige expressie, maar niet een statement. '$b=$a=5;' is wel een geldig statement in dit voorbeeld.

Er is nog een laatste ding waar we het over willende hebben, en dat is de waarheids-waarde van expressies. In veel gevallen, vaak in loops en andere conditionele dingen, ben je niet ge�nteresseerd in een specifieke waarde, maar alleen of deze waarde TRUE of FALSE betekent. (PHP heeft geen appart boolean type). De waarheidswaarde van expressies in PHP is hetzelfde als dat in Perl. Allen numerieke niet-nul waarden zijn TRUE, 0 is FALSE. Let erop negatieve waardes ook niet-nul zijn en daarom de waarheids-waarde TRUE is!. De lege string en de string "0" zijn ook FALSE; alle andere strings zijn TRUE. In het geval van niet scalaire waarden (array's en objecten) is de waardheids- waarde FALSE als deze geen elementen bevat, anders evalueren ze tot TRUE.

PHP heeft een volledige en krachtige implementatie van expressie, en om dit te documenteren gaat geheel buiten de scope van deze handleiding. De bovenstaande voorbeelden zouden je een goed idee moeten geen over wat expressies zijn en hoe je ze goed kan construeren. In de rest van deze handleiding zullen we expr schrijven om een geldige PHP expressie aan te geven.



User Contributed Notes
Expressies
add a note add a note
anthony at n dot o dot s dot p dot a dot m dot trams dot com
24-Nov-2000 06: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 at _NO_SPAM_abv dot bg
23-Jan-2001 07: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?

yasuo_ohgaki at hotmail dot com
12-Mar-2001 06: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.

tmacamNOSP at Mufc dot br
13-Sep-2001 06: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 08: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

Mattias at mail dot ee
25-May-2002 10: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.

toreilly at cityspree dot com
27-May-2002 09: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?

tai at iij dot ad dot jp
30-May-2002 02: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?

iamfast at tampabay dot rr dot com
16-Jul-2002 08: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';

php at cotest dot com
17-Jul-2002 06: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!).
oliver at hankeln-online dot de
07-Aug-2002 01: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

rainerd at eldwood dot com
23-Dec-2002 07:01

"Any two-place operator can be used in this operator-assignment mode."

It should be mentioned that this does not apply to the comparison operators.  $a <= $b is obviously not the same as $a = $a < $b.

stian at datanerd dot net
25-Feb-2003 09:37

The short-circuit feature is indeed intended, and there are two types of evaluators, those who DO short-circuit, and those who DON'T, || / && and | / & respectively.
The latter method is the bitwise operators, but works great with the usual boolean values ( 0/1 )

So if you don't want short-circuiting, try using the | and & instead.

Read more about the bitwise operators here:

Ruben Bonke
08-Apr-2003 11:03

In case you want to check whether an INT is even or uneven, you could use the % operator. In the example below it has been put into an if-statement.

<?php

 //Sets the variable a
$a=2;

 //Start checking
 if (($a%2)==0) {
  print "This is an even number";     //TRUE
} else {
  print "This is an uneven number";  //FALSE
}

?>

How does it work?
$a%2: constantly substract 2 from int a.
if put in an if-statement like above, it keeps on substracting 2 from int a, until value is exactly 0 or lower than 2 and higher than 0.

Another example.

<?php
 
$a=9;
 $b=8;
 $c=7;

 $outcome_A = $a % 3;
 $outcome_B = $b % 3;
 $outcome_C = $c % 3;

 print $outcome_A;  // result: 0
 print $outcome_B;  // result: 2
 print $outcome_C;  // result: 1

?>

I find this function useful for webdesign purposes.
For instance to colour the background of every even entry of database output.

Miki
20-Apr-2003 01:24

It appears to me that % is simply the same as % in C++ which is the modulus operator.

modulus  - Returns the remainder obtained by dividing the first argument by the second argument.

So in the example above it's not subtracting 2 from it and returning the result, it's dividing $a by 2 and returning the remainder.

cmartin at orlando dot fl
20-Apr-2003 06:34

Got into trouble here when not enclosing my multiple expressions in parenthesis:

  if ($res = mysql_query($query) && $row = mysql_fetch_assoc($res))
  {
      echo "Got DB Row!: ";
      print_r($row);
  }

Results in a PHP warning:

  PHP Warning:  mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in test.php on line 10

  Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in test.php on line 10

By adding parenthesis around the assignment expressions...

  if (($res = mysql_query($query)) && ($row = mysql_fetch_assoc($res))) {
      echo "Got DB Row!: ";
      print_r($row);
  }

...results in the desired output:

  Got DB Row!: Array
  (
      [id] => 0
      [name] => "Foo!"
  )

A closer look at what happens when the right value of an assignment is false (when used as a test expression):

  $a = 0;

  if ($b = $a && $c = $b) {
      echo "Test true: ";
  }
  echo "a:$a b:$b c:$c";

...yields $b and $c as unset:

  a:0 b: c:

...while parenthesis modify $b's result:

  $a = 0;

  if (($b = $a) && ($c = $b)) {
      echo "Test true: ";
  }
  echo "a:$a b:$b c:$c";

...as $b being set and $c remaining unset (desired):

  a:0 b:0 c:

One may want to always enclose their singular expressions within parenthesis to avoid this feature/problem. :)

add a note add a note

<ConstantenOperators>
 Last updated: Tue, 22 Apr 2003
show source | credits | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by: /
Last updated: Sat May 24 21:09:36 2003 CEST