好吧我有一个index.php如下:
<?php
require 'php/stdlib.php';
$site->page->render();
foreach($page as $var => $value) {
echo $var ." is ". $value." <br/>";
}
?>
网站和页面的obj创建在stdlib文件中,显然正在工作 -for each-loop打印出来:
name is welcome
headers is inc/index_h.php
footers is inc/index_f.php
contents is inc/welcome.php
它显示对象已创建。 我也做了一个var转储,并且有正确的结果 这里是网站---页面---渲染:
public function render_page(){
$this->page->render();
}
这是页面---渲染:
public function render(){
include $this->headers;
include $this->contents;
include $this->footers;
}
然而,脚本的结果如下:
未定义的变量:
以及
尝试获取非对象的属性: 这两个错误都指向我在页面标题的包含文件中使用的$ page对象:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $page->name; ?></title>
<script src="/scripts/jquery.js"></script>
</head>
<body>
错误实际打印在html title标签中而不是屏幕上,这意味着我必须在浏览器上使用View Source才能看到它 如何在使用include时使$ page对象可见 我自己通常很擅长寻找答案,但这件事让我难以忍受了两天。(我在寻找答案时已经学到了很多其他的东西,所以我猜不是全部都丢失了)如果有人能帮助我,我会非常感激它。
可能应该添加页面和站点对象在stdlib.php中实例化,并带有以下内容
$site = new csite();
site_ini($site);
$page = new cpage("welcome");
$site->setPage($page);
答案 0 :(得分:0)
当您使用PHP的内置include
函数时,包含文件的内容将在与include
的调用相同的范围内执行。因此,您真的想在包含的文件中调用$this
,因为它们的代码是执行的 - 尽管它实际上是在内部 render()
方法中编写的,您会注意到在该方法中没有声明$page
变量。
另一方面,在第一个$page = $this
之前设置include
可能会有更多的句法意义。
我为你投了票,因为虽然标题没有提示,但你实际上是在强调PHP include
和require
函数的一个重要方面:它们通过范围的方式。
有关此主题的更多信息,请仔细阅读有关该函数的PHP.net文档: http://www.php.net/manual/en/function.include.php
编辑:为了澄清为什么一个例子有效,而另一个例子没有用,这是因为来自include的$ page与foreach具有相同的范围,但未在渲染中声明。
不要把它作为一个全局的拉入。从语法上讲,您希望渲染您调用渲染的页面,因此:$ this