-1

我正在创建一个像 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 类中。

编辑:为什么正在运行?

4

3 回答 3

3

别再看那个愚蠢的“教程”了。这太糟糕了,以至于有一次我真的开始笑了。

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

.. 等等。而且你不会仅仅通过阅读文章来理解这些原则。

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

此外,您必须了解,如果您这样做self::something();,它就在对象之外。您在类上调用静态方法,这实际上只是进行过程编程的糟糕方式。

您应该从学习PHP中 OOP 的基础知识开始,因为您不了解它。为了你自己的利益,至少一年远离 MVC 和框架。

于 2012-08-16T03:29:56.763 回答
2

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

$callObject= new call($filename);

然后像这样在页面中引用它:

$callObject->title;

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

编辑:好的,我明白你现在在做什么,天哪。

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

PHP 会让你拥有header.php文件原样,但是当 PHP 评估内容时,你的对象是不完整的。您应该阅读this question,它将更详细地回答该部分。

编辑 2:不要在文件之间拆分函数。

如果里面的代码header.php在函数中使用(看起来是这样),则将它的全部内容复制到类中 - 不要使用 a or试图即时粘贴它。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.
    }
}
?>
于 2012-08-15T23:43:45.547 回答
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他们没有地方在那里。

于 2012-08-15T23:43:37.053 回答