2011-12-04 10 views
7

मैं निम्नलिखित वर्ग: मैं टेम्पलेट में TheView::$variables उपलब्ध (प्रत्येक मद के कुंजी में सभी चर कैसे कर सकते हैंटेम्पलेट में चर उपलब्ध कैसे करें?

<?php 
echo $Message; 
?> 

:

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    include($this->template); 
    } 
} 

टेम्पलेट फ़ाइल एक सरल PHP फ़ाइल है परिवर्तनीय का नाम होना चाहिए)।

मैंने पहले से ही $GLOBALS पर सभी चर जोड़ने की कोशिश की है लेकिन यह काम नहीं करता है (और मुझे लगता है कि यह एक बुरा विचार है)।

उत्तर

5

मैं हमेशा ऐसा करने से अंत: अज्ञात फ़ंक्शन और func_get_arg() कॉल

public function render($path, Array $data = array()){ 
    return call_user_func(function() use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(0); 
     return ob_get_clean(); 
    }, $path); 
} 

नोट; मैं उन्हें $this और टेम्पलेट में पारित होने से अन्य चर "प्रदूषण" को रोकने के लिए उपयोग करता हूं। आप समावेशन से पहले $data को अनसेट भी कर सकते हैं।

यदि आप $this उपलब्ध हैं, तो बस extract() और include() सीधे विधि से उपलब्ध है।

तो आप कर सकते हैं:

$data = array('message' => 'hello world'); 
$html = $view->render('path/to/view.php', $data); 

साथ path/to/view.php:

<html> 
    <head></head> 
    <body> 
     <p><?php echo $message; ?></p> 
    </body> 
</html> 

यदि आप चाहते हैं वस्तु देखें पारित कर दिया है, लेकिन render() विधि के दायरे से नहीं है, यह परिवर्तन इस प्रकार है:

public function render($path, Array $data = array()){ 
    return call_user_func(function($view) use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(1); 
     return ob_get_clean(); 
    }, $this, $path); 
} 

$view व्यू ऑब्जेक्ट का उदाहरण होगा। यह टेम्पलेट में उपलब्ध होगा, लेकिन यह केवल सार्वजनिक सदस्यों का पर्दाफाश करेगा, क्योंकि यह render() विधि (निजी/संरक्षित सदस्यों) के encapsulation को संरक्षित करने के दायरे से बाहर है

+0

धन्यवाद, ठीक काम करता है! – user897029

+0

मुझे एक ** - 1 ** दिखाई देता है; क्यों उत्सुक है? आप अलग-अलग क्या करेंगे, रहस्य ** - 1 ** 'er? – Dan

+0

हमम मुझे एक -1 नहीं देखता है, शायद उसने अपनी राय बदल दी है;) – user897029

3

आप extract() उपयोग कर सकते हैं:

public function display() 
{ 
    extract($this->variables); 
    include($this->template); 
} 
+0

भी ठीक काम करता है, धन्यवाद! लेकिन मुझे लगता है, अगर मैं सिर्फ दृश्य चर शामिल नहीं करता हूं तो यह क्लीनर होगा। – user897029

0

इस प्रयास करें:

foreach($variables as $key => $value){ 
    $$key = $value; 
} 
+1

यह 'निकालने के समान है ($ चर, EXTR_OVERWRITE); '। – user897029

+0

आह, ठीक है! मैं अभी तक PHP की सभी अच्छी छोटी विशेषताओं को नहीं जानता। – ThatOtherPerson

+0

मैंने 'निकालने()' के बारे में सुना लेकिन मुझे अपनी समस्या के समाधान (अब हल) नहीं मिला। यह एक प्रोग्रामर जीवन है - हमेशा कर कर सीखना;) – user897029

0

आप वर्तमान प्रतीक तालिका में एक सरणी से चर आयात करने के लिए extract फ़ंक्शन का उपयोग कर सकते हैं।

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    extract($this->variables); 
    include($this->template); 
    } 
} 
संबंधित मुद्दे