在同一个类上下文中使用时,变量为null

时间:2015-06-24 18:09:30

标签: php class oop object

编写一个用于调试直接调试到SQL的数据的类,也是一个类。 Debug和MySQLConnection类工作正常,直到我前几天尝试使用Debug类实现SQL错误报告。

计划是,如果在SQL执行期间发生错误,MySQL类会向Debug报告,然后Debug将其格式化为使用MySQL类输入数据库。它输入的错误将是连接成功的地方。

所以我得到的如下:

<?php

class Debug
{
    private $MySQL

    function __construct()
    {
        #Pass the debug object to MySQL in case we need to report errors
        $this->MySQL = new MySQLConnection($this);
    }

    public function DebugMessage($message,$code,$typeid,$SQLObj = null)
    {
        $InsertArray = array(
            #Some data, takes into account the arguments for this function
        );

        #Connect to the database and insert the data. If the connection fails, false will be returned and handled by caller. If true, everything went as planned.
        return $this->MySQL->insert('debugproc',$InsertArray);

    }
}

class MySQLConnection extends MySQLConfiguration
{
    #MySQLConfiguration is just a class containing the connection information in a protected format

    private $Debugger;
    private $SQLConn;

    function __construct($Debug)
    {
        $this->Debugger = $Debug;
    }

    public function connect()
    {
        try
        {
#This is where I get the details from the global config.
            $this->SQLConn = new PDO("mysql:host=" . config['db']['host'] . ";dbname=" . config['db']['dbname'], config['db']['user'], config['db']['pass']);
            return true;
        }
        catch (PDOException $pdo)
        {
            echo $pdo->getMessage();
            return false;
        }
    }

    public function insert($query,$data)
    {
        if($this->connect())
        {
            try
            {
                #Prepare our insert using the MySQLConfiguration array. This stores the SQL queries.
                $prepare = $this->SQLConn->prepare($this->MySQLConfiguration[$query]);
                $result = $prepare->execute($data);
                if(!$result)
                {
                    echo "Failed to insert";
                    return false;
                }
                #Release resources and disconnect from SQL
                unset($prepare);
                $this->disconnect();
            }
            catch(PDOException $pdo)
            {
                echo $pdo->getMessage();
            }

        }
        else
        {
            return false;
        }

    }
}

?>

基本上,我所看到的是当我构造Debug时,调用MySQL,其中包含$ this,Debug对象。之后,它只是等待DebugMessage调用。当一个人到达时,应该调用到$ this-&gt; MySQL(MySQLConnection)来插入相关数据。由于我无法通过__construct对$ this-&gt; MySQL进行var_dump,所以当连接发生时我会回复,这确实发生了,并且连接成功。在建立连接时,我们应该在DebugMessage中看到$ this-&gt; MySQL的对象,但事实并非如此,这实际上是NULL!

我认为这可能是一个可见性问题,但是在Debug上下文中将$ MySQL设置为public时,在DebugMessage期间仍然将对象显示为NULL。

你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我发现这里的问题是MySQL对象中的一些错误处理。在建立连接之前,调用返回到DebugMessage,因此,在Debug上下文中对MySQL发出了null错误。

注释对DebugMessage的调用解决了null变量问题。

这一切归结为一个被连接的连接。断开连接时,在MySQLConnection的上下文中将变量设置为null。当它为null时,DebugMessage在执行连接之前被触发。

DOH!