作者:紅軍©2005-11-21
版權沒有,盜版隨便
前言:
變數是拿來幹麻的?
管它這麼多,決對不是拿來吃大便的就是了..@_@
主講者:1加到100你會怎麼加?
路人甲:我會我會!!拿計算機1加到100
主講者:....@#$%...(換我想翻桌..XD)
認真一點啦...XD!!
最笨的方式,譬如
1+2=3,把3記在旁邊紙上
3+3=6,把6記在旁邊紙上
4+6=10,把10記在旁邊紙上
.
.
.
上例中的白紙,其實作用就好像是一個變數
而前面的算式呢?你可以直接想成是程式運算
但若真的把程式寫成那樣,你不吐血才怪..XD
所以就發展一下吧
<?
$a=1;
$b=100;
$c=100/2;
$d=($a+$b)*$c;
echo $d;
?>
【物件導向】這個名詞,也不過就是要我們以【數學的函數觀念來思考】
不用怕,就算只會1+1=2也寫的出來
只是程式長短問題而已,天天花一點時間寫些程式練習就會進步的
好嚕,扯遠了,開始要拉回來一下下
●變數命名
幾個原則而已
(1)一定以$開頭,不用懷疑
(2)$後第一個字元只能底線或英文大小寫字母
ex:$_ 或 $a 或 $A
$a不等於$A ,大小寫有區分
(3)$後第二個字元可以用底線、英文大小寫字母、數字
ok開始嚕
$girl //合法
$Girl //合法,但跟$girl完全沒關係
$_girl01 //合法
$girl_how_much //合法
$MY_BROTHER //合法
$ABC //合法
$123 //OOPS!!開頭不能為數字喔
$girl-love //OOPS!!不可以用-
有些新手會很隨便,隨性的取無意義變數名稱
譬如
$a = $b * $c;
是沒差啦,一樣能跑
只是哪天你寫完了一長串之後,想回過頭來看自己寫了啥碗膏
大概心中會有一陣寒風吹過吧....(在寫瞎米碗糕,鬼才看的懂=O=!!)
...糟,我前面例子好像也是...XD
但寫筆記嘛‧‧‧懶的去想什麼變數名稱,看的懂在幹麻,會用就好
所以.....嘿
●設定變數初始值
廢話少說,有請 $a $b $c 出場.... |||
$a = 1;
$b = 1.2;
$c = "娘什麼?老子都不老子了";
以上是立即值,還沒有寫程式就先給他指定一種資料形態
建議由右向左看,怎麼說?就是
我把1丟給$a
我把1.2丟給$b
我把胡適在哭X的一句話丟給$c
為什麼要這樣看?我爽‧‧XD!!
沒啦!!這跟接下來要談到的運算試有關
$i = 1;
$i = $i+1;
echo $i
想想看,這時echo出來的$i是多少
第一行我們把1丟給了$i
第二行我們把$i再加上1,然後再丟給$i
第三行我們把$i叫出來,答案是2!
若你從左讀到右...那有可能會腦筋轉不太過來
第一行沒問題
第二行,疑?$i=$i+1,那不就1=1+1
然後腦神精開始錯亂,YA!!我改寫數學歷史 1=1+1耶.... (=_=)
其實這邊講這樣就夠了吧...?其他只是自己練習寫一些怪怪的運算試去玩就行了XD!!
●傳值
疑?這又是何許人也
$a = 100; //100丟給$a
$b = $a; //$a丟給$b,這就是傳值
$b = $b+10; //$b加上10,丟給$b
echo "\$a=$a <br>" . "\$b=$b"; //這段看不懂的基本上請重修資料型態
叫出$a跟$b後可以發現
$a=100
$b=110
$b經過加10的動作變成110,由此可發現,當$a傳給$b後
兩者就是毫無關係的兩個變數!
●傳址
...傳不煩呀,它又是瞎許?
乖...我們來讓它現出原形
$a = 100;
$b = $a;
$c = &$a; //傳址...點點點
echo "\$a=$a" . "\$b=$b" . "\$c=$c <p>";
$b = $b + 10;
$c = $c + 20;
echo "\$a=$a" . "\$b=$b" . "\$c=$c";
第4行echo出來後,$a=100 $b=100 $c=100 ,看起來沒有什麼問題
第7行echo出來後,$a=120 $b=110 $c=120 ...why?我沒設定$a呀!!
因為$c一開始我們設定為 $c = &$a,在變數前面加上&
代表的是【將$a儲存的記憶體空間與$c共用】
所以我們最後的運算式中$c = $c + 20
既然記憶體空間共用,那$c加了多少,$a也會一樣呀 XD!!
●全域與區域變數
那個‧‧‧就是‧‧‧
先弄個結構好了
<?
$man1 = 'Dino' //兩個男生在客廳
$man2 = 'Ken'
echo "$man2 <br>"; //在客廳叫男生2號,Ken答有!
echo "$girl2"; //在客廳叫女生2號,她聽不到
function GirlRoom(){
$girl1 = 'Anna' //兩個女生在房間
$girl2 = 'Vivienne'
echo "$man1 <br>"; //在房間喊男生1號,他不曉得
echo "$girl1 <br>"; //在房間喊女生2號,Vivienne說;瞎小...(好兇)
}
GirlRoom();
?>
在客廳的,就是全域變數,房間內的,就是區域變數嚕 :-)
....想開房間嗎....嘿嘿...(色鬼..|||)
那也要女生同意,男生才能進去呀..XD
這時有請global出場!!
<?
$man1 = 'Dino'
$man2 = 'Ken'
echo "$man2 <br>";
echo "$girl2";
function GirlRoom(){
global $man1, $man2; //打開門,讓色狼進來
$girl1 = 'Anna'
$girl2 = 'Vivienn'
echo "$man1 <br>"; //死兔崽子,馬上衝第一,一喊馬上叫
echo "$girl1 <br>";
}
GirlRoom();
?>
這告訴我們什麼?打開門色狼馬上來...嗯嗯...有理..(羞...)
奶奶個碗糕啦XD...這告訴我們全域變數無法直接在函數中使用!
若要使用,就要用global來宣告!!
若你有看過筆記一,仍舊無法使用global...
同學,認真一點,google大師隨便問都知道喔 :-)
休息一下,我去開房間.....
=====分格線=====
作者:紅軍©2005-11-23
版權沒有,盜版隨便
接續前面提到的global
現在就來聊聊$GLOBALS陣列吧
使用$GLOBALS就不用在函數中宣告變數為全域變數
譬如
<?
function Test(){
$GLOBALS["c"]=$GLOBALS["a"]+$GLOBALS["b"]; //以$GLOBALS方式
}
?>
<?
$a=10;
$b=20;
$c=0;
Test(); //呼叫function test
echo "\$a=$a , \$b=$b , \$c=$c"; //顯示$a=10 , $b=20 , $c=30
?>
在上例中並沒有以global宣告全域變數$a $b $c
而是使用$GLOBALS陣列方式,以陣列中的變數名稱做為index
然後就取得全域變數的值....嗯嗯...很好,一堆屁話
靠X...就是
$GLOBALS["a"]就取得$a值,一句話解決...
那個...沒事做的人,不要再想了
快點!!沒事就開個筆記本寫寫PHP練習也行
有動作才有進步喔 :-)
●靜態變數
<?
function Hmm(){
$i=0;
$i=$i+1;
echo "\$i=$i , ";
}
Hmm();
Hmm();
Hmm();
?>
呼叫三次自定函數Hmm來看看
$i=1 , $i=1 , $i=1 ,
三次的結果都是$i=1
每當執行完一次函數後,變數$i馬上就被殺頭
下回再叫出來,結果還是現出$i=1,然後再殺頭
‧‧若要讓他出現
$i=1 $i=2 $i=3 ,那該如何做呢
這時就需要用到靜態變數static的幫忙
<?
function Hmm(){
static $i=0; //將$i設為靜態變數,且static只能用於函數中
$i=$i+1;
echo "\$i=$i ";
}
Hmm();
Hmm();
Hmm();
?>
執行結果
$i=1 $i=2 $i=3
利用static的功能,將$i值保存於記憶體中
不因為函數跑完了,就被殺頭
●動態變數
講到這個我就頭大
真的是有夠給他混亂....Orz
不過沒關係,就算用不到,概念也要知道 ^^
使用方法倒是很簡單
<?
$dino = "ken"; //最常用的變數設法
$$dino = "leo"; //看到沒?多了一個$,這就是動態變數
echo "$dino<br>"; //(1)結果ken
echo "$$dino<br>"; //(2)結果$ken
echo "${$dino}"."<br>"; //(3)結果leo
echo $ken . "<br>"; //(4)結果leo
echo $$dino . "<br>"; //(5)結果leo
?>
(1)原式"$dino";結果ken
沒問題吧...跳過
(2)原式"$$dino";結果$ken
看起來應該要輸出的是leo,怎麼會跑出$ken?
將$$dino拆開來看,其實是長這樣
原式為($)($dino),由於在【雙引號中】將$dino=ken代入
得($)(ken),雙引號跑完嚕,就直接跑出$ken
那,那$ken也是變數嚕?我們來看下面
(3)原式"${$dino}";結果leo
用【大括號】將$dino包住,這變數的結果會是ken
但【雙引號】仍在,於是將$ken視為變數,輸出
所以得leo
(4)原式$ken;結果leo
沒啥,拿來證明(3)是對的..XD
(5)原式$$dino;結果leo
不加雙引號的情況下,將變數直接讀出來而已
有沒有覺得很頭大呀..=_=...反正整理一下
上例只有2個變數名稱 $dino $ken
1個動態變數名稱 $$dino
以及兩個值 ken leo
證明了寫程式的人,腦筋都要打結外加抽筋
發明程式的人,不曉得是不是經過外星人改造腦部構造..=_=
動態變數也可以用於陣列中
<?
$anstd[0]="a";
$anstd[1]="b";
$a=100;
$b=200;
echo "顯示為".$$anstd[0].'....為什麼?<br>'
echo "因為$$anstd[0]=$a";
echo "顯示為".$$anstd[1].'....為什麼?<br>'
echo "因為$$anstd[1]=$b<br>";
?>
結果如下
顯示為1....為什麼?
因為$a=100
顯示為2....為什麼?
因為$b=200
程式碼與結果比對一下,應該就曉得了吧
再來一個試看看
<?
$name="A";
$A[0]="good";
$A[1]="bad";
$good="好呀!";
$bad="真爛";
$b="C";
$$b='D'
echo $name . '<br>'
echo $C . '<br>'
echo ${${$name}[0]} . '<br>'
echo ${$name}[0];
?>
顯示結果為
A
D
好呀!
good