关于php和范围的澄清
main.controller.php:关于php和范围的澄清,php,scope,Php,Scope,main.controller.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 funct
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是一个简单的视图对象
这是我的root.layout.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title><?php $view->print_title(); ?></title>
</head>
<body>
root layout
</body>
</html>
根布局
似乎我无法从包含的布局文件中访问$view对象,这可能是一个愚蠢的问题,但现在我真的不明白为什么不应该工作
有人能解释一下php在这种情况下是如何工作的吗?我做错了什么?使用
include
而不是include\u once
,因为可以多次调用您的方法,并且它只在第一次(“一次”)起作用
PHP文档介绍了(还包括一次):
包含文件时,它包含的代码将继承变量
包含发生的行的范围。任何可用的变量
在该行中,调用文件将在被调用的
文件,从那一点开始。但是,所有函数和类
包含文件中定义的具有全局范围
因此,所有操作都应该使用传递的$view
变量
还有一个(页面上的第一个)解释了在包含之前行中可用的任何变量都将在包含的文件中可用 当你不能
render()
时,你真的传递了什么吗。请注意,您也有语法错误。问题用完整代码编辑。。