2011-12-04 23 views
7

Tôi có lớp sau:Làm cách nào để biến các biến có sẵn trong mẫu?

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

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

Mẫu file là một file PHP đơn giản:

<?php 
echo $Message; 
?> 

Làm thế nào tôi có thể làm cho tất cả các biến trong TheView::$variables có sẵn trong các mẫu (chìa khóa của từng hạng mục phải là tên của biến).

Tôi đã cố gắng thêm tất cả các biến vào $GLOBALS nhưng điều đó không hiệu quả (và tôi nghĩ đó là một ý tưởng tồi).

Trả lời

5

tôi luôn luôn kết thúc làm điều này:

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); 
} 

Lưu ý các chức năng ẩn danh và func_get_arg() cuộc gọi; Tôi sử dụng chúng để ngăn chặn $this và biến "ô nhiễm" khác được truyền vào mẫu. Bạn cũng có thể hủy đặt số $data trước khi đưa vào.

Nếu bạn muốn $this có sẵn, chỉ cần extract()include() trực tiếp từ phương pháp.

Vì vậy, bạn có thể:

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

Với path/to/view.php:

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

Nếu bạn muốn xem đối tượng trôi qua, nhưng không phải từ phạm vi của phương pháp render(), thay đổi nó như sau:

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 sẽ là phiên bản của đối tượng Chế độ xem. Nó sẽ có sẵn trong mẫu, nhưng sẽ chỉ hiển thị các thành viên công cộng, vì nó nằm ngoài phạm vi của phương pháp render() (bảo quản đóng gói của các thành viên riêng tư/được bảo vệ)

+0

Cảm ơn, hoạt động tốt! – user897029

+0

Tôi thấy ** - 1 **; tò mò là tại sao? Bạn sẽ làm gì khác, bí ẩn ** - 1 ** 'er? – Dan

+0

Hmmm Tôi không thấy -1, có thể anh ta/cô ấy đã thay đổi ý kiến ​​của mình;) – user897029

3

Bạn có thể sử dụng extract():

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

Hoạt động tốt, cảm ơn! Nhưng tôi nghĩ, nó sẽ sạch hơn nếu tôi chỉ bao gồm các biến xem không phải $ này. – user897029

0

Hãy thử điều này:

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

Giống như 'trích xuất ($ biến, EXTR_OVERWRITE);'. – user897029

+0

Ahh, được rồi! Tôi chưa biết tất cả các tính năng nhỏ của PHP. – ThatOtherPerson

+0

Tôi nghe nói về 'trích xuất()' nhưng tôi đã không tìm ra giải pháp cho vấn đề của tôi. Đó là một cuộc sống lập trình viên - luôn luôn học hỏi bằng cách làm;) – user897029

0

Bạn có thể sử dụng chức năng extract nhập khẩu biến từ một mảng vào bảng biểu tượng hiện tại.

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); 
    } 
} 
Các vấn đề liên quan