Clarify that you do not always quote array keys (i.e. when you're using

a variable or constant as a key).


git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@132367 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Torben Wilson 2003-06-18 18:44:18 +00:00
parent 50d662366f
commit 219600d52e

View file

@ -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 @@ $b = array_values($a);
<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 @@ echo $foo[bar];
]]>
</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 @@ 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');
define('fruit', 'veggie');
// Notice the difference now
print $arr['fruit']; // apple
@ -1593,10 +1651,11 @@ print "Hello " . $arr['fruit']; // Hello apple
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[