philip Wed Jan 22 18:55:57 2003 EDT
Modified files:
/phpdoc/en/language types.xml
Log:
Expanded string and array information including many example updates, many
more manual links, and a little cleanup. Added a decent amount of information
on using arrays within strings and further explained $foo[bar]. This also closes
bug #20601
Index: phpdoc/en/language/types.xml
diff -u phpdoc/en/language/types.xml:1.105 phpdoc/en/language/types.xml:1.106
--- phpdoc/en/language/types.xml:1.105 Tue Jan 21 02:27:50 2003
+++ phpdoc/en/language/types.xml Wed Jan 22 18:55:56 2003
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.105 $ -->
+<!-- $Revision: 1.106 $ -->
<chapter id="language.types">
<title>Types</title>
@@ -667,16 +667,25 @@
<![CDATA[
<?php
echo 'this is a simple string';
-echo 'You can also have embedded newlines in strings
-this way';
+
+echo 'You can also have embedded newlines in
+strings this way as it is
+okay to do';
+
+// Outputs: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
-// output: ... "I'll be back"
-echo 'Are you sure you want to delete C:\\*.*?';
-// output: ... delete C:\*.*?
-echo 'Are you sure you want to delete C:\*.*?';
-// output: ... delete C:\*.*?
-echo 'I am trying to include at this point: \n a newline';
-// output: ... this point: \n a newline
+
+// Outputs: You deleted C:\*.*?
+echo 'You deleted C:\\*.*?';
+
+// Outputs: You deleted C:\*.*?
+echo 'You deleted C:\*.*?';
+
+// Outputs: This will not expand: \n a newline
+echo 'This will not expand: \n a newline';
+
+// Outputs: Variables do not $expand $either
+echo 'Variables do not $expand $either';
?>
]]>
</programlisting>
@@ -847,7 +856,8 @@
<title>Variable parsing</title>
<simpara>
When a string is specified in double quotes or with
- heredoc, variables are parsed within it.
+ heredoc, <link linkend="language.variables">variables</link> are
+ parsed within it.
</simpara>
<simpara>
There are two types of syntax, a
@@ -856,7 +866,8 @@
<link linkend="language.types.string.parsing.complex">complex</link>
one.
The simple syntax is the most common and convenient, it provides a way
- to parse a variable, an array value, or an object property.
+ to parse a variable, an <type>array</type> value, or an <type>
+ object</type> property.
</simpara>
<simpara>
The complex syntax was introduced in PHP 4, and can be recognised
@@ -879,14 +890,15 @@
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 ${beer}s"; // works
+echo "He drank some {$beer}s"; // works
?>
]]>
</programlisting>
</informalexample>
<simpara>
- Similarly, you can also have an array index or an object
- property parsed. With array indices, the closing square bracket
- (<literal>]</literal>) marks the end of the index. For
+ Similarly, you can also have an <type>array</type> index or an <type>
+ object</type> property parsed. With array indices, the closing square
+ bracket (<literal>]</literal>) marks the end of the index. For
object properties the same rules apply as to simple variables,
though with object properties there doesn't exist a trick like
the one with variables.
@@ -901,11 +913,32 @@
<programlisting role="php">
<![CDATA[
<?php
+// These examples are specific to using arrays inside of strings.
+// When outside of a string, always quote your array string keys
+// and do not use {braces} when outside of strings either.
+
+// Let's show all errors
+error_reporting(E_ALL);
+
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
-// note that this works differently outside string-quotes
+// Works but note that this works differently outside string-quotes
echo "A banana is $fruits[banana].";
+// Works
+echo "A banana is {$fruits['banana']}.";
+
+// Works but PHP looks for a constant named banana first
+// as described below.
+echo "A banana is {$fruits[banana]}.";
+
+// Won't work, use braces. This results in a parse error.
+echo "A banana is $fruits['banana'].";
+
+// Works
+echo "A banana is " . $fruits['banana'] . ".";
+
+// Works
echo "This square is $square->width meters broad.";
// Won't work. For a solution, see the complex syntax.
@@ -944,18 +977,39 @@
<programlisting role="php">
<![CDATA[
<?php
+// Let's show all errors
+error_reporting(E_ALL);
+
$great = 'fantastic';
-echo "This is { $great}"; // won't work, outputs: This is { fantastic}
-echo "This is {$great}"; // works, outputs: This is fantastic
+
+// Won't work, outputs: This is { fantastic}
+echo "This is { $great}";
+
+// Works, outputs: This is fantastic
+echo "This is {$great}";
+echo "This is ${great}";
+
+// Works
echo "This square is {$square->width}00 centimeters broad.";
+
+// Works
echo "This works: {$arr[4][3]}";
-// This is wrong for the same reason
-// as $foo[bar] is wrong outside a string.
+// This is wrong for the same reason as $foo[bar] is wrong
+// outside a string. In otherwords, it will still work but
+// because PHP first looks for a constant named foo, it will
+// throw an error of level E_NOTICE (undefined constant).
echo "This is wrong: {$arr[foo][3]}";
-echo "You should do it this way: {$arr['foo'][3]}";
+// Works. When using multi-dimensional arrays, always use
+// braces around arrays when inside of strings
+echo "This works: {$arr['foo'][3]}";
+
+// Works.
+echo "This works: " . $arr['foo'][3];
+
echo "You can even write {$obj->values[3]->name}";
+
echo "This is the value of the var named $name: {${$name}}";
?>
]]>
@@ -994,6 +1048,9 @@
$str = 'This is a test.';
$first = $str{0};
+// Get the third character of a string
+$third = $str{2};
+
// Get the last character of a string.
$str = 'This is still a test.';
$last = $str{strlen($str)-1};
@@ -1045,36 +1102,41 @@
is automatically done in the scope of an expression for you where a
string is needed. This happens when you use the <function>echo</function>
or <function>print</function> functions, or when you compare a variable
- value to a string.
+ value to a string. Reading the manual sections on <link
+ linkend="language.types">Types</link> and <link
+ linkend="language.types.type-juggling">Type Juggling</link> will make
+ the following clearer. See also <function>settype</function>.
</para>
<para>
- A boolean &true; value is converted to the string <literal>"1"</literal>,
+ A <type>boolean</type> &true; value is converted to the string
+<literal>"1"</literal>,
the &false; value is represented as <literal>""</literal> (empty string).
This way you can convert back and forth between boolean and string values.
</para>
<para>
- An integer or a floating point number is converted to a string
- representing the number with its digits (includig the exponent part
- for floating point numbers).
+ An <type>integer</type> or a floating point number (<type>float</type>)
+ is converted to a string representing the number with its digits
+ (including the exponent part for floating point numbers).
</para>
<para>
Arrays are always converted to the string <literal>"Array"</literal>,
- so you cannot dump out the contents of an array with <function>echo</function>
- or <function>print</function> to see what is inside them. See the information
- below for more tips.
+ so you cannot dump out the contents of an <type>array</type> with
+ <function>echo</function> or <function>print</function> to see what is inside
+ them. To view one element, you'd do something like <literal>
+ echo $arr['foo']</literal>. See below for tips on dumping/viewing the
+ entire contents.
</para>
<para>
Objects are always converted to the string <literal>"Object"</literal>.
- If you would like to print out the member variable values of an object
- for debugging reasons, read the paragraphs below. If you would
- like to find out the class name of which an object is an instance of,
- use <function>get_class</function>.
+ If you would like to print out the member variable values of an
+ <type>object</type> for debugging reasons, read the paragraphs
+ below. If you would like to find out the class name of which an object
+ is an instance of, use <function>get_class</function>.
</para>
<para>
Resources are always converted to strings with the structure
<literal>"Resource id #1"</literal> where <literal>1</literal> is
- the unique number of the resource assigned by PHP during runtime.
+ the unique number of the <type>resource</type> assigned by PHP during runtime.
If you would like to get the type of the resource, use
<function>get_resource_type</function>.
</para>
@@ -1123,14 +1185,14 @@
<programlisting role="php">
<![CDATA[
<?php
-$foo = 1 + "10.5"; // $foo is float (11.5)
-$foo = 1 + "-1.3e3"; // $foo is float (-1299)
-$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
-$foo = 1 + "bob3"; // $foo is integer (1)
-$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
+$foo = 1 + "10.5"; // $foo is float (11.5)
+$foo = 1 + "-1.3e3"; // $foo is float (-1299)
+$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
+$foo = 1 + "bob3"; // $foo is integer (1)
+$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
-$foo = "10.0 pigs " + 1; // $foo is float (11)
-$foo = "10.0 pigs " + 1.0; // $foo is float (11)
+$foo = "10.0 pigs " + 1; // $foo is float (11)
+$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
]]>
</programlisting>
@@ -1212,7 +1274,10 @@
<programlisting role="php">
<![CDATA[
<?php
-array("foo" => "bar", 12 => true);
+$arr = array("foo" => "bar", 12 => true);
+
+echo $arr["foo"]; // bar
+echo $arr[12]; // 1
?>
]]>
</programlisting>
@@ -1234,7 +1299,11 @@
<programlisting role="php">
<![CDATA[
<?php
-array("somearray" => array(6 => 5, 13 => 9, "a" => 43));
+$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
+
+echo $arr["somearray"][6]; // 5
+echo $arr["somearray"][13]; // 9
+echo $arr["somearray"]["a"]; // 42
?>
]]>
</programlisting>
@@ -1244,7 +1313,7 @@
If you omit a key, the maximum of the integer-indices is taken, and
the new key will be that maximum + 1. As integers can be negative,
this is also true for negative indices. Having e.g. the highest index
- being <literal>-6</literal> will result in being <literal>-5</literal>
+ being <literal>-6</literal> will result in <literal>-5</literal> being
the new key. If no integer-indices exist
yet, the key will be <literal>0</literal> (zero). If you specify a key
that already has a value assigned to it, that value will be overwritten.
@@ -1391,6 +1460,64 @@
automatically for backward compatibility reasons.
</para>
<para>
+ More examples to demonstrate this fact:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+// Let's show all errors
+error_reporting(E_ALL);
+
+$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
+
+// Correct
+print $arr['fruit']; // apple
+print $arr['veggie']; // carrot
+
+// Incorrect. This works but also throws a PHP error of
+// level E_NOTICE because of an undefined constant named fruit
+//
+// Notice: Use of undefined constant fruit - assumed 'fruit' in...
+print $arr[fruit]; // apple
+
+// Let's define a constant to demonstrate what's going on. We
+// will assign value 'veggie' to a constant named fruit.
+define('fruit','veggie');
+
+// Notice the difference now
+print $arr['fruit']; // apple
+print $arr[fruit]; // carrot
+
+// The following is okay as it's inside a string. Constants are not
+// looked for within strings so no E_NOTICE error here
+print "Hello $arr[fruit]"; // Hello apple
+
+// With one exception, braces surrounding arrays within strings
+// allows constants to be looked for
+print "Hello {$arr[fruit]}"; // Hello carrot
+print "Hello {$arr['fruit']}"; // Hello apple
+
+// This will not work, results in a parse error such as:
+// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
+// This of course applies to using autoglobals in strings as well
+print "Hello $arr['fruit']";
+print "Hello $_GET['foo']";
+
+// Concatenation is another option
+print "Hello " . $arr['fruit']; // Hello apple
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ When you turn <function>error_reporting</function> up to show
+ <constant>E_NOTICE</constant> level errors (such as setting
+ it to <constant>E_ALL</constant>) then you will see these
+ errors. By default, <link linkend="ini.error-reporting">
+ error_reporting</link> is turned down to not show them.
+ </para>
+ <para>
As stated in the <link linkend="language.types.array.syntax"
>syntax</link> section, there must be an expression between the
square brackets ('<literal>[</literal>' and '<literal>]</literal>').
@@ -1399,7 +1526,7 @@
<programlisting role="php">
<![CDATA[
<?php
-echo $arr[foo(true)];
+echo $arr[somefunc($bar)];
?>
]]>
</programlisting>
@@ -1437,7 +1564,8 @@
because <literal>E_ERROR</literal> equals <literal>1</literal>, etc.
</para>
<para>
- Then, how is it possible that <literal>$foo[bar]</literal> works?
+ As we already explained in the above examples,
+ <literal>$foo[bar]</literal> still works but is wrong.
It works, because <literal>bar</literal> is due to its syntax
expected to be a constant expression. However, in this case no
constant with the name <literal>bar</literal> exists. PHP now
@@ -1456,47 +1584,13 @@
<link linkend="reserved">reserved keywords</link>.
</para>
<note>
- <para>
- When you turn <link linkend="function.error-reporting"
- >error_reporting</link> to <literal>E_ALL</literal>,
- you will see that PHP generates notices whenever an
- <literal>index</literal> is used which is not defined.
- Consider this script:
- <informalexample>
- <programlisting role="php">
-<![CDATA[
-<?php
-
-// Turn on the display of all errors
-error_reporting(E_ALL);
-
-// Define the test array
-$abc = array("x" => "y");
-
-// Access element with the *bad* method
-echo $abc[x];
-
-?>
-]]>
- </programlisting>
- </informalexample>
- The output is:
- <informalexample>
- <programlisting>
-<![CDATA[
-<br />
-<b>Notice</b>: Use of undefined constant x - assumed 'x' in
<b>/path/to/script.php</b> on
-line <b>10</b><br />
-]]>
- </programlisting>
- </informalexample>
- </para>
- </note>
- <note>
<simpara>
- Inside a double-quoted <type>string</type>, another syntax
- is valid. See <link linkend="language.types.string.parsing"
- >variable parsing in strings</link> for more details.
+ To reiterate, inside a double-quoted <type>string</type>, it's
+ valid to not surround array indexes with quotes so
+ <literal>"$foo[bar]"</literal> is valid. See the above
+ examples for details on why as well as the section on
+ <link linkend="language.types.string.parsing">variable parsing
+ in strings</link>.
</simpara>
</note>
</sect4>
@@ -1507,15 +1601,17 @@
<title>Converting to array</title>
<para>
- For any of the types: integer, float, string, boolean and resource,
- if you convert a value to an array, you get an array with one element
- (with index 0), which is the scalar value you started with.
+ For any of the types: <type>integer</type>, <type>float</type>,
+ <type>string</type>, <type>boolean</type> and <type>resource</type>,
+ if you convert a value to an <type>array</type>, you get an array
+ with one element (with index 0), which is the scalar value you
+ started with.
</para>
<para>
- If you convert an object to an array, you get the properties (member
- variables) of that object as the array's elements. The keys are the
- member variable names.
+ If you convert an <type>object</type> to an array, you get the
+ properties (member variables) of that object as the array's elements.
+ The keys are the member variable names.
</para>
<para>
--
PHP Documentation Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php