打印类的变量时出现问题

时间:2012-08-15 23:40:05

标签: php oop

我正在创建一个像MVC这样的系统。
当我想调用视图文件时,我正在使用下面的类。 编辑:同时,他可以这样做:http://www.youtube.com/watch?feature=player_detailpage&v=Aw28-krO7ZM#t=1166s

<?php 
class Call{    
    function __construct($fileName) {
        //$this->db = new Database;
        self::callFile($fileName);
    }

    function callFile($fileName)
    {
        $this->title = "example";
        $this->description = "example";
        $this->keywords = "example";
        $fileName = $fileName . '.php';
        require PAGESPATH.'common/header.php';
        require PAGESPATH.$fileName;
        require PAGESPATH.'common/footer.php';
    }
}
?>

$ fileName是index.php。 Index.php只有

Index Page..

我想在header.php中打印数据,如下所示:

<html>
    <head>
        <meta charset="utf-8">
    <title><?php if(isset($this->title)){echo $this->title;} ?> - WebProgramlama.tk</title>
    <meta name="description" content="<?php if(isset($this->description)){echo $this->description;}?>" />
    <meta name="keywords" content="<?php if(isset($this->keywords)){echo $this->keywords;} ?>" />
   </head>
   <body>

但我收到了错误。

Fatal error: Using $this when not in object context in /var/www/webprogramlama/class/pages/common/header.php on line 4

我能解决这个问题吗? 注意:请小心! header.php是通过Call类调用的。 header.php在Call类中。

编辑:为什么this正在运行?

3 个答案:

答案 0 :(得分:3)

停止观看那个愚蠢的“教程”。真是太糟糕了,以至于我真的开始笑了。

你不能只是选择一种没有任何经验的语言,只是开始使用高级概念。 MVC就是这样的概念之一。要真正掌握它,您需要了解面向对象的编程以及与之相关的许多原则。

..等等。你只是通过阅读文章而不会理解这些原则。

至于如何解决问题,您可以阅读this article。它将解释如何使用模板。这实际上是你的“mvc教程”实际上是什么 - 制作路由机制和模板的糟糕指南。

此外,您必须明白,如果您执行self::something();,它就在对象之外。你正在一个类上调用一个静态方法,这实际上只是做程序编程的糟糕方法。

您应该首先学习PHP中的basics of OOP,因为您没有得到它。为了您自己的利益,至少要远离MVC和框架一年。

答案 1 :(得分:2)

您需要在代码中创建对象的新实例,而不是在类外调用元素$this->title,而不是:

$callObject= new call($filename);

然后在页面中引用它:

$callObject->title;

您只能在类本身内使用$this->代码。在其他任何地方,您需要创建一个对象,因此$this不存在 - 该类的对象确实存在 - 然后您必须通过其名称来引用它。同时,如果你的变量将被称为$callObject,你不能像那个里面的那样引用它 - 因为那时你还没有做出一个实例它,所以你需要通过$this语法来引用它,这是说my element called title的好方法。

编辑:好的,我现在看到你在做什么,好我。

这是相当危险的,因为你的header.php文件将包含大量在名为class的类中工作的东西 - 并且在每个其他情况下都会产生可怕的错误。

PHP会让你拥有header.php文件,但是当PHP评估内容时,你的对象就不完整了。你应该有一个read of this question来更详细地回答这个部分。

编辑2:不要在文件之间拆分功能。

如果header.php中的代码是在中使用而在函数中使用(似乎是),则将其全部内容复制到类中 - 并且不要使用requireinclude尝试将其粘贴到其中。

一个类永远不会有多个文件。文件的长度无关紧要。

编辑3:

这是标题部分的代码:

<?php 
class Call{    
    function __construct($fileName) {
    //$this->db = new Database;
    self::callFile($fileName);
    }

    function callFile($fileName)
    {
    $this->title = "example";
    $this->description = "example";
    $this->keywords = "example";
    $fileName = $fileName . '.php';
    echo "
<html>
    <head>
    <meta charset='utf-8'>
    <title>        
    ";
    echo (isset($this->title)) ? $this->title : "";
    echo "
 - WebProgramlama.tk</title>
    <meta name='description' content='
    ";
    echo (isset($this->description)) ? $this->description : "";
    echo "' />
    <meta name='keywords' content='
    ";
    echo (isset($this->contents)) ? $this->contents : "";
    echo "
' />
   </head>
   <body>
    ";

    //require PAGESPATH.$fileName;
    //require PAGESPATH.'common/footer.php';
    // you can only include files that don't use any $this-> type elements.
    }
}
?>

答案 2 :(得分:1)

$this在课堂之外没有上下文。创建一个类的实例并使用它。

<html>
    <head>
        <meta charset="utf-8">
<?php
    $class = new Call('filename');
?>    
    <title><?php if(isset($class->title)){echo $class->title;} ?> - WebProgramlama.tk</title>
    <meta name="description" content="<?php if(isset($class->description)){echo $class->description;}?>" />
    <meta name="keywords" content="<?php if(isset($class->keywords)){echo $class->keywords;} ?>" />
   </head>
   <body>

删除require函数中的callFile语句;他们没有地方在那里。