好的,我有一个 index.php:
<?php
require 'php/stdlib.php';
$site->page->render();
foreach($page as $var => $value) {
echo $var ." is ". $value." <br/>";
}
?>
站点和页面的 obj 创建在 stdlib 文件中,显然可以正常工作,因为 -for each- 循环打印出:
name is welcome
headers is inc/index_h.php
footers is inc/index_f.php
contents is inc/welcome.php
表示对象已经创建。 我还做了一个 var dump 并得到了正确的结果 这是网站---页面---呈现:
public function render_page(){
$this->page->render();
}
这是页面---渲染:
public function render(){
include $this->headers;
include $this->contents;
include $this->footers;
}
但是脚本的结果如下:
undefined variable :
还有
尝试获取非对象的属性: 这两个错误都指向我在页眉包含文件中使用的 $page 对象:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $page->name; ?></title>
<script src="/scripts/jquery.js"></script>
</head>
<body>
错误实际上是在 html 标题标签中打印出来的,而不是在屏幕上,这意味着我必须在浏览器上使用“查看源代码”才能看到它 使用包含时如何使 $page 对象可见 我通常很擅长自己寻找答案,但这件事让我难过了两天。(我在寻找答案的过程中学到了很多其他东西,所以我想并不是所有的东西都丢失了)如果有人能帮助我,我将不胜感激它。
可能应该添加页面和站点对象在 stdlib.php 中用以下内容实例化
$site = new csite();
site_ini($site);
$page = new cpage("welcome");
$site->setPage($page);
最佳答案
当您使用 PHP 的内置 include
函数,包含文件的内容在与调用 include
相同的范围内执行.因此,你真的很想调用 $this
在包含的文件中,因为它们的代码被执行,就好像它实际上是写在 inside render()
中一样方法,你会注意到没有 $page
在该方法中声明了变量。
另一方面,设置$page = $this
可能在句法上更有意义在第一个 include
之前.
我给你投了赞成票,因为虽然标题没有暗示它,但你实际上强调了 PHP include
的一个重要方面。和 require
函数:它们传递作用域的方式。
有关此主题的更多信息,请仔细阅读有关该函数的 PHP.net 文档: http://www.php.net/manual/en/function.include.php
编辑:为了阐明为什么一个示例有效,而另一个示例无效,这是因为来自 include 的 $page 与您的 foreach 具有相同的范围,但未在渲染内部声明。
但是,不要将其作为全局变量引入。从句法上讲,你想渲染你调用渲染的页面,所以:$this
关于PHP-包含后看不到类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23002695/