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

Reply via email to