又一个“呼叫成员函数解决非对象”问题

时间:2009-12-30 14:10:48

标签: php mysql php4

我有一个html页面,它调用一个php对象来从数据库中获取一些数据。它工作正常,但脚本变得笨重,所以我决定将其中的一部分分解为一堆函数。

所以我有以下文件:

// htdocs/map.php
<?php
    include("config.php");
    include("rmap.php");

    $id = 1;
    $gamenumber = getGameNumber($id);
    echo $gamenumber;
?>

// htdocs/config.php
<?php
$_PATHS["base"]      = dirname(dirname(__FILE__)) . "\\";
$_PATHS["includes"]  = $_PATHS["base"] . "includes\\";

ini_set("include_path", "$_PATHS[includes]");
ini_set("display_errors", "1");
error_reporting(E_ALL); 

include("prepend.php");
?> 

// includes/prepend.php
<?php
include("session.php");
?>

// includes/session.php
<?php
includes("database.php");

class Session {
    function Session() {
    }

};

$session = new Session;
?>

// includes/database.php
<?php
include("constants.php");

class Database {

    var $connection;

    function Database() {
        $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
        mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
    }

    function query($query) {
        return mysql_query($query, $this->connection);
    }
};

/* Create database connection */
$database = new Database;
?>

// includes/rmap.php
<?php
function getGameNumber($id) {
    $query = "SELECT gamenumber FROM account_data WHERE usernum=$id";
    $result = $database->query($query); // line 5
    return mysql_result($result, 0);
}
?>

常量中有一堆定义(DB_USER等)。

因此,map.php包含config.php。这反过来包括prepend.php,其中包括session.php和包括database.php。 map.php还包括rmap.php,它试图使用database对象。

问题是我得到了

  

致命错误:调用非对象中的成员函数    C:\ Develop \ map \ includes \ rmap.php 在线 5

通常的原因是$ database对象没有被创建/初始化,但如果我添加代码来显示调用哪些(通过echo "DB connection created";echo "using DB connection";)它们被调用(或者至少以正确的顺序显示。

如果我将include("database.php")添加到rmap.php,我会在重新定义constants.php中的内容时遇到错误。如果我使用require_once,我会得到与之前相同的错误。

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

$database不在函数GetGameNumber范围内。

最简单但不一定是最好的解决方案是

<?php
function getGameNumber($id) {
    global $database;  // added this
    $query = "SELECT gamenumber FROM account_data WHERE usernum=$id";
    $result = $database->query($query); // line 5
    return mysql_result($result, 0);
}
?>

全局被认为是不完美的,因为它违反了OOP的原则,并且据说对性能有一些影响,因为全局变量及其所有成员都被添加到函数的范围中。不过,我不知道这对性能有多大影响。

如果你想进入这个问题,我会asked a question on how to organize such things一段时间回来并获得一些好的答案和链接。

答案 1 :(得分:0)

您需要包含

global $database;

位于getGameNumber()的顶部,因为$database是在getGameNumber本身之外定义的

答案 2 :(得分:0)

您的$database varibleis无法自动从功能范围访问。您可能需要在函数中将其声明为global $database;

PHP中的范围在文档中进行了解释:http://de3.php.net/manual/en/language.variables.scope.php

请注意,PHP 4和MySQL3不支持漫长的时间,可能包含安全问题和其他未解决的问题。