mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-15 16:38:54 +00:00

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@351133 c90b9560-bf6c-de11-be94-00142212c4b1
238 lines
11 KiB
XML
238 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<chapter xml:id="language.expressions" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Expressions</title>
|
|
<simpara>
|
|
Expressions are the most important building blocks 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".
|
|
</simpara>
|
|
<simpara>
|
|
The most basic forms of expressions are constants and variables.
|
|
When you type "<varname>$a</varname> = 5", you're assigning '5' into
|
|
<varname>$a</varname>. '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).
|
|
</simpara>
|
|
<simpara>
|
|
After this assignment, you'd expect <varname>$a</varname>'s value to be 5 as
|
|
well, so if you wrote <varname>$b</varname> = <varname>$a</varname>, you'd expect it to behave just as
|
|
if you wrote <varname>$b</varname> = 5. In other words, <varname>$a</varname> is an expression with the
|
|
value of 5 as well. If everything works right, this is exactly
|
|
what will happen.
|
|
</simpara>
|
|
<para>
|
|
Slightly more complex examples for expressions are functions. For
|
|
instance, consider the following function:
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
function foo ()
|
|
{
|
|
return 5;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<simpara>
|
|
Assuming you're familiar with the concept of functions (if you're
|
|
not, take a look at the chapter about <link
|
|
linkend="language.functions">functions</link>), you'd assume
|
|
that typing <literal>$c = foo()</literal> is essentially just like
|
|
writing <literal>$c = 5</literal>, and you're right. Functions
|
|
are expressions with the value of their return value. Since <literal>foo()</literal>
|
|
returns 5, the value of the expression '<literal>foo()</literal>' is 5. Usually
|
|
functions don't just return a static value but compute something.
|
|
</simpara>
|
|
<simpara>
|
|
Of course, values in PHP don't have to be integers, and very often
|
|
they aren't. PHP supports four scalar value types: <type>int</type>
|
|
values, floating point values (<type>float</type>), <type>string</type>
|
|
values and <type>bool</type> 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.
|
|
</simpara>
|
|
<simpara>
|
|
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, '<varname>$a</varname> = 5'. It's easy to see that
|
|
there are two values involved here, the value of the integer
|
|
constant '5', and the value of <varname>$a</varname> 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 '<varname>$a</varname> = 5', regardless of what it does,
|
|
is an expression with the value 5. Thus, writing something like
|
|
'<varname>$b</varname> = (<varname>$a</varname> = 5)' is like writing
|
|
'<varname>$a</varname> = 5; <varname>$b</varname> = 5;' (a semicolon
|
|
marks the end of a statement). Since assignments are parsed in a
|
|
right to left order, you can also write '<varname>$b</varname> = <varname>$a</varname> = 5'.
|
|
</simpara>
|
|
<simpara>
|
|
Another good example of expression orientation is pre- and
|
|
post-increment and decrement. Users of PHP and many other
|
|
languages may be familiar with the notation of <literal>variable++</literal> and
|
|
<literal>variable--</literal>. These are <link linkend="language.operators.increment">
|
|
increment and decrement operators</link>. 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 identical. The
|
|
difference is with the value of the increment expression.
|
|
Pre-increment, which is written '++<varname>$variable</varname>', evaluates to the
|
|
incremented value (PHP increments the variable before reading its
|
|
value, thus the name 'pre-increment'). Post-increment, which is
|
|
written '<varname>$variable</varname>++' evaluates to the original value of
|
|
$variable, before it was incremented (PHP increments the variable
|
|
after reading its value, thus the name 'post-increment').
|
|
</simpara>
|
|
<simpara>
|
|
A very common type of expressions are <link
|
|
linkend="language.operators.comparison">comparison</link>
|
|
expressions. These expressions evaluate to either &false; or &true;. PHP
|
|
supports > (bigger than), >= (bigger than or equal to), == (equal),
|
|
!= (not equal), < (smaller than) and <= (smaller than or equal to).
|
|
The language also supports a set of strict equivalence operators: ===
|
|
(equal to and same type) and !== (not equal to or not same type).
|
|
These expressions are most commonly used inside conditional execution,
|
|
such as <literal>if</literal> statements.
|
|
</simpara>
|
|
<simpara>
|
|
The last example of expressions we'll deal with here is combined
|
|
operator-assignment expressions. You already know that if you
|
|
want to increment <varname>$a</varname> by 1, you can simply write
|
|
'<varname>$a</varname>++' or '++<varname>$a</varname>'.
|
|
But what if you want to add more than one to it, for instance 3?
|
|
You could write '<varname>$a</varname>++' multiple times, but this
|
|
is obviously not a very efficient or comfortable way. A much more
|
|
common practice is to write '<varname>$a</varname> =
|
|
<varname>$a</varname> + 3'. '<varname>$a</varname> + 3' evaluates
|
|
to the value of <varname>$a</varname> plus 3, and is assigned back
|
|
into <varname>$a</varname>, which results in incrementing <varname>$a</varname>
|
|
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 <varname>$a</varname>
|
|
can be written '<varname>$a</varname> += 3'. This means exactly
|
|
"take the value of <varname>$a</varname>, add 3 to it, and assign it
|
|
back into <varname>$a</varname>". In addition to being shorter and
|
|
clearer, this also results in faster execution. The value of
|
|
'<varname>$a</varname> += 3', like the value of a regular assignment, is
|
|
the assigned value. Notice that it is NOT 3, but the combined value
|
|
of <varname>$a</varname> plus 3 (this is the value that's
|
|
assigned into <varname>$a</varname>). Any two-place operator can be used
|
|
in this operator-assignment mode, for example '<varname>$a</varname> -= 5'
|
|
(subtract 5 from the value of <varname>$a</varname>), '<varname>$b</varname> *= 7'
|
|
(multiply the value of <varname>$b</varname> by 7), etc.
|
|
</simpara>
|
|
<para>
|
|
There is one more expression that may seem odd if you haven't seen
|
|
it in other languages, the ternary conditional operator:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$first ? $second : $third
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
If the value of the first subexpression is &true; (non-zero), then
|
|
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.
|
|
</para>
|
|
<para>
|
|
The following example should help you understand pre- and
|
|
post-increment and expressions in general a bit better:
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
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 before
|
|
the increment, 2*6 = 12 to $f */
|
|
$g = double(++$e); /* assign twice the value of $e after
|
|
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. */
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<simpara>
|
|
Some expressions can be considered as statements. In
|
|
this case, a statement has the form of '<literal>expr ;</literal>' that is, an
|
|
expression followed by a semicolon. In <literal>'$b = $a = 5;'</literal>,
|
|
<literal>'$a = 5'</literal> is a valid expression, but it's not a statement
|
|
by itself. <literal>'$b = $a = 5;'</literal> however is a valid statement.
|
|
</simpara>
|
|
<simpara>
|
|
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) : WRONG, PHP does. -->
|
|
|
|
The constants &true; and &false; (case-insensitive) are the two
|
|
possible boolean values. When necessary, an expression is
|
|
automatically converted to boolean. See the
|
|
<link linkend="language.types.typecasting">section about
|
|
type-casting</link> for details about how.
|
|
</simpara>
|
|
<simpara>
|
|
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 <varname>expr</varname>
|
|
to indicate any valid PHP expression.
|
|
</simpara>
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|