2010-08-21 14 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 खुलने वाले माता-पिता हैं। –

+0

@ पीटर अजटाई और @ सैम 152 आप दोनों की बहुत सराहना करते हैं, पेजों को पढ़ने/कोड करने के लिए "बहुत" आसान "बनाता है - शर्म की बात है कि मैं दोनों माफी पीए स्वीकार नहीं कर सकता लेकिन सैम पहले – user351657

+0

कोड को फिक्स्ड किया गया था। और हाँ, दे दो फ़ंक्शन एक ऐसा नाम है जो उस क्रिया का वर्णन करता है जो वास्तव में अच्छा प्रदर्शन कर रहा है और आपका कोड उत्कृष्ट रूप से पढ़ेगा। – Sam152

4

यदि आप इसे कक्षा में रखना चाहते हैं (जैसा कि प्रश्न शीर्षक का तात्पर्य है), तो आपको फ़िल्टर कक्षाएं बनाना चाहिए। यह करना एक आम बात है। हालांकि, सरल फ़ंक्शन घोंसले की तुलना में, यह ठीक से करने के लिए और अधिक कोड होगा। इसका फायदा यह है कि, आप आसानी से फ़िल्टरिंग आवश्यकताओं को किसी भी फ़िल्टरिंग आवश्यकताओं के साथ बढ़ा सकते हैं और जोड़ सकते हैं।

मैंने आपके लिए कुछ जल्दी से चाबुक किया है।

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

सभी फिल्टर IFilter इंटरफ़ेस को लागू करना होगा। यह सुनिश्चित करने के लिए है कि जब भी आप फ़िल्टर का उपयोग कर रहे हों, तो इसमें filter() विधि है जो एक $value तर्क स्वीकार करती है। हम वापसी मूल्यों को लागू नहीं कर सकते हैं, लेकिन डॉक्टर ब्लॉक ने संकेत दिया है कि हम फ़िल्टर किए गए मूल्य को वापस करने की उम्मीद करते हैं। दो बहुत ही सरल फिल्टर इस तरह दिखेगा:

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

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

यह लेकिन पीएचपी के मूल कार्यों के दो चारों ओर एक वस्तु आवरण कुछ नहीं है। आप इसे इस तरह का उपयोग करें:

$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'; 

अब आप एक ही फ़िल्टर वर्ग में कई filterings जोड़ने के लिए परीक्षा हो सकती है। न। प्रत्येक फ़िल्टर केवल एक चीज करना चाहिए। फ़िल्टर को गठबंधन करने का एक बेहतर तरीका है। आपको बस एक फिल्टर है कि एक 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); 

लिखा जा सकता है आप देख सकते हैं, यह बहुत अधिक कोड है, लेकिन यह भी बहुत विस्तृत है।एक ही समारोह होने पर मुख्य लाभ जो सभी मूल कार्यों को एक समारोह में लपेटता है, आप किसी भी तरह से किसी भी तरह से गठबंधन कर सकते हैं। यदि आपने तय किया है कि आपको trim() फ़ंक्शन का उपयोग नहीं करने वाले किसी अन्य फ़ंक्शन की आवश्यकता है, तो आपको एक पूरी तरह से नया फ़ंक्शन लिखना होगा और आप अनजाने में फिल्टर के किसी भी संभावित संयोजन के लिए कई फ़ंक्शंस और अनावश्यक कोड के साथ समाप्त हो जाएंगे। FilterChain के साथ आप बस आवश्यकतानुसार फ़िल्टर और फ़िल्टरChains जोड़ते हैं। और चूंकि FilterChain एक वस्तु है, इसलिए आप इसे आसानी से पास कर सकते हैं।

सौभाग्य से, इस तरह के फ़िल्टर पुस्तकालय पहले से मौजूद हैं, उदाहरण के लिए Zend_Filter कई प्रीडेड फ़िल्टर प्रदान करता है और स्टैंडअलोन का उपयोग कर सकता है (उदा। अपने ऐप को जेडएफ में माइग्रेट किए बिना)।

संबंधित मुद्दे