我正在创建一个像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正在运行?
答案 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
中的代码是在中使用而在函数中使用(似乎是),则将其全部内容复制到类中 - 并且不要使用require
或include
尝试将其粘贴到其中。
一个类永远不会有多个文件。文件的长度无关紧要。
编辑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
语句;他们没有地方在那里。