變量的變量,PHP與你
發(fā)表時(shí)間:2023-08-14 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在我最近做的一個(gè)項(xiàng)目中,我發(fā)現(xiàn)了一個(gè)新的概念,關(guān)于在PHP中使用變量的變量。在我的程序中,我需要在一個(gè)頁面同時(shí)更新多個(gè)記錄,在我經(jīng)過相當(dāng)長時(shí)間的痛苦思索之后,腦海中偶然地閃現(xiàn)出了變量的變量(vari...
在我最近做的一個(gè)項(xiàng)目中,我發(fā)現(xiàn)了一個(gè)新的概念,關(guān)于在PHP中使用變量的變量。在我的程序中,我需要在一個(gè)頁面同時(shí)更新多個(gè)記錄,在我經(jīng)過相當(dāng)長時(shí)間的痛苦思索之后,腦海中偶然地閃現(xiàn)出了變量的變量(variable variable)這一概念,所有的困惑就一掃而光了。
介紹
什么叫作變量的變量?根據(jù)PHP手冊(cè),變量的變量是指取得一個(gè)變量的值并把它作為另一個(gè)變量的變量名。這表述顯得相當(dāng)?shù)闹苯,容易和那些在一個(gè)句子中使用“變量”這個(gè)詞弄混淆。給一個(gè)簡單的例子,你定義一個(gè)變量 --- x 等于 this --- 然后定義一個(gè)變量的變量,意味著你把 x 的值作為新變量的名,在這個(gè)例子中,這個(gè)新變量的值是 is cake。用PHP來表示如下:
<?php
$x = "this";
$$x = "is cake";
?>
這個(gè)符號(hào)$$是在PHP中對(duì)變量的變量的表示方法,F(xiàn)在我們可以用兩種不同的方式來引用這兩個(gè)變量 $x 和 $$x 了。
<?php
echo "$x ${$x}";
?>
<?php
echo "$x $this";
?>
上面兩段程序都將輸出 this is cake。注意,在echo語句中$$x被寫成${$x},這是讓PHP知道你要輸出的是變量的變量而不是一個(gè)$字符與$x變量。
你是不是仍很迷惑?哦,也許吧,你想要一些更深入更有用的例子?下一節(jié),我將向你展示怎樣用變量的變量在一個(gè)頁面編輯多條記錄的。
例子
假設(shè)你已有一個(gè)MySQL數(shù)據(jù)庫,保存了對(duì)一些感興趣的站點(diǎn)的鏈接,庫中有一個(gè)表submissions,字段如下:
SubmissionID
PostedBy
Link
Description
Approved
現(xiàn)在你想顯示在表中所有的已創(chuàng)建但沒有被認(rèn)可的鏈接,這個(gè)編輯的頁面應(yīng)可以更正一些輸入時(shí)的錯(cuò)誤,并用適當(dāng)?shù)膯芜x按鈕來為每一個(gè)記錄設(shè)置是否允許(Approved),然后一次把更新后的記錄都提交到表中。
首先,當(dāng)你從數(shù)據(jù)庫出提取所有的記錄并顯示出來時(shí),你必須為每一個(gè)記錄設(shè)置一個(gè)唯一的名字,這將讓我們?cè)谔峤粫r(shí)可以循環(huán)地辯別出各個(gè)記錄的值。代碼如下:
<?php
//初始化變量的記數(shù)器
$index = 0;
$index_count = 0;
echo "<form method=post action=$PHP_SELF>n";
echo "<table>n";
echo "<tr><td><b>Posted By</b></td><td><b>Link</b></td>".
"<td><b>Description</b></td><td><b>Approved</b></td></tr>n";
/*********
假定我們已從數(shù)據(jù)庫中檢索出記錄到一個(gè)數(shù)組中
$myrow = mysql_fetch_array().
下面的 do...while 循環(huán)根據(jù)名字為每一個(gè)$xstr變量分配了一個(gè)值并且連接了$index 的值到結(jié)尾,以0為開始。
這樣,這個(gè)循環(huán)的第一次時(shí),$SubmissionIDStr 的值就是 SubmissionID0 ,第二次就是 SubmissionID1 ,以此類推。
***********/
do {
$SubmissionIDStr = SubmissionID.$index;
$PostedByStr = PostedBy.$index;
$LinkStr = Link.$index;
$DescriptionStr = Description.$index;
$ApprovedStr = Aprroved.$index;
//這一段將在屏幕上顯示值,以每行一條記錄。
printf("<tr><td><input type=hidden name=%s value=%s><input type=text name=%s value=%s></td>
<td><input type=text name=%s value=%s></td><td><input type=text name=%s value=%s></td>
<td><input type=radio name=%s value=-1>Yes<input type=radio name=%s value=0 checked>No</td></tr>n",
$SubmissionIDStr, $myrow["SubmissionID"], $PostedByStr, $myrow["PostedBy"], $LinkStr, $myrow["Link"],
$DescriptionStr, $myrow["Description"], $ApprovedStr, $ApprovedStr);
//每個(gè)循環(huán)記數(shù)器加1
$index++;
$index_count++;
} while ($myrow = mysql_fetch_array($result));
// 創(chuàng)建一個(gè)索引記數(shù)器index_count來跟蹤所有的記錄數(shù)
echo "<INPUT TYPE=hidden NAME=counter VALUE=$index_count>n";
echo "<INPUT TYPE=submit></form>n";
?>
提交以后,我們利用$index_count變量再一次循環(huán)遍歷頁面上所有的變量,然后,分配這些變量給另一些變量,這就用到了變量的變量。
<?php
//這個(gè)循環(huán)遍歷所有頁面上顯示的記錄
for ($index = 0; $index <= $counter; $index++) {
/*****
這部分用我們?cè)谇懊鎰?chuàng)建的名字設(shè)置了新的變量
從0開始,直到$index_count
*****/
$varSubmissionID = 'SubmissionID'.$index;
$varPostedBy = 'PostedBy'.$index;
$varLink = 'Link'.$index;
$varDescription = 'Description'.$index;
$varApproved = 'Approved'.$index;
/******
這是變量的變量部分,把每個(gè)值分配給每個(gè)新變量的名。
例如,第一次循環(huán)時(shí),分配給記錄 SubmissionID0 是從前面得來的值,我們用變量的變量來了取到它。
*******/
$SubmissionIDvalue = $$varSubmissionID;
$PostedByvalue = $$varPostedBy;
$Linkvalue = $$varLink;
$Descriptionvalue = $$varDescription;
$Approvedvalue = $$varApproved;
//更新數(shù)據(jù)庫
$sql = "UPDATE submissions SET PostedBy='$PostedByvalue',Link='$Linkvalue',".
"Description='$Descriptionvalue' WHERE SubmissionID=$SubmissionIDvalue'";
$result = mysql_query($sql);
//如果本記錄被設(shè)置為approved,更新相應(yīng)的字段 Approved。
if ($Approvedvalue == '-1') {
$sql = "UPDATE submissions SET Approved='-1' WHERE SubmissionID=$SubmissionIDvalue";
$result = mysql_query($sql);
}
}
?>
我希望這有助于你明白這個(gè)變量的變量的基本用法,并且在你將來的工作中使用它們提供一些思路。變量的變量這一概念,最初也是讓我頭痛的東西,但是一旦你知道了它們工作的基本原理時(shí),它們就變成了一塊美味的比薩餅。