git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@130573 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Kevin Kee 2003-06-07 17:40:41 +00:00
parent 55859460de
commit 317d45625b

View file

@ -1,22 +1,28 @@
<?xml version="1.0" encoding="big5"?>
<!-- $Revision: 1.60 $ -->
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.61 $ -->
<chapter id="language.variables">
<title>各類變數</title>
<title>Variables</title>
<sect1 id="language.variables.basics">
<title>基本知識</title>
<title>Basics</title>
<simpara>
所有 PHP 的變數都是以 "$" 為開端,後加變數名所組成的。變數名稱是有大小寫之分的。
Variables in PHP are represented by a dollar sign followed by the
name of the variable. The variable name is case-sensitive.
</simpara>
<para>
PHP 的變數名稱和其他標籤有著相同的規則。一個有效的變數是由英文字母或底線開始,跟著是任意長短的字母、數字或底線。按正規運算式,它可以表達為:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Variable names follow the same rules as other labels in PHP. A
valid variable name starts with a letter or underscore, followed
by any number of letters, numbers, or underscores. As a regular
expression, it would be expressed thus:
'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
</para>
<note>
<simpara>
字母為 a-zA-Z而 ASCII 字符則從 127 至 255〈0x7f-0xff〉。
For our purposes here, a letter is a-z, A-Z, and the ASCII
characters from 127 through 255 (0x7f-0xff).
</simpara>
</note>
@ -39,14 +45,33 @@ $t
</para>
<para>
PHP 3 中,變數總是由值指派。也就是說,當您將一個運算式的值指派給一個變數時,整個原始運算式的值將會複製到目的變數。例如,當將一個變數的值指派給另一個變數之後,更改當中的任何一個變數的值並不會影響到另一個變數的值。想要知道更多這類的指派,請參閱<link linkend="language.expressions">運算式</link>這一章。
In PHP 3, variables are always assigned by value. That is to say,
when you assign an expression to a variable, the entire value of
the original expression is copied into the destination
variable. This means, for instance, that after assigning one
variable's value to another, changing one of those variables will
have no effect on the other. For more information on this kind of
assignment, see the chapter on <link
linkend="language.expressions">Expressions</link>.
</para>
<para>
PHP 4 則提供了另一種指派變數值的方法:<link linkend="language.references">傳址指派</link>,即新變數只是參照原來變數中的值,或說新的變數成為原來變數的別名。此時,更改兩個變數中任何一個的值都會同時更改另一個的值。由於沒有執行實際的複製工作,指派的操作也因此更加快捷。不過,只有在緊密的迴圈或指派大量的<link linkend="language.types.array">陣列</link><link linkend="language.types.object">物件</link>時才會察覺速度的提升。
PHP 4 offers another way to assign values to variables:
<link linkend="language.references">assign by reference</link>.
This means that the new variable simply references (in other words,
"becomes an alias for" or "points to") the original variable.
Changes to the new variable affect the original, and vice versa.
This also means that no copying is performed; thus, the assignment
happens more quickly. However, any speedup will likely be noticed
only in tight loops or when assigning large
<link linkend="language.types.array">arrays</link> or
<link linkend="language.types.object">objects</link>.
</para>
<para>
使用傳址指派,只須在被參照的原變數前加上一個 (&amp;) 的符號。例如,下列程式碼在使用傳址指派後輸出 'My name is Bob' 兩次。
To assign by reference, simply prepend an ampersand (&amp;) to the
beginning of the variable which is being assigned (the source
variable). For instance, the following code snippet outputs 'My
name is Bob' twice:
<informalexample>
<programlisting role="php">
<![CDATA[
@ -63,7 +88,8 @@ echo $foo; // $foo is altered too.
</para>
<para>
需要注意的是只有真正命名的變數才可以用來進行傳址指派。
One important thing to note is that only named variables may be
assigned by reference.
<informalexample>
<programlisting role="php">
<![CDATA[
@ -86,48 +112,89 @@ $bar = &test(); // Invalid.
</sect1>
<sect1 id="language.variables.predefined">
<title>預設的變數</title>
<title>Predefined variables</title>
<simpara>
PHP 為它執行的程式提供了大量的預設變數。然而,由于有許多變數因依賴其所執行的伺服器種類、版本、安裝等情況而定,因此難以有完整的被記載下來。更有一些變數在<link linkend="features.commandline">指令行</link>的模式運行時是不能使用的。有關這些變數的列表,請參考<link linkend="reserved.variables">保留的先前定義變數</link>一節。
PHP provides a large number of predefined variables to any script
which it runs. Many of these variables, however, cannot be fully
documented as they are dependent upon which server is running, the
version and setup of the server, and other factors. Some of these
variables will not be available when PHP is run on the
<link linkend="features.commandline">command line</link>.
For a listing of these variables, please see the section on
<link linkend="reserved.variables">Reserved Predefined Variables</link>.
</simpara>
<warning>
<simpara>
PHP 4.2.0 以後的版本,<link linkend="ini.register-globals">register_globals</link> 指令的預設值是 <emphasis>off</emphasis>。這是一個重大的改變。將 register_globals 的值預設為 <emphasis>off</emphasis> 會影響到預設變數在全域範圍內的有效性。例如,要得到 <varname>DOCUMENT_ROOT</varname> 的值,應使用 <varname>$_SERVER['DOCUMENT_ROOT']</varname> 而不是 <varname>$DOCUMENT_ROOT</varname>、使用 <varname>$_GET['id']</varname> 以取得 URL <literal>http://www.example.com/test.php?id=3</literal> 中 id 的值,而不是用 <varname>$id</varname>、或使用 <varname>$_ENV['HOME']</varname> 來取代 <varname>$HOME</varname>
In PHP 4.2.0 and later, the default value for the PHP directive <link
linkend="ini.register-globals">register_globals</link> is
<emphasis>off</emphasis>. This is a major change in PHP. Having
register_globals <emphasis>off</emphasis> affects the set of predefined
variables available in the global scope. For example, to get
<varname>DOCUMENT_ROOT</varname> you'll use
<varname>$_SERVER['DOCUMENT_ROOT']</varname> instead of
<varname>$DOCUMENT_ROOT</varname>, or <varname>$_GET['id']</varname> from
the URL <literal>http://www.example.com/test.php?id=3</literal> instead
of <varname>$id</varname>, or <varname>$_ENV['HOME']</varname> instead of
<varname>$HOME</varname>.
</simpara>
<simpara>
更多與此更改相關的資料可在 <link linkend="ini.register-globals">register_globals</link> 的設置一節、<link linkend="security.registerglobals">使用 Register Globals</link> 中的安全章,或在 <ulink url="&url.php.release4.1.0;">4.1.0</ulink><ulink url="&url.php.release4.2.0;">4.2.0</ulink> 的發行通告中取得。
For related information on this change, read the configuration entry for
<link linkend="ini.register-globals">register_globals</link>, the security
chapter on <link linkend="security.registerglobals">Using Register Globals
</link>, as well as the PHP <ulink url="&url.php.release4.1.0;">4.1.0
</ulink> and <ulink url="&url.php.release4.2.0;">4.2.0</ulink> Release
Announcements.
</simpara>
<simpara>
我們建議您使用 PHP 提供的保留預設變數,如 <link linkend="language.variables.superglobals">superglobal 陳列</link>
Using the available PHP Reserved Predefined Variables, like the
<link linkend="language.variables.superglobals">superglobal arrays</link>,
is preferred.
</simpara>
</warning>
<simpara>
自 4.1.0 版本起PHP 額外提供了一套預設陣列,當中包含了來自伺服器〈如適用〉、環境、及使用者輸入的變數。這些新陳列比較特別,因此它們會自動地設為全域,即可以在所有範圍內使用。正因如此,它們也被稱為 'autoglobals' 或 'superglobals'。〈PHP 尚未有使用者自行定義 superglobals 的功能。〉我們將在下面列出 superglobals但要知道它們的內容和 PHP 預設變數的深入討論,請參考<link linkend="reserved.variables">保留的先前定義變數</link>一節。此外,您也會留意舊有的預設變數 (<varname>$HTTP_*_VARS</varname>) 仍然存在。
From version 4.1.0 onward, PHP provides an additional set of predefined arrays
containing variables from the web server (if applicable), the
environment, and user input. These new arrays are rather special
in that they are automatically global--i.e., automatically
available in every scope. For this reason, they are often known as
'autoglobals' or 'superglobals'. (There is no mechanism in PHP for
user-defined superglobals.) The superglobals are listed below;
however, for a listing of their contents and further discussion on
PHP predefined variables and their natures, please see the section
<link linkend="reserved.variables">Reserved Predefined Variables</link>.
Also, you'll notice how the older predefined variables
(<varname>$HTTP_*_VARS</varname>) still exist.
&avail.register-long-arrays;
</simpara>
<note>
<title>可變變數</title>
<title>Variable variables</title>
<para>
Superglobals 不能當作<link linkend="language.variables.variable">可變變數</link>來使用。
Superglobals cannot be used as
<link linkend="language.variables.variable">variable variables</link>.
</para>
</note>
<para>
如果某些 <link linkend="ini.variables-order">variables_order</link> 中的變數沒有被設定,它們相對的 PHP 預設陳列也將會是空的。
If certain variables in <link
linkend="ini.variables-order">variables_order</link> are not set, their
appropriate PHP predefined arrays are also left empty.
</para>
<variablelist id="language.variables.superglobals">
<title>PHP Superglobals</title>
<title>PHP Superglobals</title>
<varlistentry>
<term><link linkend="reserved.variables.globals">$GLOBALS</link></term>
<listitem>
<simpara>
包含一個指向程式全域範圍內可用變數的索引。此陳列的索引鍵為全域變數的名稱。<varname>$GLOBALS</varname> 自 PHP 3 開始就已存在。
Contains a reference to every variable which is currently
available within the global scope of the script. The keys of
this array are the names of the global variables.
<varname>$GLOBALS</varname> has existed since PHP 3.
</simpara>
</listitem>
</varlistentry>
@ -135,7 +202,10 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.server">$_SERVER</link></term>
<listitem>
<simpara>
由網頁伺服器設定的變數或目前的程式所執行的環境產生的變數。其性質類似舊有的 <varname>$HTTP_SERVER_VARS</varname> 陳列,雖然目前還可以使用,但不被建議。
Variables set by the web server or otherwise directly related
to the execution environment of the current script. Analogous
to the old <varname>$HTTP_SERVER_VARS</varname> array (which is
still available, but deprecated).
</simpara>
</listitem>
</varlistentry>
@ -143,7 +213,9 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.get">$_GET</link></term>
<listitem>
<simpara>
通過 HTTP GET 提供給程式的變數。其性質類似舊有的 <varname>$HTTP_GET_VARS</varname> 陳列,雖然目前還可以使用,但不被建議。
Variables provided to the script via HTTP GET. Analogous to the
old <varname>$HTTP_GET_VARS</varname> array (which is still
available, but deprecated).
</simpara>
</listitem>
</varlistentry>
@ -151,7 +223,9 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.post">$_POST</link></term>
<listitem>
<simpara>
通過 HTTP POST 提供給程式的變數。其性質類似舊有的 <varname>$HTTP_POST_VARS</varname>陳列,雖然目前還可以使用,但不被建議。
Variables provided to the script via HTTP POST. Analogous to the
old <varname>$HTTP_POST_VARS</varname> array (which is still
available, but deprecated).
</simpara>
</listitem>
</varlistentry>
@ -159,7 +233,9 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.cookies">$_COOKIE</link></term>
<listitem>
<simpara>
通過 HTTP cookies 提供給程式的變數。其性質類似舊有的 <varname>$HTTP_COOKIE_VARS</varname>陳列,雖然目前還可以使用,但不被建議。
Variables provided to the script via HTTP cookies. Analogous to
the old <varname>$HTTP_COOKIE_VARS</varname> array (which is
still available, but deprecated).
</simpara>
</listitem>
</varlistentry>
@ -167,7 +243,12 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.files">$_FILES</link></term>
<listitem>
<simpara>
通過 HTTP POST 檔案上傳提供給程式的變數。其性質類似舊有的 <varname>$HTTP_POST_FILES</varname>陳列,雖然目前還可以使用,但不被建議。詳情請參閱 <link linkend="features.file-upload.post-method">POST 上傳方式</link>
Variables provided to the script via HTTP post file
uploads. Analogous to the old
<varname>$HTTP_POST_FILES</varname> array (which is still
available, but deprecated). See <link
linkend="features.file-upload.post-method">POST method
uploads</link> for more information.
</simpara>
</listitem>
</varlistentry>
@ -175,7 +256,9 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.environment">$_ENV</link></term>
<listitem>
<simpara>
執行環境提供給程式的變數。其性質類似舊有的 <varname>$HTTP_ENV_VARS</varname>陳列,雖然目前還可以使用,但不被建議。
Variables provided to the script via the environment. Analogous
to the old <varname>$HTTP_ENV_VARS</varname> array (which is
still available, but deprecated).
</simpara>
</listitem>
</varlistentry>
@ -183,11 +266,20 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.request">$_REQUEST</link></term>
<listitem>
<simpara>
通過任何使用者輸入途徑而提供給程式的變數,也正因如此不值得信任。此陳列中變數的存在與否及次序是決定於 <link linkend="ini.variables-order">variables_order</link> 的設定。PHP 4.1.0 之前的版本並沒有類似此陳列的變數。請同時參閱 <function>import_request_variables</function>
Variables provided to the script via any user input mechanism,
and which therefore cannot be trusted. The presence and order
of variable inclusion in this array is defined according to the <link
linkend="ini.variables-order">variables_order</link>
configuration directive. This array has no direct analogue in
versions of PHP prior to 4.1.0. See also
<function>import_request_variables</function>.
</simpara>
<note>
<simpara>
<link linkend="features.commandline">指令行</link>模式下執行時,它並<emphasis></emphasis>包含 <varname>argv</varname><varname>argc</varname> 項目。此兩項目只在 <varname>$_SERVER</varname> 陳列中出現。
When running on the <link linkend="features.commandline">command line
</link>, this will <emphasis>not</emphasis> include the
<varname>argv</varname> and <varname>argc</varname> entries; these are
present in the <varname>$_SERVER</varname> array.
</simpara>
</note>
</listitem>
@ -196,7 +288,12 @@ $bar = &test(); // Invalid.
<term><link linkend="reserved.variables.session">$_SESSION</link></term>
<listitem>
<simpara>
目前和程式注冊了的 session 變數。其性質類似舊有的 <varname>$HTTP_SESSION_VARS</varname>陳列,雖然目前還可以使用,但不被建議。詳情請參閱 <link linkend="ref.session">Session 處理函數</link>一節。
Variables which are currently registered to a script's
session. Analogous to the old
<varname>$HTTP_SESSION_VARS</varname> array (which is still
available, but deprecated). See the <link
linkend="ref.session">Session handling functions</link> section
for more information.
</simpara>
</listitem>
</varlistentry>
@ -206,10 +303,13 @@ $bar = &test(); // Invalid.
<sect1 id="language.variables.scope">
<title>變數範圍</title>
<title>Variable scope</title>
<simpara>
變數的範圍只是在其所定義的空間內存在。在大部份的情況下PHP 的變數只有一個單一的範圍。這單一的範圍也包含了以 include 和 require 方式引入的檔案。例如:
The scope of a variable is the context within which it is defined.
For the most part all PHP variables only have a single scope.
This single scope spans included and required files as well. For
example:
</simpara>
<informalexample>
<programlisting role="php">
@ -222,7 +322,11 @@ include "b.inc";
</programlisting>
</informalexample>
<simpara>
例子中,變數 <varname>$a</varname> 也存在于被包含入的程式 <filename>b.inc</filename> 中。但是在使用者自訂的函數中,一個區域性的函數範圍將被引用。任何在函數內使用的變數在預設的情況下只局限於該函數的範圍內。例如:
Here the <varname>$a</varname> variable will be available within
the included <filename>b.inc</filename> script. However, within
user-defined functions a local function scope is introduced. Any
variable used inside a function is by default limited to the local
function scope. For example:
</simpara>
<informalexample>
@ -243,7 +347,16 @@ Test();
</informalexample>
<simpara>
這個程式不會輸出任何東西,因為 echo 述句使用了本區域版本的 <varname>$a</varname> 變數,而該本區域變數並未曾被分配一個值。你會發現這和 C 語言的做法不同,因為 C 的全域變數是自動的提供給各函數,除非在本域定義中指明撤銷。此做法可能會引致一些問題,如使用者不慎地更改了全域變數的值。在 PHP 中,全域變數在本域使用前必須先宣佈為全域。例子:
This script will not produce any output because the echo statement
refers to a local version of the <varname>$a</varname> variable,
and it has not been assigned a value within this scope. You may
notice that this is a little bit different from the C language in
that global variables in C are automatically available to
functions unless specifically overridden by a local definition.
This can cause some problems in that people may inadvertently
change a global variable. In PHP global variables must be
declared global inside a function if they are going to be used in
that function. An example:
</simpara>
<informalexample>
@ -268,11 +381,17 @@ echo $b;
</informalexample>
<simpara>
上述例子將會輸出 &quot;3&quot;。在函數內宣佈 <varname>$a</varname><varname>$b</varname> 為全域後所有涉及該兩個變數的使用將自動指向全域的版本。PHP 沒有限定一個函數可以使用的全域變數的數量。
The above script will output &quot;3&quot;. By declaring
<varname>$a</varname> and <varname>$b</varname> global within the
function, all references to either variable will refer to the
global version. There is no limit to the number of global
variables that can be manipulated by a function.
</simpara>
<simpara>
第二種存取全域範圍中的變數方法是使用一個由 PHP 特別定義的陳列:<varname>$GLOBALS</varname>。前面的例子可以重寫為:
A second way to access variables from the global scope is to use
the special PHP-defined <varname>$GLOBALS</varname> array. The
previous example can be rewritten as:
</simpara>
<informalexample>
@ -295,7 +414,13 @@ echo $b;
</informalexample>
<simpara>
<varname>$GLOBALS</varname> 是一個關聯陳列 (associative array),全域變數的名即為索引鍵,而該變數的內容即為陳列的值。有否留意到 <varname>$GLOBALS</varname> 在任何一個範圍都出現?那是因為 $GLOBALS 是一個<link linkend="language.variables.superglobals">superglobal</link>。這是一個示範 superglobals 強大功能的例子:
The <varname>$GLOBALS</varname> array is an associative array with
the name of the global variable being the key and the contents of
that variable being the value of the array element.
Notice how <varname>$GLOBALS</varname> exists in any scope, this
is because $GLOBALS is a <link
linkend="language.variables.superglobals">superglobal</link>.
Here's an example demonstrating the power of superglobals:
</simpara>
<para>
@ -323,7 +448,11 @@ function test_global()
</para>
<simpara>
變數範圍的另一個重要功能為<emphasis>靜態</emphasis>變數。靜態變數只在本域函數範圍內存在,但是當程式執行離開此範圍時,它並不會喪失它的值。看看下面的例子:
Another important feature of variable scoping is the
<emphasis>static</emphasis> variable. A static variable exists
only in a local function scope, but it does not lose its value
when program execution leaves this scope. Consider the following
example:
</simpara>
<informalexample>
@ -342,7 +471,13 @@ function Test ()
</informalexample>
<simpara>
此函數沒有什麼用處,因每一次執行它時,它將 <varname>$a</varname> 設為 <literal>0</literal> 然後列印出 &quot;0&quot;<varname>$a</varname>++ 增加了 <varname>$a</varname> 的值,但並沒有實際用途因為一旦離開了該函數,變數 <varname>$a</varname> 也隨之消失。要設計一個有用的、不會丟失當前計數的計數函數,我們可以將 <varname>$a</varname>宣佈為靜態:
This function is quite useless since every time it is called it
sets <varname>$a</varname> to <literal>0</literal> and prints
&quot;0&quot;. The <varname>$a</varname>++ which increments the
variable serves no purpose since as soon as the function exits the
<varname>$a</varname> variable disappears. To make a useful
counting function which will not lose track of the current count,
the <varname>$a</varname> variable is declared static:
</simpara>
<informalexample>
@ -361,11 +496,18 @@ function Test()
</informalexample>
<simpara>
現在,每當函數 Test() 被呼叫時,它會列印出 <varname>$a</varname> 的值,然後加上一。
Now, every time the Test() function is called it will print the
value of <varname>$a</varname> and increment it.
</simpara>
<simpara>
靜態變數也提供一種處理遞迴函數的方法。遞迴函數是一種呼叫自己的函數。編寫遞迴函數時必須留意,因為若編寫錯誤,它有可能會無定限地遞迴。您必須確定足夠的方式來終止遞迴。下列簡單的函數將遞迴地數到 10利用靜態變數 <varname>$count</varname> 來斷定什麼時候停止:
Static variables also provide one way to deal with recursive
functions. A recursive function is one which calls itself. Care
must be taken when writing a recursive function because it is
possible to make it recurse indefinitely. You must make sure you
have an adequate way of terminating the recursion. The following
simple function recursively counts to 10, using the static
variable <varname>$count</varname> to know when to stop:
</simpara>
<informalexample>
@ -389,7 +531,12 @@ function Test()
</informalexample>
<simpara>
驅動 <literal>PHP 4</literal> 的 Zend Engine 1 是以參照的方式來實現 <literal>static</literal><literal>global</literal> 的。例如,一個真正的全域變數使用 <literal>global</literal> 方式引進一個函數範圍時實際上就是建立了一個全域變數的參照。這將導致一些意想不到的行為,正如下列例子所述:
The Zend Engine 1, driving <literal>PHP4</literal>, implements the
<literal>static</literal> and <literal>global</literal> modifier for
variables in terms of references. For example, a true global variable
imported inside a function scope with the <literal>global</literal>
statement actually creates a reference to the global variable. This can
lead to unexpected behaviour which the following example addresses:
</simpara>
<informalexample>
@ -416,7 +563,7 @@ var_dump($obj);
</informalexample>
<simpara>
執行這個例子將會導致下列的輸出:
Executing this example will result in the following output:
</simpara>
<screen>
@ -426,7 +573,8 @@ object(stdClass)(0) {
</screen>
<simpara>
<literal>static</literal> 陳述式也會導致同樣的輸出。參照並沒有被靜態地儲存:
A similar behaviour applies to the <literal>static</literal> statement.
References are not stored statically:
</simpara>
<informalexample>
@ -470,7 +618,7 @@ $still_obj2 = get_instance_noref();
</informalexample>
<simpara>
執行此例子將導致下列的輸出:
Executing this example will result in the following output:
</simpara>
<screen>
@ -485,17 +633,21 @@ Static object: object(stdClass)(1) {
</screen>
<simpara>
上述例子示範了在指派一個參照給予一個靜態變數後,當您第二次呼叫 <literal>&amp;get_instance_ref()</literal> 函數時,它是<emphasis>不會</emphasis>記住之前的值的。
This example demonstrates that when assigning a reference to a static
variable, it's not <emphasis>remembered</emphasis> when you call the
<literal>&amp;get_instance_ref()</literal> function a second time.
</simpara>
</sect1>
<sect1 id="language.variables.variable">
<title>可變變數</title>
<title>Variable variables</title>
<simpara>
有時候,可以使用可變變數會令到工作更加方便。也就是就,一個變數的名可以被動態的設定和使用。一個普通的變數是以下列的方法設定:
Sometimes it is convenient to be able to have variable variable
names. That is, a variable name which can be set and used
dynamically. A normal variable is set with a statement such as:
</simpara>
<informalexample>
@ -509,7 +661,10 @@ $a = "hello";
</informalexample>
<simpara>
一個可變變數是以另一個變數的值作為它的變數名。在上述例子中,只要加兩個 $ 在 <emphasis>hello</emphasis> 的前面就可把它當作是一個變數的名來使用了。即:
A variable variable takes the value of a variable and treats that
as the name of a variable. In the above example,
<emphasis>hello</emphasis>, can be used as the name of a variable
by using two dollar signs. i.e.
</simpara>
<informalexample>
@ -523,7 +678,10 @@ $$a = "world";
</informalexample>
<simpara>
這時,有兩個變數被定義然後儲存在 PHP 的符號表中:含有 "hello" 的 <varname>$a</varname> 及含有 "world" 的 <varname>$hello</varname>。所以,此敘述:
At this point two variables have been defined and stored in the
PHP symbol tree: <varname>$a</varname> with contents "hello" and
<varname>$hello</varname> with contents "world". Therefore, this
statement:
</simpara>
<informalexample>
@ -537,7 +695,7 @@ echo "$a ${$a}";
</informalexample>
<simpara>
與下列這句有著同樣的輸出:
produces the exact same output as:
</simpara>
<informalexample>
@ -551,34 +709,48 @@ echo "$a $hello";
</informalexample>
<simpara>
即,它們都輸出:<computeroutput>hello world</computeroutput>
i.e. they both produce: <computeroutput>hello world</computeroutput>.
</simpara>
<simpara>
為了要在陳列中使用可變變數,您必須首先解決一個模糊的問題。比方說,如果您使用 <varname>$$a[1]</varname>,那剖析器必須知道您是想當 <varname>$a[1]</varname> 是變數來使用,還是當 <varname>$$a</varname> 是變數,然後指向那個變數的第 [1] 個索引。解決上述模糊問題的語法是:第一個情況使用 <varname>${$a[1]}</varname>、第二個情況使用 <varname>${$a}[1]</varname>
In order to use variable variables with arrays, you have to
resolve an ambiguity problem. That is, if you write
<varname>$$a[1]</varname> then the parser needs to know if you
meant to use <varname>$a[1]</varname> as a variable, or if you
wanted <varname>$$a</varname> as the variable and then the [1]
index from that variable. The syntax for resolving this ambiguity
is: <varname>${$a[1]}</varname> for the first case and
<varname>${$a}[1]</varname> for the second.
</simpara>
<warning>
<simpara>
必須留意的是,可變變數是不能使用於 PHP 的 <link linkend="language.variables.superglobals">Superglobal 陳列</link>。這表示您不能使用 <varname>${$_GET}</varname> 這樣的敘述。如果您真的想使用 superglobals 和舊的 <varname>HTTP_*_VARS</varname>,您可以嘗試以<link linkend="language.references">參照</link>的方式使用。
Please note that variable variables cannot be used with PHP's
<link linkend="language.variables.superglobals">Superglobal arrays</link>.
This means you cannot do things like <varname>${$_GET}</varname>. If you are
looking for a way to handle availability of superglobals and the old
<varname>HTTP_*_VARS</varname>, you might want to try
<link linkend="language.references">referencing</link> them.
</simpara>
</warning>
</sect1>
<sect1 id="language.variables.external">
<title>來自 PHP 以外的變數</title>
<title>Variables from outside PHP</title>
<sect2 id="language.variables.external.form">
<title>HTML 表單 (GET 和POST)</title>
<title>HTML Forms (GET and POST)</title>
<simpara>
當一份表單傳送給 PHP 程式時,表單內的資訊將自動提供給該程式。我們有很多方法存取這些資訊,範例:
When a form is submitted to a PHP script, the information from
that form is automatically made available to the script. There
are many ways to access this information, for example:
</simpara>
<para>
<example>
<title>一個簡單的 HTML 表單</title>
<title>A simple HTML form</title>
<programlisting role="html">
<![CDATA[
<form action="foo.php" method="post">
@ -592,12 +764,13 @@ echo "$a $hello";
</para>
<para>
根據您的安裝方式和個人偏好PHP 提供多種方式存取 HTML 表單中的資料。一些例子如:
Depending on your particular setup and personal preferences, there
are many ways to access data from your HTML forms. Some examples are:
</para>
<para>
<example>
<title>存取一個以 POST 方式傳送的簡單 HTML 表單</title>
<title>Accessing data from a simple POST HTML form</title>
<programlisting role="html">
<![CDATA[
<?php
@ -609,7 +782,7 @@ echo "$a $hello";
import_request_variables('p', 'p_');
print $p_username;
// Available since PHP 3. As of PHP 5.0.0, these long predefined
// Available since PHP 3. As of PHP 5.0.0, these long predefined
// variables can be disabled with the register_long_arrays directive.
print $HTTP_POST_VARS['username'];
@ -625,33 +798,55 @@ echo "$a $hello";
</example>
</para>
<para>
使用 GET 方式傳送的表單用法類似只不過使用合適的先前定義的函數。GET 也可使用在查詢字串 (QUERY_STRING) 〈URL 中問號 '?' 後面的資訊〉。例如,<literal>http://www.example.com/test.php?id=3</literal> 含有以 <varname>$_GET['id']</varname> 方式存取的 GET 資料。請參考 <link linkend="reserved.variables.request">$_REQUEST</link><function>import_request_variables()</function>
Using a GET form is similar except you'll use the appropriate
GET predefined variable instead. GET also applies to the
QUERY_STRING (the information after the '?' in an URL). So,
for example, <literal>http://www.example.com/test.php?id=3</literal>
contains GET data which is accessible with <varname>$_GET['id']</varname>.
See also <link linkend="reserved.variables.request">$_REQUEST</link> and
<function>import_request_variables</function>.
</para>
<note>
<para>
<link linkend="language.variables.superglobals">Superglobal 陳列</link><varname>$_POST</varname><varname>$_GET</varname> 在 PHP 版本 4.1.0 以上才開始提供。
<link linkend="language.variables.superglobals">Superglobal arrays</link>,
like <varname>$_POST</varname> and <varname>$_GET</varname>, became
available in PHP 4.1.0
</para>
</note>
<para>
上面提到,在 PHP 4.2.0 之前的版本中,<link linkend="ini.register-globals">register_globals</link> 的預設值是 <emphasis>on</emphasis>。而在 PHP 3 中,它永遠是 on 的。我們建議所有使用者不要依賴此指令,並在編寫時將它當作是 <emphasis>off</emphasis> 來設計您的程式。
As shown, before PHP 4.2.0 the default value for <link
linkend="ini.register-globals">register_globals</link>
was <emphasis>on</emphasis>. And, in PHP 3 it was always on. The PHP
community is encouraging all to not rely on this directive
as it's preferred to assume it's <emphasis>off</emphasis> and code
accordingly.
</para>
<note>
<para>
<link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> 組態指令會影響到 GetPost 和 Cookie 的值。如果開啟此指令,(It's "PHP!") 的值將變成 (It\'s \"PHP!\")。此跳出工作在將字串插入資料庫前是必須要做的。請參考 <function>addslashes</function><function>stripslashes</function><link linkend="ini.magic-quotes-sybase">magic_quotes_sybase</link>
The <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link>
configuration directive affects Get, Post and Cookie values. If
turned on, value (It's "PHP!") will automagically become (It\'s \"PHP!\").
Escaping is needed for DB insertion. See also
<function>addslashes</function>, <function>stripslashes</function> and
<link linkend="ini.magic-quotes-sybase">magic_quotes_sybase</link>.
</para>
</note>
<simpara>
PHP 也懂得處理陳列式的表單變數〈請參觀相關的 <link linkend="faq.html">FAQ</link>〉。您可以將相關的變數歸類,或用此功能來取回多元選擇輸入表單的值。在下列範例中,我們將表單張貼到它自己,並在傳送後把資料顯示出來:
PHP also understands arrays in the context of form variables
(see the <link linkend="faq.html">related faq</link>). You may,
for example, group related variables together, or use this
feature to retrieve values from a multiple select input. For
example, let's post a form to itself and upon submission display
the data:
</simpara>
<para>
<example>
<title>更複雜的表單變數</title>
<title>More complex form variables</title>
<programlisting role="php">
<![CDATA[
<?php
@ -685,14 +880,16 @@ if ($HTTP_POST_VARS['action'] == 'submitted') {
</para>
<para>
PHP 3 的陳列表單變數只可以使用一維陳列,而 PHP 4 則沒有此限制。
In PHP 3, the array form variable usage is limited to
single-dimensional arrays. In PHP 4, no such restriction applies.
</para>
<sect3 id="language.variables.external.form.submit">
<title>IMAGE SUBMIT 變數名稱</title>
<title>IMAGE SUBMIT variable names</title>
<simpara>
在傳送表單時,我們可以使用下列標籤將標準的提交鍵以圖像來取代:
When submitting a form, it is possible to use an image instead
of the standard submit button with a tag like:
</simpara>
<informalexample>
@ -704,7 +901,13 @@ if ($HTTP_POST_VARS['action'] == 'submitted') {
</informalexample>
<simpara>
當使用者在圖像的任何一處按一下伴隨的表單就會傳送到伺服器隨其而來還附加了兩個變數sub_x 和 sub_y。這包含了使用者按在圖像的座標。有經驗的使用者或許知道由瀏覽器傳送來的變數名稱應該包含句號而不是底線但 PHP 自動地將句號轉換成為底線。
When the user clicks somewhere on the image, the accompanying
form will be transmitted to the server with two additional
variables, sub_x and sub_y. These contain the coordinates of the
user click within the image. The experienced may note that the
actual variable names sent by the browser contains a period
rather than an underscore, but PHP converts the period to an
underscore automatically.
</simpara>
</sect3>
@ -714,12 +917,24 @@ if ($HTTP_POST_VARS['action'] == 'submitted') {
<title>HTTP Cookies</title>
<simpara>
PHP 絕對支援 <ulink
url="&spec.cookies;">Netscape規格</ulink>的 HTTP cookies。Cookies 是用來將資料儲存在用戶端的瀏覽器中,以便日後追蹤或識別返回的使用者。您可以用 <function>setcookie()</function> 函數來設定 cookies。Cookies 是 HTTP header 的一部份,因此 SetCookie 函數一定要在任何資料傳送去瀏覽器前呼叫。這和 <function>header()</function> 函數有著相同的限定。Cookie 資料可以在 <varname>$_COOKIE</varname><varname>$HTTP_COOKIE_VARS</varname><varname>$_REQUEST</varname> 陳列中供使用。詳情和範例請參考手冊的 <function>setcookie()</function> 部份。
PHP transparently supports HTTP cookies as defined by <ulink
url="&spec.cookies;">Netscape's Spec</ulink>. Cookies are a
mechanism for storing data in the remote browser and thus
tracking or identifying return users. You can set cookies using
the <function>setcookie</function> function. Cookies are part of
the HTTP header, so the SetCookie function must be called before
any output is sent to the browser. This is the same restriction
as for the <function>header</function> function. Cookie data
is then available in the appropriate cookie data arrays, such
as <varname>$_COOKIE</varname>, <varname>$HTTP_COOKIE_VARS</varname>
as well as in <varname>$_REQUEST</varname>. See the
<function>setcookie</function> manual page for more details and
examples.
</simpara>
<simpara>
若您要將多個值指派給一個 cookie 變數,那您就要使用陳列來指派了。範例:
If you wish to assign multiple values to a single cookie variable, you
may assign it as an array. For example:
</simpara>
<informalexample>
@ -734,15 +949,21 @@ if ($HTTP_POST_VARS['action'] == 'submitted') {
</informalexample>
<simpara>
這將會建立兩個個別的 cookies儘管現在 MyCookie在您的程式中是一個單元陳列。如果您要以一個 cookie 建立多個值,那您可先對那些值使用 <function>serialize()</function><function>explode()</function> 函數。
That will create two seperate cookies although MyCookie will now
be a single array in your script. If you want to set just one cookie
with multiple values, consider using <function>serialize</function> or
<function>explode</function> on the value first.
</simpara>
<simpara>
有一點必須留意的是,一個 cookie 將會替代瀏覽器中另一個同名的 cookie除非該 cookie 的路徑或網域名稱不同。所以,在設計購物車程式時,您最好保持一個計數器,並將此數據傳遞下去,即:
Note that a cookie will replace a previous cookie by the same
name in your browser unless the path or domain is different. So,
for a shopping cart application you may want to keep a counter
and pass this along. i.e.
</simpara>
<example>
<title>一個 <function>setcookie()</function> 的範例</title>
<title>A <function>setcookie</function> example</title>
<programlisting role="php">
<![CDATA[
<?php
@ -757,11 +978,13 @@ setcookie("Cart[$count]", $item, time()+3600);
</sect2>
<sect2 id="language.variables.external.dot-in-names">
<title>在變數名字中的句號 (dots)</title>
<title>Dots in incoming variable names</title>
<para>
一般上PHP 並不會更改傳入程式的變數名稱。然而,您必須留意句號 (.) 並不是一個有效的 PHP 變數名稱字元,正如:
Typically, PHP does not alter the names of variables when they
are passed into a script. However, it should be noted that the
dot (period, full stop) is not a valid character in a PHP
variable name. For the reason, look at it:
<programlisting role="php">
<![CDATA[
<?php
@ -769,20 +992,34 @@ $varname.ext; /* invalid variable name */
?>
]]>
</programlisting>
這時,剖析器見到的只是一個叫做 <varname>$varname</varname> 的變數,跟隨著字串連結運算子 (.)再來是一個無引號的字串ext。顯然地這並不會帶來您想要的結果。
Now, what the parser sees is a variable named
<varname>$varname</varname>, followed by the string concatenation
operator, followed by the barestring (i.e. unquoted string which
doesn't match any known key or reserved words) 'ext'. Obviously,
this doesn't have the intended result.
</para>
<para>
正因如此PHP 會自動的將傳入的變數名稱中的句號 (.) 改為底線 (_)。
For this reason, it is important to note that PHP will
automatically replace any dots in incoming variable names with
underscores.
</para>
</sect2>
<sect2 id="language.variables.determining-type-of">
<title>判定變數的類型</title>
<title>Determining variable types</title>
<para>
由於 PHP 會自行判斷變數的類型並按需要轉變它們的類型因此有時也難以明顯地判定一個變數在某個時刻的類型。有鑑於此PHP 提供了幾個判定變數類型的函數:<function>gettype()</function><function>is_array()</function><function>is_float()</function><function>is_int()</function><function>is_object()</function><function>is_string()</function>。請參閱<link linkend="language.types">類型</link>一章。
Because PHP determines the types of variables and converts them
(generally) as needed, it is not always obvious what type a given
variable is at any one time. PHP includes several functions
which find out what type a variable is, such as:
<function>gettype</function>, <function>is_array</function>,
<function>is_float</function>, <function>is_int</function>,
<function>is_object</function>, and
<function>is_string</function>. See also the chapter on
<link linkend="language.types">Types</link>.
</para>
</sect2>
@ -809,4 +1046,4 @@ End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
-->