PHP-在包含后无法看到类成员

时间:2014-04-11 02:56:54

标签: php class object scope members

好吧我有一个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);

1 个答案:

答案 0 :(得分:0)

当您使用PHP的内置include函数时,包含文件的内容将在与include的调用相同的范围内执行。因此,您真的想在包含的文件中调用$this,因为它们的代码是执行的 - 尽管它实际上是在内部 render()方法中编写的,您会注意到在该方法中没有声明$page变量。

另一方面,在第一个$page = $this之前设置include可能会有更多的句法意义。

我为你投了票,因为虽然标题没有提示,但你实际上是在强调PHP includerequire函数的一个重要方面:它们通过范围的方式。

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

编辑:为了澄清为什么一个例子有效,而另一个例子没有用,这是因为来自include的$ page与foreach具有相同的范围,但未在渲染中声明。

不要把它作为一个全局的拉入。从语法上讲,您希望渲染您调用渲染的页面,因此:$ this