mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-16 00:48:54 +00:00
Started to clean up the structure, adding some content
in place of TODO comments, and more examples. Also cleaned up a bit in the formatting. git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@102552 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
parent
51e24ab11f
commit
69e4f3f0be
1 changed files with 119 additions and 93 deletions
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- $Revision: 1.93 $ -->
|
||||
<!-- $Revision: 1.94 $ -->
|
||||
<chapter id="language.types">
|
||||
<title>Types</title>
|
||||
|
||||
|
@ -7,12 +7,11 @@
|
|||
<title>Introduction</title>
|
||||
|
||||
<simpara>
|
||||
PHP supports eight primitive <!-- (all types are primitive in php) -->
|
||||
types.
|
||||
PHP supports eight primitive types.
|
||||
</simpara>
|
||||
|
||||
<para>
|
||||
Four scalar <!-- (basic, can't be split into parts) --> types:
|
||||
Four scalar types:
|
||||
|
||||
<itemizedlist>
|
||||
|
||||
|
@ -103,10 +102,11 @@
|
|||
</listitem>
|
||||
|
||||
</itemizedlist>
|
||||
|
||||
You may also find some references to the type "double". Consider
|
||||
double the same as float, the two names exist only for historic
|
||||
reasons.
|
||||
</para>
|
||||
|
||||
|
||||
<simpara>
|
||||
The type of a variable is usually not set by the programmer;
|
||||
rather, it is decided at runtime by PHP depending on the context in
|
||||
|
@ -118,13 +118,36 @@
|
|||
linkend="language.expressions">expression</link>, use
|
||||
<function>var_dump</function>.
|
||||
</simpara>
|
||||
<simpara>
|
||||
<para>
|
||||
If you simply want a human-readable representation of the type for
|
||||
debugging, use <function>gettype</function>. To check for a certain type,
|
||||
do <emphasis>not</emphasis> use <function>gettype</function>, but use the
|
||||
<literal>is_<replaceable>type</replaceable></literal> functions.
|
||||
</simpara>
|
||||
<!-- TODO: example(s) would be great -->
|
||||
<literal>is_<replaceable>type</replaceable></literal> functions. Some
|
||||
examples:
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
$bool = TRUE; // a boolean
|
||||
$str = "foo"; // a string
|
||||
$int = 12; // an integer
|
||||
|
||||
echo gettype($bool); // prints out "boolean"
|
||||
echo gettype($str); // prints out "string"
|
||||
|
||||
// If this is an integer, increment it by four
|
||||
if (is_int($int)) {
|
||||
$int += 4;
|
||||
}
|
||||
|
||||
// If $bool is a string, print it out
|
||||
// (does not print out anything)
|
||||
if (is_string($bool)) {
|
||||
echo "String: $bool";
|
||||
}
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
</note>
|
||||
<simpara>
|
||||
If you would like to force a variable to be converted to a certain
|
||||
|
@ -133,22 +156,19 @@
|
|||
use the <function>settype</function> function on it.
|
||||
</simpara>
|
||||
<simpara>
|
||||
Note that a variable may behave in different manners in certain
|
||||
Note that a variable may be evaluated with different values in certain
|
||||
situations, depending on what type it is at the time. For more
|
||||
information, see the section on <link
|
||||
linkend="language.types.type-juggling">Type Juggling</link>.
|
||||
</simpara>
|
||||
|
||||
|
||||
</sect1>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="language.types.boolean">
|
||||
<title>Booleans</title>
|
||||
|
||||
<simpara>
|
||||
This is the easiest type. A <type>boolean</type> expresses a
|
||||
truth value. It can be either &true; or
|
||||
&false;.
|
||||
truth value. It can be either &true; or &false;.
|
||||
</simpara>
|
||||
|
||||
<note>
|
||||
|
@ -162,11 +182,10 @@
|
|||
<para>
|
||||
To specify a boolean literal, use either the keyword &true;
|
||||
or &false;. Both are case-insensitive.
|
||||
<!-- technically they are just constants -->
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
$foo = True; // assign the value TRUE to $foo
|
||||
$foo = True; // assign the value TRUE to $foo
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
|
@ -180,17 +199,18 @@ $foo = True; // assign the value TRUE to $foo
|
|||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
// == is an operator which returns a boolean
|
||||
// == is an operator which test
|
||||
// equality and returns a boolean
|
||||
if ($action == "show_version") {
|
||||
echo "The version is 1.23";
|
||||
}
|
||||
|
||||
// this is not necessary:
|
||||
// this is not necessary...
|
||||
if ($show_separators == TRUE) {
|
||||
echo "<hr>\n";
|
||||
}
|
||||
|
||||
// because you can simply type this:
|
||||
// ...because you can simply type
|
||||
if ($show_separators) {
|
||||
echo "<hr>\n";
|
||||
}
|
||||
|
@ -220,7 +240,7 @@ if ($show_separators) {
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<simpara>the <link linkend="language.types.boolean">boolean</link>
|
||||
&false;<!-- duh... --></simpara>
|
||||
&false; itself</simpara>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<simpara>the <link linkend="language.types.integer">integer</link
|
||||
|
@ -260,12 +280,21 @@ if ($show_separators) {
|
|||
or positive) number!
|
||||
</simpara>
|
||||
</warning>
|
||||
<!-- TODO: add a few examples, for the people only looking at
|
||||
the examples... -->
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
echo gettype((bool) ""); // bool(false)
|
||||
echo gettype((bool) 1); // bool(true)
|
||||
echo gettype((bool) -2); // bool(true)
|
||||
echo gettype((bool) "foo"); // bool(true)
|
||||
echo gettype((bool) 2.3e5); // bool(true)
|
||||
echo gettype((bool) array(12)); // bool(true)
|
||||
echo gettype((bool) array()); // bool(false)
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="language.types.integer">
|
||||
|
@ -303,20 +332,23 @@ $a = 0x1A; # hexadecimal number (equivalent to 26 decimal)
|
|||
]]>
|
||||
</programlisting>
|
||||
</example>
|
||||
<!--
|
||||
Formally the possible structure for integer literals is:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
decimal : [1-9][0-9]*
|
||||
| 0
|
||||
|
||||
decimal : [1-9][0-9]*
|
||||
| 0
|
||||
|
||||
hexadecimal : 0[xX][0-9a-fA-F]+
|
||||
|
||||
octal : 0[0-7]+
|
||||
|
||||
integer : [+-]?decimal
|
||||
| [+-]?hexadecimal
|
||||
| [+-]?octal
|
||||
|
||||
-->
|
||||
hexadecimal : 0[xX][0-9a-fA-F]+
|
||||
|
||||
octal : 0[0-7]+
|
||||
|
||||
integer : [+-]?decimal
|
||||
| [+-]?hexadecimal
|
||||
| [+-]?octal
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
The size of an integer is platform-dependent, although a
|
||||
maximum value of about two billion is the usual value
|
||||
(that's 32 bits signed). PHP does not support unsigned
|
||||
|
@ -372,13 +404,15 @@ var_dump($large_number);
|
|||
<para>
|
||||
There is no integer division operator in PHP.
|
||||
<literal>1/2</literal> yields the <type>float</type>
|
||||
<literal>0.5</literal>. <!-- See ??? for more information. (with the
|
||||
operators, or with type-jug) -->
|
||||
<literal>0.5</literal>. You can cast the value to
|
||||
an integer to always round it downwards, or you can
|
||||
use the <function>round</function> function.
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
var_dump( 25/7 );
|
||||
// output: float(3.5714285714286)
|
||||
var_dump(25/7); // float(3.5714285714286)
|
||||
var_dump((int) (25/7)); // int(3)
|
||||
var_dump(round(25/7)); // float(4)
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
|
@ -420,7 +454,6 @@ var_dump( 25/7 );
|
|||
|
||||
<para>
|
||||
If the float is beyond the boundaries of integer
|
||||
<!-- usually, or is it 'always'? -->
|
||||
(usually <literal>+/- 2.15e+9 = 2^31</literal>),
|
||||
the result is undefined, since the float hasn't
|
||||
got enough precision to give an exact integer result.
|
||||
|
@ -449,7 +482,7 @@ echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
|
|||
<title>From strings</title>
|
||||
<simpara>
|
||||
See <link linkend="language.types.string.conversion">String
|
||||
conversion</link>
|
||||
conversion to numbers</link>
|
||||
</simpara>
|
||||
</sect3>
|
||||
|
||||
|
@ -467,16 +500,7 @@ echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
|
|||
</simpara>
|
||||
</caution>
|
||||
</para>
|
||||
<!--
|
||||
|
||||
IMO, it would more sense as (int) $arr returned the
|
||||
number of elements in $arr. This won't break anything,
|
||||
since this behaviour was never defined before, and
|
||||
(bool)(int) $arr will still behave the same.
|
||||
|
||||
-->
|
||||
</sect3>
|
||||
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
|
@ -485,20 +509,24 @@ echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
|
|||
<para>
|
||||
Floating point numbers (AKA "floats", "doubles" or "real numbers") can be
|
||||
specified using any of the following syntaxes:
|
||||
<synopsis>
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
$a = 1.234; $a = 1.2e3; $a = 7E-10;
|
||||
</synopsis>
|
||||
<!--
|
||||
|
||||
LNUM [0-9]+
|
||||
DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
|
||||
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
||||
|
||||
-->
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
Formally:
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
LNUM [0-9]+
|
||||
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
|
||||
EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
The size of a float is platform-dependent,
|
||||
although a maximum of ~1.8e308 with a precision of roughly 14
|
||||
decimal digits is a common value (that's 64 bit IEEE format).
|
||||
</para>
|
||||
|
||||
<warning id="warn.float-precision">
|
||||
<title>Floating point precision</title>
|
||||
<para>
|
||||
|
@ -526,14 +554,16 @@ EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
|||
</para>
|
||||
</warning>
|
||||
|
||||
<!-- TODO: add more info -->
|
||||
<sect2 id="language.types.float.casting">
|
||||
<title>Converting to float</title>
|
||||
|
||||
<para>
|
||||
For information on when and how strings are converted to floats,
|
||||
see the section titled <link linkend="language.types.string.conversion">String
|
||||
conversion to numbers</link>.
|
||||
conversion to numbers</link>. For values of other types, the conversion
|
||||
is the same as if the value would have been converted to integer
|
||||
and then to float. See the <link linkend="language.types.integer.casting">Converting
|
||||
to integer</link> section for more information.
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
@ -544,10 +574,8 @@ EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
|||
A <type>string</type> is series of characters. In PHP,
|
||||
a character is the same as a byte, that is, there are exactly
|
||||
256 different characters possible. This also implies that PHP
|
||||
has no native support of Unicode.
|
||||
<!-- how about unicode? will we support that eventually? Are
|
||||
there current any ways to work with unicode?
|
||||
-->
|
||||
has no native support of Unicode. See <function>utf8_enncode</function>
|
||||
and <function>utf8_decode</function> for some Unicode support.
|
||||
</para>
|
||||
<note>
|
||||
<simpara>
|
||||
|
@ -589,19 +617,19 @@ EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
|||
enclose it in single quotes (the character <literal>'</literal>).
|
||||
</para>
|
||||
<para>
|
||||
To specify a literal single
|
||||
To specify a literal single
|
||||
quote, you will need to escape it with a backslash
|
||||
(<literal>\</literal>), like in many other languages.
|
||||
If a backslash needs to occur before a single quote or at
|
||||
the end of the string, you need to double it.
|
||||
Note that if you try to escape any
|
||||
other character, the backslash too will be printed! So
|
||||
other character, the backslash will also be printed! So
|
||||
usually there is no need to escape the backslash itself.
|
||||
<note>
|
||||
<simpara>
|
||||
In PHP 3, a warning will
|
||||
be issued at the <literal>E_NOTICE</literal> level when this
|
||||
happens.
|
||||
happens.
|
||||
</simpara>
|
||||
</note>
|
||||
<note>
|
||||
|
@ -614,8 +642,8 @@ EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
|
|||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
echo 'this is a simple string';
|
||||
echo 'You can also have embedded newlines in strings,
|
||||
like this way.';
|
||||
echo 'You can also have embedded newlines in strings
|
||||
this way';
|
||||
echo 'Arnold once said: "I\'ll be back"';
|
||||
// output: ... "I'll be back"
|
||||
echo 'Are you sure you want to delete C:\\*.*?';
|
||||
|
@ -692,7 +720,7 @@ echo 'I am trying to include at this point: \n a newline';
|
|||
backslash will be printed too!
|
||||
</para>
|
||||
<para>
|
||||
But the most important pre of double-quoted strings
|
||||
But the most important feature of double-quoted strings
|
||||
is the fact that variable names will be expanded.
|
||||
See <link linkend="language.types.string.parsing">string
|
||||
parsing</link> for details.
|
||||
|
@ -706,10 +734,10 @@ echo 'I am trying to include at this point: \n a newline';
|
|||
("<<<"). One should provide an identifier after
|
||||
<literal><<<</literal>, then the string, and then the
|
||||
same identifier to close the quotation.
|
||||
</simpara>
|
||||
</simpara>
|
||||
<simpara>
|
||||
The closing identifier <emphasis>must</emphasis> begin in the
|
||||
first column of the line. Also, the identifier used must follow
|
||||
first column of the line. Also, the identifier used must follow
|
||||
the same naming rules as any other label in PHP: it must contain
|
||||
only alphanumeric characters and underscores, and must start with
|
||||
a non-digit character or underscore.
|
||||
|
@ -776,14 +804,13 @@ EOT;
|
|||
Heredoc support was added in PHP 4.
|
||||
</para>
|
||||
</note>
|
||||
|
||||
</sect3>
|
||||
|
||||
<sect3 id="language.types.string.parsing">
|
||||
<title>Variable parsing</title>
|
||||
<simpara>
|
||||
When a string is specified in double quotes or with
|
||||
heredoc, variables are
|
||||
parsed within it.
|
||||
heredoc, variables are parsed within it.
|
||||
</simpara>
|
||||
<simpara>
|
||||
There are two types of syntax, a
|
||||
|
@ -795,11 +822,10 @@ EOT;
|
|||
to parse a variable, an array value, or an object property.
|
||||
</simpara>
|
||||
<simpara>
|
||||
The complex syntax was introduced in PHP 4,
|
||||
<!-- XXX was it? and starting with what version exactly? -->
|
||||
and can be recognised
|
||||
The complex syntax was introduced in PHP 4, and can be recognised
|
||||
by the curly braces surrounding the expression.
|
||||
</simpara>
|
||||
|
||||
<sect4 id="language.types.string.parsing.simple">
|
||||
<title>Simple syntax</title>
|
||||
<simpara>
|
||||
|
@ -813,7 +839,7 @@ EOT;
|
|||
<![CDATA[
|
||||
$beer = 'Heineken';
|
||||
echo "$beer's taste is great"; // works, "'" is an invalid character for varnames
|
||||
echo "He drank some $beers"; // won't work, 's' is a valid character for varnames
|
||||
echo "He drank some $beers"; // won't work, 's' is a valid character for varnames
|
||||
echo "He drank some ${beer}s"; // works
|
||||
]]>
|
||||
</programlisting>
|
||||
|
@ -827,19 +853,17 @@ echo "He drank some ${beer}s"; // works
|
|||
the one with variables.
|
||||
|
||||
<!-- XXX isn't &true; :(, this would be the trick
|
||||
Also,
|
||||
the same trick with curly-braces works if you
|
||||
want to limit the greediness of parsers (aren't they
|
||||
paying them enough or something?).
|
||||
Also, the same trick with curly-braces works if you
|
||||
want to limit the greediness of parsers.
|
||||
-->
|
||||
|
||||
</simpara>
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
$fruits = array( 'strawberry' => 'red' , 'banana' => 'yellow' );
|
||||
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
|
||||
|
||||
// note that this works differently outside string-quotes.
|
||||
// note that this works differently outside string-quotes
|
||||
echo "A banana is $fruits[banana].";
|
||||
|
||||
echo "This square is $square->width meters broad.";
|
||||
|
@ -860,6 +884,7 @@ echo "This square is $square->{width}00 centimeters broad.";
|
|||
For anything more complex, you should use the complex syntax.
|
||||
</simpara>
|
||||
</sect4>
|
||||
|
||||
<sect4 id="language.types.string.parsing.complex">
|
||||
<title>Complex (curly) syntax</title>
|
||||
<simpara>
|
||||
|
@ -912,8 +937,9 @@ echo "I'd like to have another {${ strrev('reeb') }}, hips";
|
|||
</para>
|
||||
<note>
|
||||
<simpara>
|
||||
For backwards compatibility, you can still use the array-braces.
|
||||
However, this syntax is deprecated as of PHP 4.
|
||||
For backwards compatibility, you can still use array-braces
|
||||
for the same purpose. However, this syntax is deprecated as
|
||||
of PHP 4.
|
||||
</simpara>
|
||||
</note>
|
||||
<para>
|
||||
|
|
Loading…
Reference in a new issue