2012-11-19 50 views
7

PHP में कभी कभी मैं इस देखें:पीएचपी: <<< ob_start बनाम

$html = <<<HTML 
<p>Hello world</p> 
HTML; 

आम तौर पर मैं ob_start इस्तेमाल किया है |():

ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_contents(); 
ob_clean(); 

तुम मुझे क्या इन दोनों के बीच अंतर बता सकते हैं बफर और उनके फायदे को लिखने के तरीके?

+5

मैं कहूंगा कि हेरडोक स्पष्ट रूप से बहुत साफ है। यह "बफर को लिखने के विभिन्न तरीके" भी नहीं है। हेरडोक * स्ट्रिंग * उद्धृत करने का एक तरीका है। 'ob_' एक है, मैं कहता हूं, यह आउट होने से पहले किसी भी आउटपुट को कैप्चर करने के लिए हैक करें। – deceze

+1

धोखे से सहमत हैं, 'ob_ * 'कार्यों का अधिकतर उपयोग खराब डिजाइन को इंगित करता है। फिर फिर नियंत्रक या मॉडल में हेरडोक की चीख 'दृश्य परत'। –

+0

@ माइकबी यह भी चिल्लाता है "हेई मुझे एक और कोडर के लिए पैसे देते हैं!" –

उत्तर

6

हेरडोक (<<<) एक चर डेटा में एक स्ट्रिंग डेटा लिखने का एक और तरीका है। दूसरी तरफ, आउटपुट बफर के बाद होने वाले सभी आउटपुट को पकड़ लेगा जो ob_get_contents() पर कॉल करने से पहले किसी भी चेतावनी या त्रुटियों के आपके (एचटीएमएल) आउटपुट सहित हो सकता है;

आमतौर पर, यदि आपको केवल HTML के साथ एक स्ट्रिंग को प्रारूपित करने की आवश्यकता है, तो केवल हेरडोक या नियमित स्ट्रिंग नोटेशन का उपयोग करें। आउटपुट बफर आमतौर पर उपयोग किया जाता है यदि आपको किसी भी HTTP शीर्षलेख भेजने से पहले आउटपुट पकड़ने की आवश्यकता होती है (उदाहरण के लिए, यदि आप अपने एप्लिकेशन को डीबग करने के लिए FirePHP का उपयोग कर रहे हैं, तो आपको आउटपुट बफरिंग का उपयोग करना होगा क्योंकि FirePHP HTTP में लॉगिंग डेटा एम्बेड करता है हेडर)।

+1

धन्यवाद दोस्तों। मैं बिंदु देखता हूँ। हेरेडोक सरल HTML टेम्पलेट्स के लिए अच्छा है जबकि ob_start(), ob_get_contents() बीच में सब कुछ पकड़ लेता है। – Jedi

8
$html = <<<HTML 
<p>Hello world</p> 
HTML; 
// equivalent: 
$html = "<p>Hello world</p>"; 

यह PHP string Heredoc syntax का उपयोग करता है, जो एक वाक्य रचना एक किसी भी तरह अलग तरीके से एक स्ट्रिंग, एकल उद्धरण और दोहरे उद्धरण चिह्नों का उपयोग कर के लिए इसी तरह लिखना लेकिन चीजों से बचने के लिए है। आप {} का उपयोग सीधे इसमें कुछ PHP स्ट्रिंग डालने के लिए कर सकते हैं।


<?php 
ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_clean(); 

यह एक पूरी तरह से अलग बात है। यह का उपयोग पर PHP कोड ब्लॉक के अंदर उन चीज़ों को कैप्चर करने के लिए करता है। दिए गए उदाहरण की तरह, <p>Hello world</p> PHP कोड ब्लॉक के बाहर लिखा गया है, जिसे तुरंत क्लाइंट को आउटपुट माना जाता है। आउटपुट बफरिंग सक्षम होने के साथ वे PHP में एक बफर के अंदर संग्रहीत होते हैं, ताकि इसे बाद में ob_get_contents() या ob_get_clean() का उपयोग करके पुनर्प्राप्त किया जा सके। यदि आपको किसी भी PHP चर डालने की आवश्यकता है, तो आपको <?=$blah?> या यहां तक ​​कि <?php echo $blah?> का उपयोग करने की आवश्यकता है।


कुछ सीएमएस सामग्री और मॉड्यूल प्रबंधित करने के लिए आउटपुट बफरिंग नियंत्रण कार्यों का उपयोग करते हैं। एक उदाहरण जूमला है। इस डिज़ाइन का लाभ यह है कि जब भी मॉड्यूल को अपनी आरक्षित जगह पर सामग्री रखने की आवश्यकता होती है, तो यह सामग्री उपलब्ध कराने के लिए बस echo का उपयोग कर सकती है। यह मॉड्यूल से सामग्री प्राप्त करने के तरीके को सरल बना सकता है, किसी विशिष्ट फ़ंक्शन कॉल को लागू करने या किसी विशिष्ट चर को असाइन करने की आवश्यकता के बिना, जिससे सिस्टम को प्रबंधित करना आसान हो जाता है।

<?php 
ob_start(); 
include dirname(__FILE__)."/content.php"; 
$content = ob_get_clean(); 
output_document(array("body"=>$content)); 

मैं भी ऐसी है कि मैं ऊपर एक फ़ाइल को शामिल कर सकते हैं और अंत मैं एक साधारण टेम्पलेट प्रणाली बना सकते हैं पर किसी भी पीएचपी बिना उत्पादन बफरिंग कार्यों का इस्तेमाल करते हैं, लेकिन इस तरह की है विषय से परे।

+0

आपकी व्याख्या के लिए धन्यवाद :-) वास्तव में जानकारीपूर्ण! – Jedi

+0

जूमला इसका उपयोग कर रहा है? जानकारी के लिए धन्यवाद - अब मुझे सच में पता है कि चरम में एचटीएमएल संग्रह करने के लिए आउटपुटबफरिंग का उपयोग करना एक खराब डिजाइन है :) (जूमला बहुत गन्दा/खराब मेरे लिए डिज़ाइन किया गया है :)) –

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