-
Notifications
You must be signed in to change notification settings - Fork 0
/
expressions.html
378 lines (357 loc) · 10.9 KB
/
expressions.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
<HTML
><HEAD
><TITLE
>Expressions</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.41"><LINK
REL="HOME"
TITLE="PHP Manual"
HREF="manual.html"><LINK
REL="UP"
TITLE="Language Reference"
HREF="langref.html"><LINK
REL="PREVIOUS"
TITLE="Constants"
HREF="language.constants.html"><LINK
REL="NEXT"
TITLE="Operators"
HREF="language.operators.html"></HEAD
><BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>PHP Manual</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="language.constants.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="language.operators.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="EXPRESSIONS"
>Chapter 9. Expressions</A
></H1
><P
> Expressions are the most important building stones of PHP. In PHP,
almost anything you write is an expression. The simplest yet
most accurate way to define an expression is "anything that has a
value".
</P
><P
> The most basic forms of expressions are constants and variables.
When you type "$a = 5", you're assigning '5' into $a. '5', obviously,
has the value 5, or in other words '5' is an expression with the
value of 5 (in this case, '5' is an integer constant).
</P
><P
> After this assignment, you'd expect $a's value to be 5 as
well, so if you wrote $b = $a, you'd expect it to behave just as
if you wrote $b = 5. In other words, $a is an expression with the
value of 5 as well. If everything works right, this is exactly
what will happen.
</P
><P
> Slightly more complex examples for expressions are functions. For
instance, consider the following function:
<DIV
CLASS="INFORMALEXAMPLE"
><P
></P
><PRE
CLASS="PROGRAMLISTING"
>function foo () {
return 5;
}
</PRE
><P
></P
></DIV
>
</P
><P
> Assuming you're familiar with the concept of functions (if you're
not, take a look at the chapter about functions), you'd assume
that typing <TT
CLASS="LITERAL"
>$c = foo()</TT
> is essentially just like
writing <TT
CLASS="LITERAL"
>$c = 5</TT
>, and you're right. Functions
are expressions with the value of their return value. Since foo()
returns 5, the value of the expression 'foo()' is 5. Usually
functions don't just return a static value but compute something.
</P
><P
> Of course, values in PHP don't have to be integers, and very often
they aren't. PHP supports three scalar value types: integer values,
floating point values and string values (scalar values are values that
you can't 'break' into smaller pieces, unlike arrays, for instance).
PHP also supports two composite (non-scalar) types: arrays and
objects. Each of these value types can be assigned into variables or
returned from functions.
</P
><P
> So far, users of PHP/FI 2 shouldn't feel any change. However, PHP
takes expressions much further, in the same way many other
languages do. PHP is an expression-oriented language, in the
sense that almost everything is an expression. Consider the
example we've already dealt with, '$a = 5'. It's easy to see that
there are two values involved here, the value of the integer
constant '5', and the value of $a which is being updated to 5 as
well. But the truth is that there's one additional value involved
here, and that's the value of the assignment itself. The
assignment itself evaluates to the assigned value, in this case 5.
In practice, it means that '$a = 5', regardless of what it does,
is an expression with the value 5. Thus, writing something like
'$b = ($a = 5)' is like writing '$a = 5; $b = 5;' (a semicolon
marks the end of a statement). Since assignments are parsed in a
right to left order, you can also write '$b = $a = 5'.
</P
><P
> Another good example of expression orientation is pre- and
post-increment and decrement. Users of PHP/FI 2 and many other
languages may be familiar with the notation of variable++ and
variable--. These are increment and decrement operators. In
PHP/FI 2, the statement '$a++' has no value (is not an
expression), and thus you can't assign it or use it in any way.
PHP enhances the increment/decrement capabilities by making
these expressions as well, like in C. In PHP, like in C, there
are two types of increment - pre-increment and post-increment.
Both pre-increment and post-increment essentially increment the
variable, and the effect on the variable is idential. The
difference is with the value of the increment expression.
Pre-increment, which is written '++$variable', evaluates to the
incremented value (PHP increments the variable before reading its
value, thus the name 'pre-increment'). Post-increment, which is
written '$variable++' evaluates to the original value of
$variable, before it was incremented (PHP increments the variable
after reading its value, thus the name 'post-increment').
</P
><P
> A very common type of expressions are comparison expressions.
These expressions evaluate to either 0 or 1, meaning FALSE or TRUE
(respectively). PHP supports > (bigger than), >= (bigger than
or equal to), == (equal), != (not equal), < (smaller than) and <=
(smaller than or equal to). These expressions are most commonly used
inside conditional execution, such as <TT
CLASS="LITERAL"
>if</TT
>
statements.
</P
><P
> The last example of expressions we'll deal with here is combined
operator-assignment expressions. You already know that if you
want to increment $a by 1, you can simply write '$a++' or '++$a'.
But what if you want to add more than one to it, for instance 3?
You could write '$a++' multiple times, but this is obviously not a
very efficient or comfortable way. A much more common practice is
to write '$a = $a + 3'. '$a + 3' evaluates to the value of $a
plus 3, and is assigned back into $a, which results in
incrementing $a by 3. In PHP, as in several other languages
like C, you can write this in a shorter way, which with time would
become clearer and quicker to understand as well. Adding 3 to the
current value of $a can be written '$a += 3'. This means exactly
"take the value of $a, add 3 to it, and assign it back into $a".
In addition to being shorter and clearer, this also results in
faster execution. The value of '$a += 3', like the value of a
regular assignment, is the assigned value. Notice that it is NOT
3, but the combined value of $a plus 3 (this is the value that's
assigned into $a). Any two-place operator can be used in this
operator-assignment mode, for example '$a -= 5' (subtract 5 from
the value of $a), '$b *= 7' (multiply the value of $b by 7), etc.
</P
><P
> There is one more expression that may seem odd if you haven't seen
it in other languages, the ternary conditional operator:
<DIV
CLASS="INFORMALEXAMPLE"
><P
></P
><PRE
CLASS="PROGRAMLISTING"
>$first ? $second : $third</PRE
><P
></P
></DIV
>
If the value of the first subexpression is true (non-zero), then
it the second subexpression is evaluated, and that is the result
of the conditional expression. Otherwise, the third subexpression
is evaluated, and that is the value.
</P
><P
> The following example should help you understand pre- and
post-increment and expressions in general a bit better:
<DIV
CLASS="INFORMALEXAMPLE"
><P
></P
><PRE
CLASS="PROGRAMLISTING"
>function double($i) {
return $i*2;
}
$b = $a = 5; /* assign the value five into the variable $a and $b */
$c = $a++; /* post-increment, assign original value of $a
(5) to $c */
$e = $d = ++$b; /* pre-increment, assign the incremented value of
$b (6) to $d and $e */
/* at this point, both $d and $e are equal to 6 */
$f = double($d++); /* assign twice the value of $d <I
CLASS="EMPHASIS"
>before</I
>
the increment, 2*6 = 12 to $f */
$g = double(++$e); /* assign twice the value of $e <I
CLASS="EMPHASIS"
>after</I
>
the increment, 2*7 = 14 to $g */
$h = $g += 10; /* first, $g is incremented by 10 and ends with the
value of 24. the value of the assignment (24) is
then assigned into $h, and $h ends with the value
of 24 as well. */</PRE
><P
></P
></DIV
>
</P
><P
> In the beginning of the chapter we said that we'll be describing
the various statement types, and as promised, expressions can be
statements. However, not every expression is a statement. In
this case, a statement has the form of 'expr' ';' that is, an
expression followed by a semicolon. In '$b=$a=5;', $a=5 is a
valid expression, but it's not a statement by itself. '$b=$a=5;'
however is a valid statement.
</P
><P
> One last thing worth mentioning is the truth value of expressions.
In many events, mainly in conditional execution and loops, you're
not interested in the specific value of the expression, but only
care about whether it means TRUE or FALSE (PHP doesn't have a
dedicated boolean type). The truth value of expressions in PHP is
calculated in a similar way to perl. Any numeric non-zero numeric
value is TRUE, zero is FALSE. Be sure to note that negative
values are non-zero and are thus considered TRUE! The empty
string and the string "0" are FALSE; all other strings are TRUE.
With non-scalar values (arrays and objects) - if the value
contains no elements it's considered FALSE, otherwise it's
considered TRUE.
</P
><P
> PHP provides a full and powerful implementation of expressions, and
documenting it entirely goes beyond the scope of this manual. The
above examples should give you a good idea about what expressions
are and how you can construct useful expressions. Throughout the
rest of this manual we'll write <TT
CLASS="REPLACEABLE"
><I
>expr</I
></TT
>
to indicate any valid PHP expression.
</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="language.constants.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="manual.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="language.operators.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Constants</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="langref.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Operators</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>