torben Wed Jun 18 14:44:18 2003 EDT Modified files: /phpdoc/en/language types.xml Log: Clarify that you do not always quote array keys (i.e. when you're using a variable or constant as a key). Index: phpdoc/en/language/types.xml diff -u phpdoc/en/language/types.xml:1.117 phpdoc/en/language/types.xml:1.118 --- phpdoc/en/language/types.xml:1.117 Wed Jun 18 14:19:07 2003 +++ phpdoc/en/language/types.xml Wed Jun 18 14:44:18 2003 @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.117 $ --> +<!-- $Revision: 1.118 $ --> <chapter id="language.types"> <title>Types</title> @@ -1513,9 +1513,10 @@ <sect3 id="language.types.array.foo-bar"> <title>Why is <literal>$foo[bar]</literal> wrong?</title> <para> - You should always use quotes around an associative array index. - For example, use $foo['bar'] and not $foo[bar]. But why is $foo[bar] - wrong? You might have seen the following syntax in old scripts: + You should always use quotes around a string literal + array index. For example, use $foo['bar'] and not + $foo[bar]. But why is $foo[bar] wrong? You might have seen the + following syntax in old scripts: <informalexample> <programlisting role="php"> <![CDATA[ @@ -1527,13 +1528,70 @@ ]]> </programlisting> </informalexample> - This is wrong, but it works. Then, why is it wrong? The reason is that - this code has an undefined constant (bar) rather than a string ('bar' - - notice the quotes), and PHP may in future define constants which, - unfortunately for your code, have the same name. It works, because the - undefined constant gets converted to a string of the same name - automatically for backward compatibility reasons. + This is wrong, but it works. Then, why is it wrong? The reason + is that this code has an undefined constant (bar) rather than a + string ('bar' - notice the quotes), and PHP may in future define + constants which, unfortunately for your code, have the same + name. It works because PHP automatically converts a + <emphasis>bare string</emphasis> (an unquoted string which does + not correspond to any known symbol, such as constants) into a + string which contains the bare string. For instance, if there is + no defined constant named <constant>bar</constant>, then PHP + will substitute in the string <literal>'bar'</literal> and use + that. </para> + <note> + <simpara> + This does not mean to <emphasis>always</emphasis> quote the + key. You do not want to quote keys which are <link + linkend="language.constants">constants</link> or <link + linkend="language.variables">variables</link>, as this will + prevent PHP from interpreting them. + </simpara> + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +error_reporting(E_ALL); +ini_set('display_errors', true); +ini_set('html_errors', false); +// Simple array: +$array = array(1, 2); +$count = count($array); +for ($i = 0; $i < $count; $i++) { + echo "\nChecking $i: \n"; + echo "Bad: " . $array['$i'] . "\n"; + echo "Good: " . $array[$i] . "\n"; + echo "Bad: {$array['$i']}\n"; + echo "Good: {$array[$i]}\n"; +} +?> +]]> + </programlisting> + </informalexample> + <para> + The output from the above is: + <screen> +<![CDATA[ +Checking 0: +Notice: Undefined index: $i in /path/to/script.html on line 9 +Bad: +Good: 1 +Notice: Undefined index: $i in /path/to/script.html on line 11 +Bad: +Good: 1 + +Checking 1: +Notice: Undefined index: $i in /path/to/script.html on line 9 +Bad: +Good: 2 +Notice: Undefined index: $i in /path/to/script.html on line 11 +Bad: +Good: 2 +]]> + </screen> + </para> + </note> <para> More examples to demonstrate this fact: <informalexample> @@ -1557,7 +1615,7 @@ // Let's define a constant to demonstrate what's going on. We // will assign value 'veggie' to a constant named fruit. -define('fruit','veggie'); +define('fruit', 'veggie'); // Notice the difference now print $arr['fruit']; // apple @@ -1593,10 +1651,11 @@ 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>'). - That means that you can write things like this: + 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>'). That means + that you can write things like this: <informalexample> <programlisting role="php"> <![CDATA[
-- PHP Documentation Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php