mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-16 00:48:54 +00:00
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:
parent
50d662366f
commit
219600d52e
1 changed files with 74 additions and 15 deletions
|
@ -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[
|
||||
|
|
Loading…
Reference in a new issue