我可以在PHP中使用包含头文件的类方法吗?

时间:2010-01-17 08:05:14

标签: php class

请查看下面的示例代码,我有一个加载到配置文件中的类文件。然后将配置文件加载到我构建的任何页面中。是否可以像我在show_header()方法中那样包含头文件?它似乎没有用,所以我怎样才能达到这个结果呢?

// Core.class.php
class Core
{

    public function show_header($page_name){
        require_once 'includes/header.inc.php';
    }

}

// config.inc.php
require_once 'Core.class.php';
$core = New core;



// testpage.php
require_once 'config.inc.php';
$core->show_header('home');

这是我试图包含在页面中的header.inc.php文件的顶部,它似乎可以包含它,但它打破了头文件的工作方式。

//header.inc.php
<?PHP

//start page timer
$session->get('user_id');
$profiler = new Profiler;
$profiler->start();


//see if site is turned on/off
$core->sitestatus($config['site_status']); 

这部分给我这样的错误......

  

注意:未定义的变量:会话在   C:\网络服务器\ htdocs中\ friendproject2 \包括\的header.inc.php   在第5行

     

致命错误:调用成员函数   get()在非对象中   C:\网络服务器\ htdocs中\ friendproject2 \包括\的header.inc.php   在第5行

5 个答案:

答案 0 :(得分:2)

当你在函数中包含一个文件时,就像你在该函数中编写该文件中的代码一样。

e.g。

file foo.php:

<?php
echo $foo->getFoo();

文件bar.php

<?php
class Foo {
    public function getFoo() {return 'foo';}
}

$foo = new Foo();

function bar()
{
    require 'foo.php';
}
bar();

以上将导致抛出以下通知/错误,因为$ foo在bar()中是未知的。

Fatal error: Call to a member function getFoo() on a non-object in /Users/hobodave/foo.php on line 3

编辑:

我不确定你的“核心”类完全需要什么,但你也许可以将它用作“全局”的一种存储类型。

e.g。

<?php
$session = new Session();
$core->session = $session;

然后您的$会话可以使用$ this-&gt; session

在您的标题中访问

答案 1 :(得分:1)

重新发表您的评论,听起来您需要一个根网络上下文对象,您可以从中引用其他对象:

$ctx = WebContext::get();
$ctx->session->get('x');
$ctx->input->get('y');
$ctx->identity->valid;

等......大多数网络框架就是这样做的。

需要定义$ session,然后在包含的文件中引用:

// If a global variable:
global $session;
$session->get('x');

// If a member of Core:
$this->session->get('x');

是的,你可以这样做,可能你需要require而不是require_once,路径需要基于当前的工作目录或绝对路径

尝试添加error_reporting(E_ALL)以查看是否有任何通知......

答案 2 :(得分:0)

您在头文件中进行的所有调用都将被调用,就好像它们是show_header函数内的本地调用一样。因此,如果要使用任何全局变量,则必须在所包含文件的顶部(或show_header函数的开头)使用global $variablename;

答案 3 :(得分:0)

如果对会话类使用静态函数,则无需在同一文件中定义它。 http://php.net/manual/en/language.oop5.static.php

答案 4 :(得分:0)

您正在尝试访问超出范围的$ session,如另一个答案所示。

由于会话内容在大多数应用程序中通常是全局的,因此请考虑使用Session类的单例模式。

通过这种方式,您可以执行类似$ session = Session :: getInstance()。

的操作

这使您可以在任何地方使用会话类,通常只需要一个会话类的实例(通常)。有关单例类的示例,请参阅Zend Framework。