• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 構建可配置PHP應用程序的正確方式(二)

    發表于:2007-04-22來源:作者:點擊數: 標簽:php方式配置應用程序構建
    XML配置文件 盡管文本文件易于閱讀及編輯,但卻不如 XML 文件流行。另外,XML 有眾多適用的編輯器,這些編輯器能夠理解標記、特殊符號轉義等等。所以配置文件的 XML 版本會是什么樣的呢?清單 11 顯示了 XML 格式的配置文件。 清單 11. config.xml <?xml ve

    XML配置文件

      盡管文本文件易于閱讀及編輯,但卻不如 XML 文件流行。另外,XML 有眾多適用的編輯器,這些編輯器能夠理解標記、特殊符號轉義等等。所以配置文件的 XML 版本會是什么樣的呢?清單 11 顯示了 XML 格式的配置文件。

      清單 11. config.xml

    <?xml version="1.0"?>
    <config>
    <Title>My App</Title>
    <TemplateDirectory>tempdir</TemplateDirectory>
    </config>

      清單 12 顯示了使用 XML 來裝載配置設置的 Configuration 類的更新版。

      清單 12. xml1.PHP

    <?php
    class Configuration
    {
     private $configFile = 'config.xml';
     private $items = array();
     function __construct() { $this->parse(); }
     function __get($id) { return $this->items[ $id ]; }
     function parse()
     {
      $doc = new DOMDocument();
      $doc->load( $this->configFile );
      $cn = $doc->getElementsByTagName( "config" );
      $nodes = $cn->item(0)->getElementsByTagName( "*" );
      foreach( $nodes as $node )
      $this->items[ $node->nodeName ] = $node->nodeValue;
     } 
    }

    $c = new Configuration();
    echo( $c->TemplateDirectory."\n" );
    ?>

      看起來 XML 還有另一個好處:代碼比文本版的代碼更為簡潔、容易。為保存這個 XML,需要另一個版本的 save 函數,將結果保存為 XML 格式,而不是文本格式。

      清單 13. xml2.php

    ...
    function save()
    {
     $doc = new DOMDocument();
     $doc->formatOutput = true;

     $r = $doc->createElement( "config" );
     $doc->appendChild( $r );

     foreach( $this->items as $k => $v )
     {
      $kn = $doc->createElement( $k );
      $kn->appendChild( $doc->createTextNode( $v ) );
      $r->appendChild( $kn );
     }

     copy( $this->configFile, $this->configFile.'.bak' );

     $doc->save( $this->configFile );
    }
    ...

      這段代碼創建了一個新的 XML 文檔對象模型(Document Object Model ,DOM),然后將 $items 數組中的所有數據都保存到這個模型中。完成這些以后,使用 save 方法將 XML 保存為一個文件。
    使用數據庫
      最后的替代方式是使用一個數據庫保存配置元素的值。那首先要用一個簡單的模式來存儲配置數據。下面是一個簡單的模式。

      清單 14. schema.sql

    DROP TABLE IF EXISTS settings;
    CREATE TABLE settings (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name TEXT,
     value TEXT,
     PRIMARY KEY ( id )
    );

      這要求進行一些基于應用程序需求的調整。例如,如果想讓配置元素按照每個用戶進行存儲,就需要添加用戶 ID 作為額外的一列。

      為了讀取及寫入數據,我編寫了如圖 15 所示的更新過的 Configuration 類。

      清單 15. db1.PHP

    <?php
    require_once( 'DB.php' );
    $dsn = 'MYsql://root:password@localhost/config';
    $db =& DB::Connect( $dsn, array() );
    if (PEAR::isError($db)) { die($db->getMessage()); }

    class Configuration
    {
     private $configFile = 'config.XML';
     private $items = array();
     function __construct() { $this->parse(); }
     function __get($id) { return $this->items[ $id ]; }
     function __set($id,$v)
     {
      global $db;
      $this->items[ $id ] = $v;
      $sth1 = $db->prepare( 'DELETE FROM settings WHERE name=?' );
      $db->execute( $sth1, $id );
      if (PEAR::isError($db)) { die($db->getMessage()); }
      $sth2 = $db->prepare('INSERT INTO settings ( id, name, value ) VALUES ( 0, ?, ? )' );
      $db->execute( $sth2, array( $id, $v ) );
      if (PEAR::isError($db)) { die($db->getMessage()); }
     }

     function parse()
     {
      global $db;
      $doc = new DOMDocument();
      $doc->load( $this->configFile );
      $cn = $doc->getElementsByTagName( "config" );
      $nodes = $cn->item(0)->getElementsByTagName( "*" );
      foreach( $nodes as $node )
      $this->items[ $node->nodeName ] = $node->nodeValue;
      $res = $db->query( 'SELECT name,value FROM settings' );
      if (PEAR::isError($db)) { die($db->getMessage()); }
      while( $res->fetchInto( $row ) ) {
       $this->items[ $row[0] ] = $row[1];
      }
     }
    }

    $c = new Configuration();
    echo( $c->TemplateDirectory."\n" );
    $c->TemplateDirectory = 'new foo';
    echo( $c->TemplateDirectory."\n" );
    ?>

      這實際上是一個混合的文本/數據庫解決方案。請仔細觀察 parse 方法。該類首先讀取文本文件來獲取初始值,然后讀取數據庫,進而將鍵更新為最新的值。在設置一個值后,鍵就從數據庫中移除掉,并添加一條具有更新過的值的新記錄。

      觀察 Configuration 類如何通過本文的多個版本來發揮作用是一件有趣的事,該類能從文本文件、XML 及數據庫中讀取數據,并一直保持相同的接口。我鼓勵您在開發中也使用具有相同穩定性的接口。對于對象的客戶機來說,這項工作具體是如何運行的是不明確的。關鍵的是對象與客戶機之間的契約。

      什么是配置及怎樣配置

      在配置過多的配置選項與配置不足間找一個適當的中間點是一件困難的事??梢钥隙ǖ氖?,任何數據庫配置(例如,數據庫名稱、數據庫用戶用及密碼)都應該是可配置的。除此之外,我還有一些基本的推薦配置項。

      在高級設置中,每一個特性都應該有一個獨立的啟用/禁用選項。根據其對應用程序的重要性來允許或禁用這些選項。例如,在一個Web論壇應用程序中,延時特性在缺省狀態下是啟用的。但電子郵件通知在缺省狀態下卻是禁用的,因為這似乎需要定制。

      用戶界面(UI)選項全應該設置到一個位置上。界面的結構(例如,菜單位置、額外的菜單項、鏈接到界面特定元素的 URL、使用的 logo,諸如此類)全應該設置到一個單一位置上。我強烈地建議不要將字體、顏色或樣式條目指定為配置項。這些都應該通過層疊樣式表(Cascading Style Sheets,CSS)來設置,且配置系統應該指定使用哪個 CSS 文件。CSS 是設置字體、樣式、顏色等等的一種有效且靈活的方式。有許多出色的 CSS 工具,您的應用程序應該很好地利用 CSS,而不是試圖自行設置標準。

      在每一個特性中,我推薦設置 3 到 10 個配置選項。這些配置選項應該以一種意義明顯的方式命名。如果配置選項能夠通過 UI 設置,在文本文件、XML 文件及數據庫中的選項名稱應該直接同界面元素的標題相關。另外,這些選項全應該有明確的缺省值。

      總的來說,下面這些選項應該是可配置的:電子郵件地址、CSS 所使用的東西、從文件中引用的系統資源的位置以及圖形元素的文件名。

      對于圖形元素,您也許想要創建一個名為皮膚 的獨立的配置文件類型,該類型中包含了對配置文件的設置,包括 CSS 文件的位置、圖形的位置及這些類型的東西。然后,讓用戶在多種皮膚文件中進行挑選。這使得對應用程序外觀和感覺的大規模更改變得簡單。這也同樣為用戶提供了一個機會,使應用程序能夠在不同的產品安裝間更換皮膚。本文并不涵蓋這些皮膚文件,但您在這里學到的基礎知識將會使對皮膚文件的支持變得更加簡單。

      結束語

      可配置性對于任何 PHP 應用程序來說都是至關重要的一個部分,一開始就應該成為設計的中心部分。我希望本文能夠對您實現配置架構提供一些幫助,并對應該允許什么樣的配置選項有所指導。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>