看板 PHP 關於我們 聯絡資訊
※ 引述《libraghost (看好戲)》之銘言: : 請教global應該怎麼寫 : 概念小弟大概知道(應該啦),但是寫的時候就是出錯 : 我是這樣寫的 : function main() : { : GLOBAL $link; : $link=mysql_connect("$sever","$id","$pw"); : mysql_select_db("$db_name",$link); //這裡不知道要不要GLOBAL : tmp(); : mysql_close($link); : } : function tmp() : { : $sql="SELECT `A` , `B` FROM `$table` ORDER BY `A` ASC"; : $list =mysql_query($sql,$link); : list($A,$B) = mysql_fetch_row($list); : } : 結果就是錯! 先僅就以上的部分來看。如果一定要寫成這樣(但是個人並不贊同這個寫法), 你應該在tmp()裡面也加上global $link: <?php function main() { // 照原本 } function tmp() { global $link; // 以下照原本 } main(); ?> main()裡面的global $link;會把下面那行建立的$link變數放到全域變數 的範圍裡面去,但是在tmp()裡面也要加上global $link;告訴後面的程式碼 $link這個變數是在全域變數裡面而不是本地端變數,這樣才拿得到main() 所建立的連線。 不過你的寫法很有重新檢視的空間。連接資料庫這部分程式碼是在整個系統裡面 會重複使用的,因此有必要獨立寫成函數,這沒錯。但是你不應該在裡面還加上 個tmp()的呼叫,除非你確定tmp()所做的事情也是屬於連接資料庫這個動作所 必須執行的一部分,而不是某個無關的東西。我會建議寫成這樣: <?php function get_mysql($param_1,... $param_N) { global $link; $link = mysql_connect(....); ... } function get_xxx_data() { global $link; $sql = "select * from table...."; $result = mysql_query($sql, $link); while(list($a, $b) = mysql_fetch_row($result)) { ... } return $data_array; } get_mysql(); $xxx_data = fetch_xxx_data(); ... // main()就不需要了。PHP不是C,不需要這樣給個進入點。 ?> 通常會把這兩個函數放到某個檔案裡面以便多個程式共用。另外,雖然global可以 在這裡解決你的問題,還是要提醒不要濫用global。特別是對於要被放在獨立檔案 裡面,重複被多個程式引入共用的函數而言,太多global $xxx;會讓函數的獨立性 變得很低,而且會很容易遇到變數名稱衝突的問題(要是在某個程式的某個地方 宣告了某個叫做$link的變數,後面的程式可就頭大了)。 : : 其實不用自己寫啦!當然要練練功力或順便學習無所謂,可是若有開發專案的時間壓力 : : 或考慮功能及安全性,有很多熱心的PHP專業高手們已經替我們寫了不少有關於操控 : : Database的物件,首推 PEAR::DB ! 它獨立的抽象操作層介面讓使用者不必擔心日後 : : 若要將開發的PHP程式移植到不同的資料庫系統時程式碼大量修改的問題。此外PHP 5.0 : : 開始加入的PECL擴充模組,裏面的PDO(PHP Data Objects Interface)更落實了資料 : : 存取統一介面的功能,而且因為是擴充模組,所以日後昇級更獨立且方便,不須要 : : 隨著每次PHP版本更新而昇級。 : : 剛好最近在研究PEAR及PECL的各種物件功能(老外說這兩個是sisters,姐妹花...), : : 拿來現寶一下,有錯請指教! PEAR確實是個寶庫。還沒進去挖過寶的,現在去看看永不嫌遲。 : 其實我現在是幫家裡的店作網頁,沒有時間壓力 : 程式方面自己寫居多 : 一來是不會你說的Database物件 : 二來的確有練功的成分... : 而且現在也做的差不多了 : 只是我比較龜毛,希望程式的可重複利用性多一點 : 未來如果誰接手的話,我希望能在即使看不懂程式的情況下進行修改 : 再說把什麼顯示留言版,購物車,更新商品資料的動作都寫成函式 : 未來如果不幸被逐出家門,拿這些函式去外面騙吃騙喝也方便 ( ̄▽ ̄#) 繼續加油 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.153.37
ast9869:好文~~^^ 01/14 10:35
kuoyu:global太多..可以配合建立naming rule來改善.. 01/15 21:58
libraghost:我的問題解決了,真的很感謝大家,php精華工具集這本最 01/18 21:20
libraghost:近終於弄到了...真是本相見恨晚的好書 01/18 21:24