【问题标题】:Can I have a class method include a header file for me in PHP?我可以让一个类方法在 PHP 中包含一个头文件吗?
【发布时间】:2010-01-17 08:05:14
【问题描述】:

请查看下面的示例代码,我有一个加载到配置文件中的类文件。然后将配置文件加载到我构建的任何页面中。是否可以像我在 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:\webserver\htdocs\friendproject2\includes\header.inc.php 在第 5 行

致命错误:调用成员函数 get() 在一个非对象上 C:\webserver\htdocs\friendproject2\includes\header.inc.php 在第 5 行

【问题讨论】:

  • 你在哪里有 $session 类?

标签: php class


【解决方案1】:

当您从函数中包含文件时,就好像您在该函数中编写了该文件中的代码。

例如

文件 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

编辑:

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

例如

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

然后您的 $session 将可以在您的标头中使用 $this->session

访问

【讨论】:

  • 这似乎是我遇到的确切问题,除了将对象声明为全局之外,还有其他方法吗?
  • 是的,不做你正在做的事。我建议使用框架,或者在开始尝试构建自己的框架之前查看框架是如何构建的。当我包含文件时,它们几乎从不执行代码,而只包含类/函数定义。
【解决方案2】:

您的评论,听起来您需要一个根 Web 上下文对象,您可以从中引用其他对象:

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

等等...这是大多数 Web 框架的做法。

需要定义$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) 以查看是否有任何通知发生...

【讨论】:

  • 嗨,我刚刚意识到它可以用于包含页面,它只是因为某种原因破坏了我在头文件中进行的任何类/方法调用
  • 会话类当前在config.inc.php文件中启动,是否可以从那里使用它,因为配置文件是在包含头文件之前加载的?
  • 是的,在这种情况下,您需要在包含中global $session
  • 问题是您错误地期望从函数 show_header 中执行的代码了解存在于它们之外的变量。
  • 这令人失望,因为在我的头文件中,除了会话一个之外,我还有许多对象被调用,所以我需要在头文件中创建 10 个全局对象,看起来我可能会更好除非我能找到更好的方法,否则只需将头文件包含到我的所有文件中,感谢您的帮助
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您正在尝试访问 $session 超出了另一个答案中指出的范围。

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

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

      这使您可以在任何地方使用会话类,并且您通常只需要一个会话类的实例(通常)。查看 Zend Framework 以获取有关单例类的示例。

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 2012-08-04
        • 2021-08-23
        • 2013-01-15
        • 2021-04-28
        • 2011-07-17
        相关资源
        最近更新 更多