即使開發乙個新的大型php
程式,你也不可避免的要使用到全域性
資料,因為有些資料是需要用到你的**
的不同部分的。一些常見的全域性資料有:程式設定類、資料庫
連線類、使用者資料等等。有很多方法
能夠使這些資料成為全域性資料,其中最常用的就是使用「global」關鍵字申明,稍後在文章中我們會具體的講解到。
使用「global」關鍵字來申明全域性資料的唯一缺點就是它事實上是一種非常差的程式設計方式,而且經常在其後導致程式中出現更大的問題,因為全域性資料把你**中原本單獨的**段都聯絡在一起了,這樣的後果就是如果你改變其中的某一部分**,可能就會導致其他部分出錯。所以如果你的**中有很多全域性的變數
,那麼你的整個程式必然是難以維護的。
本文將展示如何通過不同的技術
或者設計模式
來防止這種全域性變數問題。當然,首先讓我們看看如何使用「global」關鍵字來進行全域性資料以及它是如何工作
的。使用全域性變數和「global」關鍵字
php預設定義了一些「超級全域性(superglobals)」變數,這些變數自動全域性化,而且能夠在程式的任何地方中呼叫,比如$_get和$_request等等。它們通常都來自資料或者其他外部資料,使用這些變數通常是不會產生問題的,因為他們基本上是不可寫的。
但是你可以使用你自己的全域性變數。使用關鍵字「global」你就可以把全域性資料匯入到乙個函式
下面是乙個使用「global」關鍵字的演示例子:
以下為引用的內容:
<?php$my_var = 'hello world';
test_global();
function test_global()
?>
正如你在上面的例子中看到的一樣,「global」關鍵字是用來匯入全域性變數的。看起來它工作的很好,而且很簡單,那麼為什麼我們還要擔心使用「global」關鍵字來定義全域性資料呢?
下面是三個很好的理由:
1、 **重用幾乎是不可能的
如果乙個函式依賴於全域性變數,那麼想在不同的環境中使用這個函式幾乎是不可能的。另外乙個問題就是你不能提取出這個函式,然後在其他的**中使用。
2、 除錯並解決問題是非常困難的
跟蹤乙個全域性變數比跟蹤乙個非全域性變數困難的多。乙個全域性變數可能會在一些不明顯的包含檔案中被重新定義,即使你有乙個非常好的程式編輯器(或者ide)來幫助你,你也得花了幾個小時才能發現這個問題所在。
3、 理解這些**將是非常難的事情
你很難弄清楚乙個全域性變數是從**來得,它是用來做什麼的。在開發的過程中,你可能會知道知道每乙個全域性變數,但大概一年之後,你可能會忘記其中至少一般的全域性變數,這個時候你會為自己使用那麼多全域性變數而懊悔不已。
那麼如果我們不使用全域性變數,我們該使用什麼呢?下面讓我們看看一些解決方案。
使用函式引數
停止使用全域性變數的一種方法就是簡單的把變數作為函式的引數傳遞過去,如同下面所示:
以下為引用的內容:
<?php$var = 'hello world';
test ($var);
function test($var)
?>
如果你僅僅只需要傳遞乙個全域性變數,那麼這是一種非常優秀甚至可以說是傑出的解決方案,但是如果你要傳遞很多個值,那該怎麼辦呢?
比如說,假如我們要使用乙個資料庫類,乙個程式設定類和乙個使用者類。在我們**中,這三個類在所有元件中都要用到,所以必須傳遞給每乙個元件。如果我們使用函式引數的方法,我們不得不這樣:
以下為引用的內容:
<?php$db = new dbconnection;
$settings = new settings_xml;
$user = new user;
test($db, $settings, $user);
function test(&$db, &$settings, &$user)
?>
顯然,這是不值得的,而且一旦我們有新的物件
需要加入,我們不得不為每乙個函式增加多乙個函式引數。因此我們需要用採用另外一種方式來解決。
在PHP中使用全域性變數 一
摘要 本文演示了如何恰當的在 php中使用全域性資料。主要談及到使用 global 關鍵字,函式引數,單件和註冊器模式四種實現全域性資料的方式。簡介 即使開發乙個新的大型 php程式,你也不可避免的要使用到全域性資料,因為有些資料是需要用到你的 的不同部分的。一些常見的全域性資料有 程式設定類 資料...
在Unity中使用全域性變數
建立乙個指令碼,輸入下面的 指令碼不需要新增到任何物體上,globle變數可以跨場景全域性呼叫。using system.collections using system.collections.generic using unityengine public class globle和以前的許多語...
Unity中使用全域性變數
建立乙個指令碼,輸入下面的 指令碼不需要新增到任何物體上,globle變數可以跨場景全域性呼叫。using system.collections using system.collections.generic using unityengine public class globle 和以前的許多...