2012-01-18 59 views
0

使變量可訪問所有類的最佳方式是什麼?在PHP中處理不同類和函數之間的全局變量

例如,我想有一個配置文件(稱爲config.php文件),其將不得不像這樣的變量:

$server_url = "www.myaddress.com"; 

而且我有一個包含了一堆主庫文件類型需要訪問$ server_url的類。因此,這裏開始,主庫文件:

require 'config.php'; 

class one { 
    function a() { 
      $html = "<a href='$server_url/main.php'>LINK</a>" 
     return $html; 
     } 

    function b() { 
     $html = "<a href='$server_url/about.php'>LINK</a>" 
     return $html; 

     } 
} 


class two { 

    function new() { 
      $html = "<a href='$server_url/blah.php'>LINK</a> 

    } 
} 

什麼是最好的方式,使config.php的$ server_url可用於每個函數?或者至少可以在課堂上使用所有功能?

+0

開始瞭解依賴注入 – 2012-01-18 19:41:17

回答

2

我個人會使用一個靜態實體來保存所有的配置值。

通常,大多數PHP應用程序都有一個入口點(index.php),可以加載config.php文件並使該靜態實體可用。

如果您的應用程序有多個入口點,那麼您需要在每個這些點中包含config.php。

事情是這樣的:

<?php 
    class Configurator{ 
     private static $_configuration = array(); 
     public static function write($key, $value) { 
      self::$_configuration[$key] = $value; 
     } 
     public static function read($key) { 
      return self::$_configuration[$key]; 
     } 
    } 
    Configurator::write('server', 'http://localhost'); 
    Configurator::read('server'); 
?> 

CakePHP有類似的類:http://api.cakephp.org/view_source/configure/

+0

好吧,一個靜態的實體。原諒我的無知,但你怎麼做一個靜態的實體? – renosis 2012-01-18 19:41:51

+0

感謝您的幫助! – renosis 2012-01-18 19:52:32

+0

謝謝馬丁!奇蹟般有效 – Awena 2015-06-14 13:17:45

1

充分利用配置成本身就是一個類,並使用兩種沿serverUrl()get('server_url')行一個靜態方法。然後叫他們像任何其他靜態方法的類(我會選擇在這個例子中,後):

$html = "<a href='" . Config::get ('server_url') . "/main.php'>LINK</a>"; 

的配置類可能是相當渺茫,使用構造函數,如:

public function __construct (array $config) 
{ 
    foreach ($config as $key => $value) 
    { 
    $this->$key = $value; 
    } 
} 

而且添加get()方法沿着這些路線:

public function get ($key) 
{ 
    return $this->$key; 
} 

這種方式可以從讀取的陣列的配置可以具有作爲一個單獨的,實際的配置文件,並重新用於相同的代碼多個項目。

您還可以從項目的任何位置訪問變量,並且會得到一種僞命名空間(如果項目需要在較早版本的PHP上運行)。

請不要複製代碼逐字,這是作爲一個例子。

1

認爲globals是邪惡的。嘗試使用設計模式來訪問全局的一些配置。

我是一個單身人士的粉絲,以獲得全局訪問對象,數組或其他數據類型。

<?php 

class st { 
    static $_this; 


    function __construct(){ 
     self::$_this = $this; 
    } 

    static function &getInstance(){ 
     return self::$_this 
    } 

    static function set($key, $value){ 
     self::$_this[$key] = $value; 
    } 

    static function &get($key){ 
     return self::$_this[$key]; 
    } 
} 

// Usage 

new st(); 

st::set('foo', 'bar'); 

// In some class 
st::get('foo'); //return 'bar' 

// Or when there are some classes/objects 
st::getInstance()->foo->bar(); 
$st =& st::getInstance(); 
$st->foo->bar(); 
?> 

粗略記下了一個小單例,但不知道是否有語法錯誤。

雖然用的getInstance處理它一定是按引用=&

0

定義變量定義一個常量,在這樣的config.php:

定義( 'SERVER_URL', '...');

在你的課堂上:

echo SERVER_URL;