3

好的,我有一个 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 转储,结果正确,这里是 site---page---render:

   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 标题标签中打印出来的,而不是在屏幕上,这意味着我必须在浏览器上使用 View Source 才能看到它如何在使用包含时让 $page 对象可见 我通常很擅长自己找到答案但这件事让我难倒了两天。(我在寻找答案时学到了很多其他的东西,所以我想并不是所有的东西都丢失了)如果有人能帮助我,我将不胜感激。

可能应该添加页面和站点对象在 stdlib.php 中实例化,如下所示

$site = new csite();   
site_ini($site);   
$page = new cpage("welcome");  
$site->setPage($page);
4

1 回答 1

0

当您使用 PHP 的内置include函数时,包含文件的内容与对include. 因此,您确实想调用$this包含的文件,因为它们的代码被执行,尽管它实际上是写render()方法中的,并且您会注意到在该方法中没有声明任何变量$page

另一方面,$page = $this在第一个之前设置可能更有意义include

我为你投了赞成票,因为虽然标题没有暗示,但你实际上是在强调 PHPincluderequire函数的一个重要方面:它们传递范围的方式。

有关此主题的更多信息,请仔细阅读有关该函数的 PHP.net 文档: http ://www.php.net/manual/en/function.include.php

编辑:为了阐明为什么一个示例有效,而另一个示例无效,这是因为包含中的 $page 与您的 foreach 具有相同的范围,但未在渲染中声明。

但是,不要将其作为一个全局对象引入。从语法上讲,您要渲染调用 render 的页面,因此: $this

于 2014-05-14T22:14:32.257 回答