2013-01-07 38 views
0

main.controller.php:澄清关于PHP和范围

final class MainController extends Controller { 

    public function is_locked() { 
     $lock = new View('lock'); 
     Res::render($lock); 
    } 
} 

view.class.php:

final class View { 

    private $data; 


    public function get_title() { 
     return isset($this->title) ? $this->title : DEFAULT_TITLE; 
    } 
    public function get_layout() { 
     return isset($this->layout) ? $this->layout : 'base'; 
    } 
    public function get_layout_path() { 
     return SITE_PATH .'app/views/layouts/'. $this->get_layout() .'.layout.php'; 
    } 
    public function get_path() { 
     return SITE_PATH .'app/views/' .$this->name .'.view.php'; 
    } 


    public function print_title() { 
     echo $this->get_title; 
    } 

    public function __construct($name) { 
     $this->data = array(); 
     $this->data['name'] = $name; 
    } 
    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 
    public function __get($name) { 
     if (array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 

     $trace = debug_backtrace(); 
     trigger_error('Undefined property via __get(): '. $name .' in '. $trace[0]['file'] .' on line' . $trace[0]['line'], E_USER_NOTICE); 
     return null; 
    } 
    public function __isset($name) { 
     return isset($this->data[$name]); 
    } 
    public function __unset($name) { 
     unset($this->data[$name]); 
    } 
} 

这是我对我的回应类渲染方法:

public static function render($view) { 
    include_once SITE_PATH .'app/views/layouts/root.layout.php'); 
} 

从我的一个控制器中调用... param $ view是一个简单的View对象...

这里是我的root.layout.php:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title><?php $view->print_title(); ?></title> 
</head> 

<body> 
root layout 
</body> 
</html> 

我似乎无法从布局文件访问到$视图对象包括,可能是一个愚蠢的问题,但现在我真的”不知道为什么不应该工作...

有人能解释我如何在这种情况下工作的PHP?我做错了什么?

+0

当你不能渲染()时,你真的传递了一些东西吗?请注意,您也有语法错误。 – KingCrunch

+0

用完整的代码编辑的问题.. – cl0udw4lk3r

回答

1

使用include而不是include_once,因为您的方法可以多次调用,并且它只能处理第一个(“一次”)时间。

PHP的文件说有关scope of include(以及include_once):

当包括一个文件,它包含的代码继承在其上包括发生线的可变 范围。从该点开始,调用文件中该行的可用变量 将在被调用的 文件中可用。但是,包含文件中定义的所有函数和类 都具有全局范围。

因此,一切都应该与您通过的$view变量一起工作。

另外还有一个nice example(页面上的第一个),它解释了在include之前的行中可用的任何变量将在包含的文件中可用。

+1

谢谢,最后是由于我的疲劳导致的一个错误:P – cl0udw4lk3r