2010-08-21 16 views
5

有用來創建一個PHP類(或功能)的方式,「簡化」這個PHP類(我認爲)

ucfirst(str_replace('_',' ',html_entity_decode(trim($variable), ENT_QUOTES)))); 

的$變量可以從另一個函數的任何位置如一個全球性的「過來人」或只是一個「標準」變量

回答

3

如果你多次使用它,那麼我肯定會把它放到一個函數中。這樣你就不會重複所有的代碼。

function functionName($input){ 
    return ucfirst(str_replace('_',' ',html_entity_decode(trim($input), ENT_QUOTES))); 
} 

echo functionName($variable); 
+0

你在回車中有5個關門的人和4個開門人。 – 2010-08-21 10:22:52

+0

@Peter Ajtai&@ Sam152謝謝大家非常感謝,讓頁面「多」easer「閱讀/代碼 - 恥辱我不能同時接受對不起巴勒斯坦權力機構,但山姆第一 – user351657 2010-08-21 10:25:26

+0

修正了代碼,是的,給該函數的名稱描述了它正在預執行的動作,並且您的代碼將非常好地讀取。 – Sam152 2010-08-21 10:29:05

4

如果你想在一個類中有這個(問題標題暗示),那麼你應該創建Filter類。這是一件很平常的事情。但是,與簡單的函數嵌套相比,它將會有更多的代碼正確執行。優點是,您可以輕鬆地擴展和組合濾波器,以滿足您的任何過濾需求。

我已經爲你快速提供了一些東西。

interface IFilter { 
    /** 
    * @param Mixed $value The value to be filtered 
    * @return Mixed The filtered value 
    */ 
    public function filter($value); 
} 

所有過濾器必須實現IFilter接口。這是爲了確保無論何時使用過濾器,它都有一個filter()方法,該方法接受一個$value參數。我們無法執行返回值,但doc塊表示我們期望它返回過濾值。兩個非常簡單的過濾器將如下所示:

class ucFirstFilter implements IFilter 
{ 
    public function filter($value) { 
     return ucfirst($value); 
    } 
} 

class TrimFilter implements IFilter 
{ 
    public function filter($value) { 
     return trim($value); 
    } 
} 

這只不過是圍繞PHP的兩個本機函數的對象封裝。您可以使用這樣的:

$trimFilter = new TrimFilter; 
echo trimFilter->filter(' trim me '); 
// returns 'trim me' 

其他兩個過濾器稍微複雜一些,因爲它們可以通過多個參數:

class SeparatorToSeparatorFilter implements IFilter 
{ 
    protected $_separator; 
    protected $_replacement; 
    public function __construct($separator = '_', $replacement = ' ') 
    { 
     $this->_separator = $separator; 
     $this->_replacement = $replacement; 
    } 
    public function filter($value) { 
     return str_replace($this->_separator, $this->_replacement, $value); 
    } 
} 

class HtmlEntityDecodeFilter implements IFilter 
{ 
    protected $_quoteStyle; 
    protected $_charset; 
    public function __construct($quoteStyle=ENT_COMPAT, $charset='ISO-8859-1') 
    { 
     $this->_quoteStyle = $quoteStyle; 
     $this->_charset = $charset; 
    } 
    public function filter($value) { 
     return html_entity_decode($value, $this->_quoteStyle, $this->_charset); 
    } 
} 

正如你所看到的,附加的參數配置通過構造函數完成。我已經使用了一些默認值,所以當你需要偏離這些值時你只需要提供它們。在第二個過濾器的情況下,我使用了本機功能的默認設置。這就是你如何使用它們:

$trimFilter = new TrimFilter; 
$separatorFilter = new SeparatorToSeparatorFilter('-'); 
echo $separatorFilter->filter($trimFilter->filter(' trim-me ')); 
// returns 'trim me'; 

現在你可能會試圖將多個過濾器添加到一個Filter類中。別。每個過濾器只能完成一件事。有更好的方法來組合過濾器。所有你需要的是匯聚了多個其他過濾器又名一個FilterChain一個過濾器:

class FilterChain implements IFilter 
{ 
    protected $_filters; 
    public function __construct() 
    { 
     $this->_filters = new SplObjectStorage; 
    } 
    public function chain(IFilter $filter) 
    { 
     $this->_filters->attach($filter); 
     return $this; 
    } 
    public function remove(IFilter $filter) 
    { 
     $this->_filters->detach($filter); 
     return $this; 
    } 
    public function filter($value) { 
     foreach($this->_filters as $filter) { 
      $value = $filter->filter($value); 
     } 
     return $value; 
    } 
} 

FilterChain接受實現IFilter,如果你調用它的filter()方法的對象,它會遍歷所有鏈接過濾器的順序,你chain()編他們,並返回$value傳遞:

$filterChain = new FilterChain; 
$filterChain->chain(new ucFirstFilter) 
      ->chain(new SeparatorToSeparatorFilter) 
      ->chain(new HtmlEntityDecodeFilter(ENT_QUOTES, 'UTF-8')) 
      ->chain(new TrimFilter); 

echo $filterChain->filter(' i am a "string_to_be_filtered" '); 
// outputs 'i am a "string to be filtered"' 

因爲FilterChain還實現IFilter本身,你還可以將它添加到其他FilterChains。這是一個Composite Pattern。上面的過濾器可以寫成:

$chain1 = new FilterChain; 
$chain1->chain(new ucFirstFilter) 
     ->chain(new SeparatorToSeparatorFilter); 

$chain2 = new FilterChain; 
$chain2->chain($chain1); 
$chain2->chain(new HtmlEntityDecodeFilter(ENT_QUOTES, 'UTF-8')) 
     ->chain(new TrimFilter); 

正如你所看到的,它是更多的代碼,但它也是非常可擴展的。將所有原生函數封裝到一個函數中的單個函數的主要優點是您可以以任何您想要的方式組合任何內容。如果您決定需要另一個不利用功能的功能,那麼您必須編寫一個全新的功能,並且您會無意中最終得到許多功能和冗餘代碼,以用於任何可能的過濾器組合。使用FilterChain,您只需根據需要將過濾器和過濾器鏈接在一起即可。而且由於FilterChain是一個對象,所以可以自由傳遞它。

幸運的是,像這樣的過濾器庫已經存在,例如Zend_Filter提供了許多預製過濾器,並且可以單獨使用(例如,無需將應用程序遷移到ZF)。